| // 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. |
| |
| // Flags: --experimental-wasm-compilation-hints --wasm-lazy-validation |
| |
| load('test/mjsunit/wasm/wasm-module-builder.js'); |
| |
| (function testInterpreterCallsLazyFunctionInOtherInstance() { |
| print(arguments.callee.name); |
| let builder0 = new WasmModuleBuilder(); |
| builder0.addFunction("getX", kSig_i_v) |
| .addBody([kExprI32Const, 42]) |
| .setCompilationHint(kCompilationHintStrategyLazy, |
| kCompilationHintTierBaseline, |
| kCompilationHintTierBaseline) |
| .exportFunc(); |
| let builder1 = new WasmModuleBuilder(); |
| builder1.addImport("otherModule", "getX", kSig_i_v); |
| builder1.addFunction("plusX", kSig_i_i) |
| .addBody([kExprCallFunction, 0, |
| kExprGetLocal, 0, |
| kExprI32Add]) |
| .setCompilationHint(kCompilationHintStrategyLazy, |
| kCompilationHintTierInterpreter, |
| kCompilationHintTierInterpreter) |
| .exportFunc(); |
| let instance0 = builder0.instantiate(); |
| let instance1 = builder1.instantiate( |
| {otherModule: {getX: instance0.exports.getX}}); |
| assertEquals(46, instance1.exports.plusX(4)); |
| })(); |
| |
| (function testInterpreterCallsLazyBadFunctionInOtherInstance() { |
| print(arguments.callee.name); |
| let builder0 = new WasmModuleBuilder(); |
| builder0.addFunction("getX", kSig_i_v) |
| .addBody([kExprI64Const, 42]) |
| .setCompilationHint(kCompilationHintStrategyLazy, |
| kCompilationHintTierBaseline, |
| kCompilationHintTierBaseline) |
| .exportFunc(); |
| let builder1 = new WasmModuleBuilder(); |
| builder1.addImport("otherModule", "getX", kSig_i_v); |
| builder1.addFunction("plusX", kSig_i_i) |
| .addBody([kExprCallFunction, 0, |
| kExprGetLocal, 0, |
| kExprI32Add]) |
| .setCompilationHint(kCompilationHintStrategyLazy, |
| kCompilationHintTierInterpreter, |
| kCompilationHintTierInterpreter) |
| .exportFunc(); |
| let instance0 = builder0.instantiate(); |
| let instance1 = builder1.instantiate( |
| {otherModule: {getX: instance0.exports.getX}}); |
| assertThrows(() => instance1.exports.plusX(4), |
| WebAssembly.CompileError, |
| "Compiling function #0:\"getX\" failed: type error in " + |
| "merge[0] (expected i32, got i64) @+57"); |
| })(); |
| |
| (function testInterpreterCallsLazyFunctionThroughIndirection() { |
| print(arguments.callee.name); |
| let builder = new WasmModuleBuilder(); |
| let sig_i_ii = builder.addType(kSig_i_ii); |
| let add = builder.addFunction('add', sig_i_ii) |
| .addBody([kExprGetLocal, 0, |
| kExprGetLocal, 1, |
| kExprI32Add]) |
| .setCompilationHint(kCompilationHintStrategyLazy, |
| kCompilationHintTierInterpreter, |
| kCompilationHintTierInterpreter); |
| builder.appendToTable([add.index]); |
| builder.addFunction('main', kSig_i_iii) |
| .addBody([// Call indirect #0 with args <#1, #2>. |
| kExprGetLocal, 1, |
| kExprGetLocal, 2, |
| kExprGetLocal, 0, |
| kExprCallIndirect, sig_i_ii, kTableZero]) |
| .setCompilationHint(kCompilationHintStrategyLazy, |
| kCompilationHintTierInterpreter, |
| kCompilationHintTierInterpreter) |
| .exportFunc(); |
| assertEquals(99, builder.instantiate().exports.main(0, 22, 77)); |
| })(); |
| |
| (function testInterpreterCallsLazyBadFunctionThroughIndirection() { |
| print(arguments.callee.name); |
| let builder = new WasmModuleBuilder(); |
| let sig_i_ii = builder.addType(kSig_i_ii); |
| let add = builder.addFunction('add', sig_i_ii) |
| .addBody([kExprGetLocal, 0, |
| kExprGetLocal, 1, |
| kExprI64Add]) |
| .setCompilationHint(kCompilationHintStrategyLazy, |
| kCompilationHintTierInterpreter, |
| kCompilationHintTierInterpreter); |
| builder.appendToTable([add.index]); |
| builder.addFunction('main', kSig_i_iii) |
| .addBody([// Call indirect #0 with args <#1, #2>. |
| kExprGetLocal, 1, |
| kExprGetLocal, 2, |
| kExprGetLocal, 0, |
| kExprCallIndirect, sig_i_ii, kTableZero]) |
| .setCompilationHint(kCompilationHintStrategyLazy, |
| kCompilationHintTierInterpreter, |
| kCompilationHintTierInterpreter) |
| .exportFunc(); |
| assertThrows(() => builder.instantiate().exports.main(0, 22, 77), |
| WebAssembly.CompileError, |
| "Compiling function #0:\"add\" failed: i64.add[1] expected " + |
| "type i64, found local.get of type i32 @+83"); |
| })(); |