blob: 5c65716ebd2c93a9dd21b5786c85dc774ecfccb8 [file] [log] [blame]
//@ runWebAssemblySuite("--useWebAssemblyReferences=true")
import * as assert from '../assert.js';
import Builder from '../Builder.js';
{
const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
.Type().End()
.Function().End()
.Table()
.Table({initial: 0, maximum: 0, element: "anyref"})
.Table({initial: 20, maximum: 30, element: "anyref"})
.End()
.Export()
.Function("tbl_size")
.Table("tbl", 1)
.End()
.Code()
.Function("tbl_size", { params: [], ret: "i32" })
.TableSize(1)
.End()
.End().WebAssembly().get()));
fullGC()
assert.eq($1.exports.tbl_size(), 20)
assert.eq($1.exports.tbl.grow(5), 20)
assert.eq($1.exports.tbl_size(), 25)
assert.eq($1.exports.tbl.get(0), null)
assert.eq($1.exports.tbl.get(24), null)
}
assert.throws(() => new WebAssembly.Module((new Builder())
.Type().End()
.Function().End()
.Export()
.Function("tbl_size")
.End()
.Code()
.Function("tbl_size", { params: [], ret: "i32" })
.TableSize(0)
.End()
.End().WebAssembly().get()), Error, "WebAssembly.Module doesn't validate: table index 0 is invalid, limit is 0, in function at index 0 (evaluating 'new WebAssembly.Module')")
{
const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
.Type().End()
.Function().End()
.Table()
.Table({initial: 0, maximum: 0, element: "anyref"})
.Table({initial: 20, maximum: 30, element: "anyref"})
.End()
.Export()
.Function("tbl_size")
.Function("tbl_grow")
.Function("ident")
.Table("tbl", 1)
.End()
.Code()
.Function("tbl_size", { params: [], ret: "i32" })
.TableSize(1)
.End()
.Function("tbl_grow", { params: ["anyref", "i32"], ret: "i32" })
.GetLocal(0)
.GetLocal(1)
.TableGrow(1)
.End()
.Function("ident", { params: ["i32"], ret: "i32" })
.GetLocal(0)
.End()
.End().WebAssembly().get()));
fullGC()
assert.eq($1.exports.ident("hi"), 0)
assert.eq($1.exports.tbl_size(), 20)
assert.eq($1.exports.tbl_grow("hi", 5), 20)
assert.eq($1.exports.tbl_size(), 25)
assert.eq($1.exports.tbl.get(0), null)
assert.eq($1.exports.tbl.get(24), "hi")
assert.eq($1.exports.tbl_grow(null, 5), 25)
assert.eq($1.exports.tbl.get(24), "hi")
assert.eq($1.exports.tbl.get(25), null)
assert.eq($1.exports.tbl_size(), 30)
assert.eq($1.exports.tbl_grow(null, 0), -1)
assert.eq($1.exports.tbl_grow(null, 5), -1)
assert.eq($1.exports.tbl_grow(null, 0), -1)
}
assert.throws(() => new WebAssembly.Module((new Builder())
.Type().End()
.Function().End()
.Code()
.Function("tbl_grow", { params: ["anyref", "i32"], ret: "i32" })
.GetLocal(0)
.GetLocal(1)
.TableGrow(0)
.End()
.End().WebAssembly().get()), Error, "WebAssembly.Module doesn't validate: table index 0 is invalid, limit is 0, in function at index 0 (evaluating 'new WebAssembly.Module')")
assert.throws(() => new WebAssembly.Module((new Builder())
.Type().End()
.Function().End()
.Table()
.Table({initial: 20, maximum: 30, element: "anyref"})
.End()
.Code()
.Function("tbl_grow", { params: ["anyref", "i32"], ret: "i32" })
.GetLocal(0)
.TableGrow(0)
.End()
.End().WebAssembly().get()), Error, "WebAssembly.Module doesn't parse at byte 6: can't pop empty stack in table.grow, in function at index 0 (evaluating 'new WebAssembly.Module')")
assert.throws(() => new WebAssembly.Module((new Builder())
.Type().End()
.Function().End()
.Table()
.Table({initial: 20, maximum: 30, element: "anyref"})
.End()
.Code()
.Function("tbl_grow", { params: ["i32", "i32"], ret: "i32" })
.GetLocal(0)
.GetLocal(1)
.TableGrow(0)
.End()
.End().WebAssembly().get()), Error, "WebAssembly.Module doesn't validate: table.grow expects fill value of type Anyref got I32, in function at index 0 (evaluating 'new WebAssembly.Module')")
{
const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
.Type().End()
.Function().End()
.Table()
.Table({initial: 20, maximum: 30, element: "anyref"})
.End()
.Export()
.Function("tbl_size")
.Function("tbl_fill")
.Table("tbl", 0)
.End()
.Code()
.Function("tbl_size", { params: [], ret: "i32" })
.TableSize(0)
.End()
.Function("tbl_fill", { params: ["i32", "anyref", "i32"], ret: "void" })
.GetLocal(0)
.GetLocal(1)
.GetLocal(2)
.TableFill(0)
.End()
.End().WebAssembly().get()));
fullGC()
assert.eq($1.exports.tbl_size(), 20)
$1.exports.tbl_fill(1,"hi",3)
assert.eq($1.exports.tbl.get(0), null)
assert.eq($1.exports.tbl.get(1), "hi")
assert.eq($1.exports.tbl.get(2), "hi")
assert.eq($1.exports.tbl.get(3), "hi")
assert.eq($1.exports.tbl.get(4), null)
$1.exports.tbl_fill(0,null,1)
assert.eq($1.exports.tbl.get(0), null)
$1.exports.tbl_fill(0,null,0)
$1.exports.tbl_fill(19,"test",1)
assert.eq($1.exports.tbl.get(19), "test")
assert.eq($1.exports.tbl.get(18), null)
assert.throws(() => $1.exports.tbl_fill(20,null,0), Error, "Out of bounds table access (evaluating 'func(...args)')")
assert.throws(() => $1.exports.tbl_fill(20,null,1), Error, "Out of bounds table access (evaluating 'func(...args)')")
assert.throws(() => $1.exports.tbl_fill(19,null,2), Error, "Out of bounds table access (evaluating 'func(...args)')")
assert.throws(() => $1.exports.tbl_fill(4294967295,null,1), Error, "Out of bounds table access (evaluating 'func(...args)')")
}
assert.throws(() => new WebAssembly.Module((new Builder())
.Type().End()
.Function().End()
.Code()
.Function("tbl_grow", { params: ["anyref", "i32"], ret: "void" })
.GetLocal(1)
.GetLocal(0)
.GetLocal(1)
.TableFill(0)
.End()
.End().WebAssembly().get()), Error, "WebAssembly.Module doesn't validate: table index 0 is invalid, limit is 0, in function at index 0 (evaluating 'new WebAssembly.Module')")
assert.throws(() => new WebAssembly.Module((new Builder())
.Type().End()
.Function().End()
.Table()
.Table({initial: 20, maximum: 30, element: "anyref"})
.End()
.Code()
.Function("tbl_grow", { params: ["anyref", "i32"], ret: "i32" })
.GetLocal(0)
.TableFill(0)
.End()
.End().WebAssembly().get()), Error, "WebAssembly.Module doesn't parse at byte 6: can't pop empty stack in table.fill, in function at index 0 (evaluating 'new WebAssembly.Module')")
{
const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
.Type().End()
.Function().End()
.Table()
.Table({initial: 0, maximum: 0, element: "funcref"})
.Table({initial: 20, maximum: 30, element: "funcref"})
.End()
.Export()
.Function("tbl_size")
.Function("tbl_grow")
.Table("tbl", 1)
.End()
.Code()
.Function("tbl_size", { params: [], ret: "i32" })
.TableSize(1)
.End()
.Function("tbl_grow", { params: ["i32"], ret: "i32" })
.I32Const(0)
.TableGet(1)
.GetLocal(0)
.TableGrow(1)
.End()
.End().WebAssembly().get()));
fullGC()
$1.exports.tbl.set(0, $1.exports.tbl_size);
assert.eq($1.exports.tbl_size(), 20)
assert.eq($1.exports.tbl_grow(5), 20)
assert.eq($1.exports.tbl_size(), 25)
assert.eq($1.exports.tbl.get(0), $1.exports.tbl_size)
assert.eq($1.exports.tbl.get(1), null)
assert.eq($1.exports.tbl.get(24), $1.exports.tbl_size)
}