// 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: --allow-natives-syntax --no-wasm-disable-structured-cloning load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-module-builder.js"); (function TestPostInterpretedModule() { let builder = new WasmModuleBuilder(); let add = builder.addFunction("add", kSig_i_ii) .addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprI32Add]) .exportFunc(); let module = builder.toModule(); let instance = new WebAssembly.Instance(module); let exp = instance.exports; let workerScript = ` var instance = null; onmessage = function(message) { try { if (message.command == 'module') { instance = new WebAssembly.Instance(message.module); postMessage('OK'); } if (message.command == 'call') { let result = instance.exports.add(40, 2); postMessage(result); } } catch(e) { postMessage('ERROR: ' + e); } } `; let worker = new Worker(workerScript, {type: 'string'}); // Call method without using the interpreter. var initial_interpreted = %WasmNumInterpretedCalls(instance); assertEquals(23, exp.add(20, 3)); assertEquals(initial_interpreted + 0, %WasmNumInterpretedCalls(instance)); // Send module to the worker, still not interpreting. worker.postMessage({ command:'module', module:module }); assertEquals('OK', worker.getMessage()); worker.postMessage({ command:'call' }); assertEquals(42, worker.getMessage()); assertEquals(initial_interpreted + 0, %WasmNumInterpretedCalls(instance)); // Switch to the interpreter and call method. %RedirectToWasmInterpreter(instance, add.index); assertEquals(23, exp.add(20, 3)); assertEquals(initial_interpreted + 1, %WasmNumInterpretedCalls(instance)); // Let worker call interpreted function. worker.postMessage({ command:'call' }); assertEquals(42, worker.getMessage()); assertEquals(initial_interpreted + 1, %WasmNumInterpretedCalls(instance)); // All done. worker.terminate(); })();