| //@ 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) |
| } |