272e5a8766
The wasm serialization format only contains TurboFan code. All other functions are only represented by placeholders. With this CL serialization fails if the serialized module does not contain any TurboFan functions and would therefore consist only of placeholders. This is a defense in depth approach, because ideally serialization only gets triggered when TurboFan code is available. However, in some scenarios like debugging it can happen that modules without TurboFan code get serialized. Bug: v8:12281 Change-Id: Ib05430ff89eb2317da80fc0d086ce1d7ab0e919d Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3212510 Commit-Queue: Andreas Haas <ahaas@chromium.org> Reviewed-by: Jakob Kummerow <jkummerow@chromium.org> Cr-Commit-Position: refs/heads/main@{#77715}
76 lines
2.2 KiB
JavaScript
76 lines
2.2 KiB
JavaScript
// 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.
|
|
|
|
// The test needs --no-liftoff because we can't serialize and deserialize
|
|
// Liftoff code.
|
|
// Flags: --wasm-lazy-compilation --allow-natives-syntax --expose-gc
|
|
// Flags: --no-liftoff
|
|
|
|
d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
|
|
|
|
(function SerializeUncompiledModule() {
|
|
print(arguments.callee.name);
|
|
const [wire_bytes, i1, buff] = (function GenerateInstance() {
|
|
const builder = new WasmModuleBuilder();
|
|
|
|
// Add 20 functions.
|
|
for (let i = 0; i < 20; ++i) {
|
|
builder.addFunction('f' + i, kSig_i_i)
|
|
.addBody([kExprI32Const, i])
|
|
.exportFunc();
|
|
}
|
|
|
|
const wire_bytes = builder.toBuffer();
|
|
const module = new WebAssembly.Module(wire_bytes);
|
|
// Run one function so that serialization happens.
|
|
let instance = new WebAssembly.Instance(module);
|
|
instance.exports.f3();
|
|
const buff = %SerializeWasmModule(module);
|
|
return [wire_bytes, instance, buff];
|
|
})();
|
|
|
|
gc();
|
|
const module = %DeserializeWasmModule(buff, wire_bytes);
|
|
|
|
const i2 = new WebAssembly.Instance(module);
|
|
|
|
assertEquals(13, i2.exports.f13());
|
|
assertEquals(11, i1.exports.f11());
|
|
})();
|
|
|
|
(function SerializePartlyCompiledModule() {
|
|
print(arguments.callee.name);
|
|
const [wire_bytes, i1, buff] = (function GenerateInstance() {
|
|
const builder = new WasmModuleBuilder();
|
|
|
|
// Add 20 functions.
|
|
for (let i = 0; i < 20; ++i) {
|
|
builder.addFunction('f' + i, kSig_i_i)
|
|
.addBody([kExprI32Const, i])
|
|
.exportFunc();
|
|
}
|
|
|
|
const wire_bytes = builder.toBuffer();
|
|
const module = new WebAssembly.Module(wire_bytes);
|
|
const i1 = new WebAssembly.Instance(module);
|
|
// Run one function so that serialization happens.
|
|
i1.exports.f3();
|
|
const buff = %SerializeWasmModule(module);
|
|
|
|
assertEquals(2, i1.exports.f2());
|
|
assertEquals(11, i1.exports.f11());
|
|
|
|
return [wire_bytes, i1, buff];
|
|
})();
|
|
|
|
gc();
|
|
const module = %DeserializeWasmModule(buff, wire_bytes);
|
|
|
|
const i2 = new WebAssembly.Instance(module);
|
|
|
|
assertEquals(13, i2.exports.f13());
|
|
assertEquals(11, i1.exports.f11());
|
|
assertEquals(9, i1.exports.f9());
|
|
})();
|