418b239f0b
This CL refactors the handling of metadata associated with WebAssembly modules to reduce the duplicate marshalling of data from the C++ world to the JavaScript world. It does this by wrapping the C++ WasmModule* object in a Foreign that is rooted from the on-heap WasmCompiledModule (which is itself just a FixedArray). Upon serialization, the C++ object is ignored and the original WASM wire bytes are serialized. Upon deserialization, the C++ object is reconstituted by reparsing the bytes. This is motivated by increasing complications in implementing the JS API, in particular WebAssembly.Table, which must perform signature canonicalization across instances. Additionally, this CL implements the proper base + offset initialization behavior for tables. R=rossberg@chromium.org,bradnelson@chromium.org,mtrofin@chromium.org,yangguo@chromium.org BUG=v8:5507, chromium:575167, chromium:657316 Review-Url: https://chromiumcodereview.appspot.com/2424623002 Cr-Commit-Position: refs/heads/master@{#40434}
43 lines
1.2 KiB
JavaScript
43 lines
1.2 KiB
JavaScript
// Copyright 2016 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 --stress-gc --expose-gc
|
|
|
|
load("test/mjsunit/wasm/wasm-constants.js");
|
|
load("test/mjsunit/wasm/wasm-module-builder.js");
|
|
|
|
function run(f) {
|
|
// wrap the creation in a closure so that the only thing returned is
|
|
// the module (i.e. the underlying array buffer of WASM wire bytes dies).
|
|
var module = (() => {
|
|
var builder = new WasmModuleBuilder();
|
|
builder.addImport("the_name_of_my_import", kSig_i_i);
|
|
builder.addFunction("main", kSig_i_i)
|
|
.addBody([
|
|
kExprGetLocal, 0,
|
|
kExprCallFunction, 0])
|
|
.exportAs("main");
|
|
print("module");
|
|
return new WebAssembly.Module(builder.toBuffer());
|
|
})();
|
|
|
|
gc();
|
|
for (var i = 0; i < 10; i++) {
|
|
print(" instance " + i);
|
|
var instance = new WebAssembly.Instance(module, {the_name_of_my_import: f});
|
|
var g = instance.exports.main;
|
|
assertEquals("function", typeof g);
|
|
for (var j = 0; j < 10; j++) {
|
|
assertEquals(f(j), g(j));
|
|
}
|
|
}
|
|
}
|
|
|
|
(function test() {
|
|
for (var i = 0; i < 3; i++) {
|
|
run(x => (x + 19));
|
|
run(x => (x - 18));
|
|
}
|
|
})();
|