| // Copyright 2015 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 --allow-natives-syntax --expose-gc |
| |
| load("test/mjsunit/wasm/wasm-constants.js"); |
| load("test/mjsunit/wasm/wasm-module-builder.js"); |
| |
| (function SerializeAndDeserializeModule() { |
| var builder = new WasmModuleBuilder(); |
| builder.addMemory(1,1, true); |
| var kSig_v_i = makeSig([kAstI32], []); |
| var signature = builder.addType(kSig_v_i); |
| builder.addImport("some_value", kSig_i); |
| builder.addImport("writer", signature); |
| |
| builder.addFunction("main", kSig_i_i) |
| .addBody([ |
| kExprGetLocal, 0, |
| kExprI32LoadMem, 0, 0, |
| kExprI32Const, 1, |
| kExprCallIndirect, signature, |
| kExprGetLocal,0, |
| kExprI32LoadMem,0, 0, |
| kExprCallFunction, 0, |
| kExprI32Add |
| ]).exportFunc(); |
| |
| // writer(mem[i]); |
| // return mem[i] + some_value(); |
| builder.addFunction("_wrap_writer", signature) |
| .addBody([ |
| kExprGetLocal, 0, |
| kExprCallFunction, 1]); |
| builder.appendToTable([2, 3]); |
| |
| |
| var module = new WebAssembly.Module(builder.toBuffer()); |
| var buff = %SerializeWasmModule(module); |
| module = null; |
| gc(); |
| module = %DeserializeWasmModule(buff); |
| |
| var mem_1 = new ArrayBuffer(4); |
| var view_1 = new Int32Array(mem_1); |
| |
| view_1[0] = 42; |
| |
| var outval_1; |
| var i1 = new WebAssembly.Instance(module, {some_value: () => 1, |
| writer: (x)=>outval_1 = x }, mem_1); |
| |
| assertEquals(43, i1.exports.main(0)); |
| |
| assertEquals(42, outval_1); |
| })(); |
| |
| (function DeserializeInvalidObject() { |
| var invalid_buffer = new ArrayBuffer(10); |
| |
| module = %DeserializeWasmModule(invalid_buffer); |
| assertEquals(module, undefined); |
| })(); |
| |
| (function RelationBetweenModuleAndClone() { |
| let builder = new WasmModuleBuilder(); |
| builder.addFunction("main", kSig_i) |
| .addBody([kExprI8Const, 42]) |
| .exportFunc(); |
| |
| var compiled_module = new WebAssembly.Module(builder.toBuffer()); |
| var serialized = %SerializeWasmModule(compiled_module); |
| var clone = %DeserializeWasmModule(serialized); |
| |
| assertNotNull(clone); |
| assertFalse(clone == undefined); |
| assertFalse(clone == compiled_module); |
| assertEquals(clone.constructor, compiled_module.constructor); |
| })(); |
| |
| (function SerializeAfterInstantiation() { |
| let builder = new WasmModuleBuilder(); |
| builder.addFunction("main", kSig_i) |
| .addBody([kExprI8Const, 42]) |
| .exportFunc(); |
| |
| var compiled_module = new WebAssembly.Module(builder.toBuffer()); |
| var instance1 = new WebAssembly.Instance(compiled_module); |
| var instance2 = new WebAssembly.Instance(compiled_module); |
| var serialized = %SerializeWasmModule(compiled_module); |
| var clone = %DeserializeWasmModule(serialized); |
| |
| assertNotNull(clone); |
| assertFalse(clone == undefined); |
| assertFalse(clone == compiled_module); |
| assertEquals(clone.constructor, compiled_module.constructor); |
| var instance3 = new WebAssembly.Instance(clone); |
| assertFalse(instance3 == undefined); |
| })(); |