summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/wasm/externref.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/wasm/externref.js')
-rw-r--r--deps/v8/test/mjsunit/wasm/externref.js242
1 files changed, 242 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/wasm/externref.js b/deps/v8/test/mjsunit/wasm/externref.js
new file mode 100644
index 0000000000..3b6b563731
--- /dev/null
+++ b/deps/v8/test/mjsunit/wasm/externref.js
@@ -0,0 +1,242 @@
+// Copyright 2018 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.
+
+// Flags: --expose-wasm --experimental-wasm-reftypes --expose-gc
+
+load("test/mjsunit/wasm/wasm-module-builder.js");
+
+(function testExternRefIdentityFunction() {
+ print(arguments.callee.name);
+ const builder = new WasmModuleBuilder();
+ builder.addFunction('main', kSig_r_r)
+ .addBody([kExprLocalGet, 0])
+ .exportFunc();
+
+
+ const instance = builder.instantiate();
+
+ let obj = {'hello' : 'world'};
+ assertEquals(obj, instance.exports.main(obj));
+ assertEquals(1234, instance.exports.main(1234));
+ assertEquals(123.4, instance.exports.main(123.4));
+ assertEquals(undefined, instance.exports.main(undefined));
+ assertEquals(null, instance.exports.main(null));
+ assertEquals(print, instance.exports.main(print));
+})();
+
+(function testPassExternRefToImportedFunction() {
+ print(arguments.callee.name);
+ const builder = new WasmModuleBuilder();
+ const sig_index = builder.addType(kSig_v_r);
+ const imp_index = builder.addImport("q", "func", sig_index);
+ builder.addFunction('main', sig_index)
+ .addBody([kExprLocalGet, 0,
+ kExprCallFunction, imp_index])
+ .exportFunc();
+
+ function checkFunction(value) {
+ assertEquals('world', value.hello);
+ }
+
+ const instance = builder.instantiate({q: {func: checkFunction}});
+
+ instance.exports.main({hello: 'world'});
+})();
+
+(function testPassExternRefWithGCWithLocals() {
+ print(arguments.callee.name);
+ const builder = new WasmModuleBuilder();
+ const ref_sig = builder.addType(kSig_v_r);
+ const void_sig = builder.addType(kSig_v_v);
+ const imp_index = builder.addImport("q", "func", ref_sig);
+ const gc_index = builder.addImport("q", "gc", void_sig);
+ // First call the gc, then check if the object still exists.
+ builder.addFunction('main', ref_sig)
+ .addLocals({externref_count: 10})
+ .addBody([
+ kExprLocalGet, 0, kExprLocalSet, 1, // Set local
+ kExprLocalGet, 0, kExprLocalSet, 2, // Set local
+ kExprLocalGet, 0, kExprLocalSet, 3, // Set local
+ kExprLocalGet, 0, kExprLocalSet, 4, // Set local
+ kExprLocalGet, 0, kExprLocalSet, 5, // Set local
+ kExprLocalGet, 0, kExprLocalSet, 6, // Set local
+ kExprLocalGet, 0, kExprLocalSet, 7, // Set local
+ kExprLocalGet, 0, kExprLocalSet, 8, // Set local
+ kExprLocalGet, 0, kExprLocalSet, 9, // Set local
+ kExprLocalGet, 0, kExprLocalSet, 10, // Set local
+ kExprCallFunction, gc_index, // call gc
+ kExprLocalGet, 9, kExprCallFunction, imp_index // call import
+ ])
+ .exportFunc();
+
+ function checkFunction(value) {
+ assertEquals('world', value.hello);
+ }
+
+ const instance = builder.instantiate({q: {func: checkFunction, gc: gc}});
+
+ instance.exports.main({hello: 'world'});
+})();
+
+(function testPassExternRefWithGC() {
+ print(arguments.callee.name);
+ const builder = new WasmModuleBuilder();
+ const ref_sig = builder.addType(kSig_v_r);
+ const void_sig = builder.addType(kSig_v_v);
+ const imp_index = builder.addImport("q", "func", ref_sig);
+ const gc_index = builder.addImport("q", "gc", void_sig);
+ // First call the gc, then check if the object still exists.
+ builder.addFunction('main', ref_sig)
+ .addBody([
+ kExprCallFunction, gc_index, // call gc
+ kExprLocalGet, 0, kExprCallFunction, imp_index // call import
+ ])
+ .exportFunc();
+
+ function checkFunction(value) {
+ assertEquals('world', value.hello);
+ }
+
+ const instance = builder.instantiate({q: {func: checkFunction, gc: gc}});
+
+ instance.exports.main({hello: 'world'});
+})();
+
+(function testPassExternRefWithGCWithStackParameters() {
+ print(arguments.callee.name);
+ const num_params = 15;
+ for (let index = 0; index < num_params; index++) {
+ const builder = new WasmModuleBuilder();
+ // Make a signature with {num_params} many externref parameters.
+ const mysig = makeSig(Array(num_params).fill(kWasmExternRef), []);
+ const main_sig = builder.addType(mysig);
+ const ref_sig = builder.addType(kSig_v_r);
+ const void_sig = builder.addType(kSig_v_v);
+ const imp_index = builder.addImport('q', 'func', ref_sig);
+ const gc_index = builder.addImport('q', 'gc', void_sig);
+ // First call the gc, then check if the object still exists.
+ builder.addFunction('main', main_sig)
+ .addBody([
+ kExprCallFunction, gc_index, // call gc
+ kExprLocalGet, index, kExprCallFunction, imp_index // call import
+ ])
+ .exportFunc();
+
+ function checkFunction(value) {
+ assertEquals(index, value.hello);
+ }
+
+ const instance = builder.instantiate({q: {func: checkFunction, gc: gc}});
+
+ // Pass {num_params} many parameters to main. Note that it is important
+ // that no other references to these objects exist. They are kept alive
+ // only through references stored in the parameters slots of a stack frame.
+ instance.exports.main(
+ {hello: 0}, {hello: 1}, {hello: 2}, {hello: 3}, {hello: 4}, {hello: 5},
+ {hello: 6}, {hello: 7}, {hello: 8}, {hello: 9}, {hello: 10},
+ {hello: 11}, {hello: 12}, {hello: 13}, {hello: 14});
+ }
+})();
+
+(function testPassExternRefWithGCInWrapper() {
+ print(arguments.callee.name);
+ const builder = new WasmModuleBuilder();
+ const kSig_r_iri = makeSig([kWasmI32, kWasmExternRef, kWasmI32], [kWasmExternRef]);
+ const sig_index = builder.addType(kSig_r_iri);
+ builder.addFunction('main', sig_index)
+ .addBody([kExprLocalGet, 1])
+ .exportFunc();
+
+ const instance = builder.instantiate();
+
+ const triggerGCParam = {
+ valueOf: () => {
+ gc();
+ return 17;
+ }
+ };
+
+ const result = instance.exports.main(triggerGCParam, {hello: 'world'}, triggerGCParam);
+ assertEquals('world', result.hello);
+})();
+
+(function testExternRefNull() {
+ print(arguments.callee.name);
+ const builder = new WasmModuleBuilder();
+ builder.addFunction('main', kSig_r_v)
+ .addBody([kExprRefNull, kWasmExternRef])
+ .exportFunc();
+
+ const instance = builder.instantiate();
+
+ assertEquals(null, instance.exports.main());
+})();
+
+(function testExternRefIsNull() {
+ print(arguments.callee.name);
+ const builder = new WasmModuleBuilder();
+ builder.addFunction('main', kSig_i_r)
+ .addBody([kExprLocalGet, 0, kExprRefIsNull])
+ .exportFunc();
+
+ const instance = builder.instantiate();
+
+ assertEquals(0, instance.exports.main({'hello' : 'world'}));
+ assertEquals(0, instance.exports.main(1234));
+ assertEquals(0, instance.exports.main(0));
+ assertEquals(0, instance.exports.main(123.4));
+ assertEquals(0, instance.exports.main(undefined));
+ assertEquals(1, instance.exports.main(null));
+ assertEquals(0, instance.exports.main(print));
+})();
+
+(function testExternRefNullIsNull() {
+ print(arguments.callee.name);
+
+ const builder = new WasmModuleBuilder();
+ builder.addFunction('main', kSig_i_v)
+ .addBody([kExprRefNull, kWasmExternRef, kExprRefIsNull])
+ .exportFunc();
+
+ const instance = builder.instantiate();
+
+ assertEquals(1, instance.exports.main());
+})();
+
+(function testExternRefLocalDefaultValue() {
+ print(arguments.callee.name);
+ const builder = new WasmModuleBuilder();
+ builder.addFunction('main', kSig_r_v)
+ .addBody([kExprLocalGet, 0])
+ .addLocals({externref_count: 1})
+ .exportFunc();
+
+ const instance = builder.instantiate();
+
+ assertEquals(null, instance.exports.main());
+})();
+
+(function testImplicitReturnNullAsExternRef() {
+ print(arguments.callee.name);
+ const builder = new WasmModuleBuilder();
+ const sig_index = builder.addType(kSig_r_v);
+ builder.addFunction('main', sig_index)
+ .addBody([kExprRefNull, kWasmExternRef])
+ .exportFunc();
+
+ const main = builder.instantiate().exports.main;
+ assertEquals(null, main());
+})();
+
+(function testExplicitReturnNullAsExternRef() {
+ print(arguments.callee.name);
+ const builder = new WasmModuleBuilder();
+ const sig_index = builder.addType(kSig_r_v);
+ builder.addFunction('main', sig_index)
+ .addBody([kExprRefNull, kWasmExternRef, kExprReturn])
+ .exportFunc();
+
+ const main = builder.instantiate().exports.main;
+ assertEquals(null, main());
+})();