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}
51 lines
1.5 KiB
JavaScript
51 lines
1.5 KiB
JavaScript
// Copyright 2021 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: --allow-natives-syntax --wasm-lazy-compilation --expose-gc
|
|
// Flags: --no-liftoff
|
|
|
|
d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
|
|
|
|
const num_functions = 3;
|
|
|
|
function create_builder() {
|
|
const builder = new WasmModuleBuilder();
|
|
builder.addImport("foo", "bar", kSig_i_v);
|
|
for (let i = 0; i < num_functions; ++i) {
|
|
builder.addFunction('f' + i, kSig_i_v)
|
|
.addBody(wasmI32Const(i))
|
|
.exportFunc();
|
|
}
|
|
return builder;
|
|
}
|
|
|
|
const wire_bytes = create_builder().toBuffer();
|
|
|
|
function serializeModule() {
|
|
const module = new WebAssembly.Module(wire_bytes);
|
|
// Run one function so that serialization happens.
|
|
let instance = new WebAssembly.Instance(module, {foo: {bar: () => 1}});
|
|
instance.exports.f2();
|
|
const buff = %SerializeWasmModule(module);
|
|
return buff;
|
|
};
|
|
|
|
const serialized_module = serializeModule();
|
|
// Do some GCs to make sure the first module got collected and removed from the
|
|
// module cache.
|
|
gc();
|
|
gc();
|
|
gc();
|
|
|
|
(function testSerializedModule() {
|
|
print(arguments.callee.name);
|
|
const module = %DeserializeWasmModule(serialized_module, wire_bytes);
|
|
|
|
const instance = new WebAssembly.Instance(module, {foo: {bar: () => 1}});
|
|
assertEquals(0, instance.exports.f0());
|
|
assertEquals(1, instance.exports.f1());
|
|
})();
|