| Index: test/mjsunit/wasm/compiled-module-serialization.js
|
| diff --git a/test/mjsunit/wasm/compiled-module-serialization.js b/test/mjsunit/wasm/compiled-module-serialization.js
|
| index 54858a78e3e8e9e6a1b6f7ab54bf74bbca809628..80840e35351caf8f2da9f69e0388c24528942e2d 100644
|
| --- a/test/mjsunit/wasm/compiled-module-serialization.js
|
| +++ b/test/mjsunit/wasm/compiled-module-serialization.js
|
| @@ -37,16 +37,9 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
|
|
|
| var wire_bytes = builder.toBuffer();
|
| var module = new WebAssembly.Module(wire_bytes);
|
| - var buff = %SerializeWasmModule(module);
|
| - module = null;
|
| - gc();
|
| - module = %DeserializeWasmModule(buff, wire_bytes);
|
| -
|
| var mem_1 = new WebAssembly.Memory({initial: 1});
|
| var view_1 = new Int32Array(mem_1.buffer);
|
| -
|
| view_1[0] = 42;
|
| -
|
| var outval_1;
|
| var i1 = new WebAssembly.Instance(module, {"":
|
| {some_value: () => 1,
|
| @@ -57,6 +50,28 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
|
| assertEquals(43, i1.exports.main(0));
|
|
|
| assertEquals(42, outval_1);
|
| + var buff = %SerializeWasmModule(module);
|
| + module = null;
|
| + gc();
|
| + module = %DeserializeWasmModule(buff, wire_bytes);
|
| +
|
| + var mem_2 = new WebAssembly.Memory({initial: 2});
|
| + var view_2 = new Int32Array(mem_2.buffer);
|
| +
|
| + view_2[0] = 50;
|
| +
|
| + var outval_2;
|
| + var i2 = new WebAssembly.Instance(module, {"":
|
| + {some_value: () => 1,
|
| + writer: (x) => outval_2 = x ,
|
| + memory: mem_2}
|
| + });
|
| +
|
| + assertEquals(51, i2.exports.main(0));
|
| +
|
| + assertEquals(50, outval_2);
|
| + // The instances don't share memory through deserialization.
|
| + assertEquals(43, i1.exports.main(0));
|
| })();
|
|
|
| (function DeserializeInvalidObject() {
|
| @@ -103,3 +118,128 @@ load("test/mjsunit/wasm/wasm-module-builder.js");
|
| var instance3 = new WebAssembly.Instance(clone);
|
| assertFalse(instance3 == undefined);
|
| })();
|
| +
|
| +
|
| +(function SerializeAfterInstantiationWithMemory() {
|
| + let builder = new WasmModuleBuilder();
|
| + builder.addImportedMemory("", "memory", 1);
|
| + builder.addFunction("main", kSig_i_v)
|
| + .addBody([kExprI32Const, 42])
|
| + .exportFunc();
|
| +
|
| + var wire_bytes = builder.toBuffer()
|
| + var compiled_module = new WebAssembly.Module(wire_bytes);
|
| + var mem_1 = new WebAssembly.Memory({initial: 1});
|
| + var ffi = {"":{memory:mem_1}};
|
| + var instance1 = new WebAssembly.Instance(compiled_module, ffi);
|
| + var serialized = %SerializeWasmModule(compiled_module);
|
| + var clone = %DeserializeWasmModule(serialized, wire_bytes);
|
| +
|
| + assertNotNull(clone);
|
| + assertFalse(clone == undefined);
|
| + assertFalse(clone == compiled_module);
|
| + assertEquals(clone.constructor, compiled_module.constructor);
|
| + var instance2 = new WebAssembly.Instance(clone, ffi);
|
| + assertFalse(instance2 == undefined);
|
| +})();
|
| +
|
| +(function GlobalsArePrivateBetweenClones() {
|
| + var builder = new WasmModuleBuilder();
|
| + builder.addGlobal(kWasmI32, true);
|
| + builder.addFunction("read", kSig_i_v)
|
| + .addBody([
|
| + kExprGetGlobal, 0])
|
| + .exportFunc();
|
| +
|
| + builder.addFunction("write", kSig_v_i)
|
| + .addBody([
|
| + kExprGetLocal, 0,
|
| + kExprSetGlobal, 0])
|
| + .exportFunc();
|
| +
|
| + var wire_bytes = builder.toBuffer();
|
| + var module = new WebAssembly.Module(wire_bytes);
|
| + var i1 = new WebAssembly.Instance(module);
|
| + // serialize and replace module
|
| + var buff = %SerializeWasmModule(module);
|
| + var module_clone = %DeserializeWasmModule(buff, wire_bytes);
|
| + var i2 = new WebAssembly.Instance(module_clone);
|
| + i1.exports.write(1);
|
| + i2.exports.write(2);
|
| + assertEquals(1, i1.exports.read());
|
| + assertEquals(2, i2.exports.read());
|
| +})();
|
| +
|
| +(function SharedTableTest() {
|
| + let kTableSize = 3;
|
| + var sig_index1;
|
| +
|
| + function MakeTableExportingModule(constant) {
|
| + // A module that defines a table and exports it.
|
| + var builder = new WasmModuleBuilder();
|
| + builder.addType(kSig_i_i);
|
| + builder.addType(kSig_i_ii);
|
| + sig_index1 = builder.addType(kSig_i_v);
|
| + var f1 = builder.addFunction("f1", sig_index1)
|
| + .addBody([kExprI32Const, constant]);
|
| +
|
| + builder.addFunction("main", kSig_i_ii)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprCallIndirect, sig_index1, kTableZero]) // --
|
| + .exportAs("main");
|
| +
|
| + builder.setFunctionTableLength(kTableSize);
|
| + builder.addFunctionTableInit(0, false, [f1.index]);
|
| + builder.addExportOfKind("table", kExternalTable, 0);
|
| +
|
| + return new WebAssembly.Module(builder.toBuffer());
|
| + }
|
| + var m1 = MakeTableExportingModule(11);
|
| +
|
| + // Module {m2} imports the table and adds {f2}.
|
| + var builder = new WasmModuleBuilder();
|
| + builder.addType(kSig_i_ii);
|
| + var sig_index2 = builder.addType(kSig_i_v);
|
| + var f2 = builder.addFunction("f2", sig_index2)
|
| + .addBody([kExprI32Const, 22]);
|
| +
|
| + builder.addFunction("main", kSig_i_ii)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprCallIndirect, sig_index2, kTableZero]) // --
|
| + .exportAs("main");
|
| +
|
| + builder.addImportedTable("z", "table", kTableSize, kTableSize);
|
| + builder.addFunctionTableInit(1, false, [f2.index], true);
|
| + var m2_bytes = builder.toBuffer();
|
| + var m2 = new WebAssembly.Module(m2_bytes);
|
| +
|
| + assertFalse(sig_index1 == sig_index2);
|
| +
|
| + var i1 = new WebAssembly.Instance(m1);
|
| + var i2 = new WebAssembly.Instance(m2, {z: {table: i1.exports.table}});
|
| +
|
| + var serialized_m2 = %SerializeWasmModule(m2);
|
| + var m2_clone = %DeserializeWasmModule(serialized_m2, m2_bytes);
|
| +
|
| + var m3 = MakeTableExportingModule(33);
|
| + var i3 = new WebAssembly.Instance(m3);
|
| + var i2_prime = new WebAssembly.Instance(m2_clone,
|
| + {z: {table: i3.exports.table}});
|
| +
|
| + assertEquals(11, i1.exports.main(0));
|
| + assertEquals(11, i2.exports.main(0));
|
| +
|
| + assertEquals(22, i1.exports.main(1));
|
| + assertEquals(22, i2.exports.main(1));
|
| +
|
| + assertEquals(33, i3.exports.main(0));
|
| + assertEquals(33, i2_prime.exports.main(0));
|
| +
|
| + assertThrows(() => i1.exports.main(2));
|
| + assertThrows(() => i2.exports.main(2));
|
| + assertThrows(() => i1.exports.main(3));
|
| + assertThrows(() => i2.exports.main(3));
|
| +
|
| +})();
|
|
|