// 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-test-streaming d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); (function testInstantiateStreamingWithLazyHint() { print(arguments.callee.name); let builder = new WasmModuleBuilder(); builder.addImport('mod', 'pow', kSig_i_ii); builder.addFunction('upow', kSig_i_i) .addBody([kExprLocalGet, 0, kExprLocalGet, 0, kExprCallFunction, 0]) builder.addFunction('upow2', kSig_i_i) .addBody([kExprLocalGet, 0, kExprLocalGet, 0, kExprCallFunction, 0]) .setCompilationHint(kCompilationHintStrategyLazy, kCompilationHintTierDefault, kCompilationHintTierDefault) .exportFunc(); let bytes = builder.toBuffer(); assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes), {mod: {pow: Math.pow}}) .then(({module, instance}) => assertEquals(27, instance.exports.upow2(3)))); })(); (function testInstantiateStreamingWithBadLazyHint() { print(arguments.callee.name); let builder = new WasmModuleBuilder(); builder.addImport('mod', 'pow', kSig_i_ii); builder.addFunction('upow', kSig_i_i) .addBody([kExprLocalGet, 0, kExprLocalGet, 0, kExprCallFunction, 0]) builder.addFunction('upow2', kSig_i_i) .addBody([kExprLocalGet, 0, kExprLocalGet, 0, kExprCallFunction, 0]) .setCompilationHint(kCompilationHintStrategyLazy, kCompilationHintTierOptimized, kCompilationHintTierBaseline) .exportFunc(); let bytes = builder.toBuffer(); assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes), {mod: {pow: Math.pow}}) .then(assertUnreachable, error => assertEquals("WebAssembly.instantiateStreaming(): Invalid " + "compilation hint 0x19 (forbidden downgrade) " + "@+78", error.message))); })(); (function testInstantiateStreamingWithBadLazyFunctionBody() { print(arguments.callee.name); let builder = new WasmModuleBuilder(); builder.addImport('mod', 'pow', kSig_f_ff); builder.addFunction('upow', kSig_i_i) .addBody([kExprLocalGet, 0, kExprLocalGet, 0, kExprCallFunction, 0]) builder.addFunction('upow2', kSig_i_i) .addBody([kExprLocalGet, 0, kExprLocalGet, 0, kExprCallFunction, 0]) .setCompilationHint(kCompilationHintStrategyLazy, kCompilationHintTierDefault, kCompilationHintTierDefault) .exportFunc(); let bytes = builder.toBuffer(); assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes), {mod: {pow: Math.pow}}) .then(assertUnreachable, error => assertEquals("WebAssembly.instantiateStreaming(): call[0] " + "expected type f32, found local.get of type " + "i32 @+92", error.message))); })(); (function testInstantiateStreamingEmptyModule() { print(arguments.callee.name); let builder = new WasmModuleBuilder(); builder.addImport('mod', 'pow', kSig_i_ii); let bytes = builder.toBuffer(); assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes), {mod: {pow: Math.pow}})); })(); (function testInstantiateStreamingLazyModule() { print(arguments.callee.name); let builder = new WasmModuleBuilder(); builder.addImport('mod', 'pow', kSig_i_ii); builder.addFunction('upow', kSig_i_i) .addBody([kExprLocalGet, 0, kExprLocalGet, 0, kExprCallFunction, 0]) .setCompilationHint(kCompilationHintStrategyLazy, kCompilationHintTierDefault, kCompilationHintTierDefault) .exportFunc(); let bytes = builder.toBuffer(); assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes), {mod: {pow: Math.pow}}) .then(({module, instance}) => assertEquals(27, instance.exports.upow(3)))); })(); (function testInstantiateStreamingLazyBaselineModule() { print(arguments.callee.name); let builder = new WasmModuleBuilder(); builder.addImport('mod', 'pow', kSig_i_ii); builder.addFunction('upow', kSig_i_i) .addBody([kExprLocalGet, 0, kExprLocalGet, 0, kExprCallFunction, 0]) .setCompilationHint(kCompilationHintStrategyLazyBaselineEagerTopTier, kCompilationHintTierDefault, kCompilationHintTierDefault) .exportFunc(); let bytes = builder.toBuffer(); assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes), {mod: {pow: Math.pow}}) .then(({module, instance}) => assertEquals(27, instance.exports.upow(3)))); })();