[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: Clemens Hammacher <clemensh@chromium.org> Cr-Commit-Position: refs/heads/master@{#51244}
This commit is contained in:
parent
37ab0c76a1
commit
384ac3cde9
@ -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;
|
||||
|
31
test/mjsunit/regress/wasm/regress-7364.js
Normal file
31
test/mjsunit/regress/wasm/regress-7364.js
Normal file
@ -0,0 +1,31 @@
|
||||
// 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',
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user