| // Copyright 2019 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| load("test/mjsunit/wasm/wasm-module-builder.js"); |
| |
| (function testTableGetNonExportedFunction() { |
| print(arguments.callee.name); |
| const builder = new WasmModuleBuilder(); |
| const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table"); |
| const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]); |
| const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]); |
| const offset = 3; |
| builder.addElementSegment(0, offset, false, [f1.index, f2.index]); |
| |
| const instance = builder.instantiate(); |
| |
| const table_function2 = instance.exports.table.get(offset + 1); |
| assertEquals(22, table_function2()); |
| })(); |
| |
| (function testTableGetExportedFunction() { |
| print(arguments.callee.name); |
| const builder = new WasmModuleBuilder(); |
| const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table"); |
| const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]); |
| const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]) |
| .exportAs("f2"); |
| const offset = 3; |
| builder.addElementSegment(0, offset, false, [f1.index, f2.index]); |
| |
| const instance = builder.instantiate(); |
| |
| const table_function2 = instance.exports.table.get(offset + 1); |
| assertEquals(22, table_function2()); |
| })(); |
| |
| (function testTableGetOverlappingSegments() { |
| print(arguments.callee.name); |
| const builder = new WasmModuleBuilder(); |
| const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table"); |
| const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]); |
| const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]); |
| const offset = 3; |
| builder.addElementSegment(0, offset, false, [f1.index, f2.index]); |
| builder.addElementSegment(0, offset + 1, false, [f1.index, f2.index]); |
| |
| const instance = builder.instantiate(); |
| |
| const table_function1 = instance.exports.table.get(offset + 1); |
| assertEquals(11, table_function1()); |
| })(); |
| |
| (function testTableGetUniqueWrapperExportedFunction() { |
| print(arguments.callee.name); |
| const builder = new WasmModuleBuilder(); |
| const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table"); |
| const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]).exportAs("f1"); |
| const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]); |
| const offset = 3; |
| builder.addElementSegment(0, offset, false, [f1.index, f1.index, f1.index]); |
| |
| const instance = builder.instantiate(); |
| |
| assertEquals(undefined, instance.exports.f1.tag); |
| const my_tag = { hello: 15 }; |
| instance.exports.f1.tag = my_tag; |
| |
| assertSame(my_tag, instance.exports.table.get(offset).tag); |
| assertSame(my_tag, instance.exports.table.get(offset + 1).tag); |
| assertSame(my_tag, instance.exports.table.get(offset + 2).tag); |
| })(); |
| |
| (function testTableGetUniqueWrapperNonExportedFunction() { |
| print(arguments.callee.name); |
| const builder = new WasmModuleBuilder(); |
| const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table"); |
| const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]); |
| const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]); |
| const offset = 3; |
| builder.addElementSegment(0, offset, false, [f1.index, f1.index, f1.index]); |
| |
| const instance = builder.instantiate(); |
| |
| assertEquals(undefined, instance.exports.table.get(offset).tag); |
| const my_tag = { hello: 15 }; |
| instance.exports.table.get(offset).tag = my_tag; |
| |
| assertSame(my_tag, instance.exports.table.get(offset + 1).tag); |
| assertSame(my_tag, instance.exports.table.get(offset + 2).tag); |
| })(); |
| |
| (function testTableGetEmptyValue() { |
| print(arguments.callee.name); |
| const builder = new WasmModuleBuilder(); |
| const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table"); |
| const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]); |
| const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]); |
| const offset = 3; |
| builder.addElementSegment(0, offset, false, [f1.index, f1.index, f1.index]); |
| |
| const instance = builder.instantiate(); |
| assertEquals(null, instance.exports.table.get(offset - 1)); |
| })(); |
| |
| (function testTableGetOOB() { |
| print(arguments.callee.name); |
| const builder = new WasmModuleBuilder(); |
| const size = 20; |
| const table = builder.addTable(kWasmAnyFunc, size).exportAs("table"); |
| const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]); |
| const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]); |
| const offset = 3; |
| builder.addElementSegment(0, offset, false, [f1.index, f1.index, f1.index]); |
| |
| const instance = builder.instantiate(); |
| assertThrows(() => instance.exports.table.get(size + 3), RangeError); |
| })(); |
| |
| (function testTableGetImportedFunction() { |
| print(arguments.callee.name); |
| const builder = new WasmModuleBuilder(); |
| const size = 20; |
| const table = builder.addTable(kWasmAnyFunc, size).exportAs("table"); |
| const import1 = builder.addImport("q", "fun", kSig_i_ii); |
| const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]); |
| const offset = 3; |
| builder.addElementSegment(0, offset, false, [f1.index, import1]); |
| |
| const instance = builder.instantiate({q: {fun: () => 33}}); |
| assertEquals(33, instance.exports.table.get(offset + 1)()); |
| })(); |