Commit 384ac3cd authored by Andreas Haas's avatar Andreas Haas Committed by Commit Bot

[wasm] Reexported wasm functions should be identical to imports

According to the spec, if an imported function gets exported, the
exported function has to be identical to to imported function.

With this CL we initialize the list of potential js_wrappers_ with all
wasm function we imported. Therefore no new wrappers are generated for
these functions.

R=clemensh@chromium.org

Bug: v8:7364
Change-Id: Ibcd47d8fcc4c2fb5740d57ea547fbd01c2a4e80a
Reviewed-on: https://chromium-review.googlesource.com/901626
Commit-Queue: Andreas Haas <ahaas@chromium.org>
Reviewed-by: 's avatarClemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#51244}
parent 37ab0c76
......@@ -3007,6 +3007,20 @@ void InstanceBuilder::ProcessExports(
// Fill the table to cache the exported JSFunction wrappers.
js_wrappers_.insert(js_wrappers_.begin(), module_->functions.size(),
Handle<JSFunction>::null());
// If an imported WebAssembly function gets exported, the exported function
// has to be identical to to imported function. Therefore we put all
// imported WebAssembly functions into the js_wrappers_ list.
for (int index = 0, end = static_cast<int>(module_->import_table.size());
index < end; ++index) {
WasmImport& import = module_->import_table[index];
if (import.kind == kExternalFunction) {
Handle<Object> value = sanitized_imports_[index].value;
if (WasmExportedFunction::IsWasmExportedFunction(*value)) {
js_wrappers_[import.index] = Handle<JSFunction>::cast(value);
}
}
}
}
Handle<JSObject> exports_object;
......
// 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.
load('test/mjsunit/wasm/wasm-constants.js');
load('test/mjsunit/wasm/wasm-module-builder.js');
const exportingModuleBinary = (() => {
const builder = new WasmModuleBuilder();
builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 42]).exportFunc();
return builder.toBuffer();
})();
const exportingModule = new WebAssembly.Module(exportingModuleBinary);
const exportingInstance = new WebAssembly.Instance(exportingModule);
const reExportingModuleBinary = (() => {
const builder = new WasmModuleBuilder();
const gIndex = builder.addImport('a', 'g', kSig_i_v);
builder.addExport('y', gIndex);
return builder.toBuffer();
})();
const module = new WebAssembly.Module(reExportingModuleBinary);
const imports = {
a: {g: exportingInstance.exports.f},
};
const instance = new WebAssembly.Instance(module, imports);
// Previously exported Wasm functions are re-exported with the same value
assertEquals(instance.exports.y, exportingInstance.exports.f);
......@@ -11,8 +11,6 @@ const known_failures = {
// Enter failing tests like follows:
// "'WebAssembly.Instance.prototype.exports' accessor property":
// 'https://bugs.chromium.org/p/v8/issues/detail?id=5507',
"Exported values have cached JS objects":
'https://bugs.chromium.org/p/v8/issues/detail?id=7364',
"Tables export cached ":
'://bugs.chromium.org/p/v8/issues/detail?id=7365',
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment