Commit e11cee84 authored by Mircea Trofin's avatar Mircea Trofin Committed by Commit Bot

[wasm] Rename the APIs that unwrap exports from other instances.

The renames capture what the item being unwrapped is - it's always
a js-to-wasm wrapper, which is more closely captured by "export" rather
than "import".

Bug: 
Change-Id: Iffc3d8cb9037afc2d32885301fd13fc12b8277ce
Reviewed-on: https://chromium-review.googlesource.com/648005Reviewed-by: 's avatarClemens Hammacher <clemensh@chromium.org>
Commit-Queue: Mircea Trofin <mtrofin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#47827}
parent 30f08f39
...@@ -491,11 +491,11 @@ bool in_bounds(uint32_t offset, uint32_t size, uint32_t upper) { ...@@ -491,11 +491,11 @@ bool in_bounds(uint32_t offset, uint32_t size, uint32_t upper) {
using WasmInstanceMap = using WasmInstanceMap =
IdentityMap<Handle<WasmInstanceObject>, FreeStoreAllocationPolicy>; IdentityMap<Handle<WasmInstanceObject>, FreeStoreAllocationPolicy>;
Handle<Code> UnwrapOrCompileImportWrapper( Handle<Code> UnwrapExportOrCompileImportWrapper(
Isolate* isolate, int index, FunctionSig* sig, Handle<JSReceiver> target, Isolate* isolate, int index, FunctionSig* sig, Handle<JSReceiver> target,
Handle<String> module_name, MaybeHandle<String> import_name, Handle<String> module_name, MaybeHandle<String> import_name,
ModuleOrigin origin, WasmInstanceMap* imported_instances) { ModuleOrigin origin, WasmInstanceMap* imported_instances) {
WasmFunction* other_func = GetWasmFunctionForImportWrapper(isolate, target); WasmFunction* other_func = GetWasmFunctionForExport(isolate, target);
if (other_func) { if (other_func) {
if (!sig->Equals(other_func->sig)) return Handle<Code>::null(); if (!sig->Equals(other_func->sig)) return Handle<Code>::null();
// Signature matched. Unwrap the import wrapper and return the raw wasm // Signature matched. Unwrap the import wrapper and return the raw wasm
...@@ -504,7 +504,7 @@ Handle<Code> UnwrapOrCompileImportWrapper( ...@@ -504,7 +504,7 @@ Handle<Code> UnwrapOrCompileImportWrapper(
Handle<WasmInstanceObject> imported_instance( Handle<WasmInstanceObject> imported_instance(
Handle<WasmExportedFunction>::cast(target)->instance(), isolate); Handle<WasmExportedFunction>::cast(target)->instance(), isolate);
imported_instances->Set(imported_instance, imported_instance); imported_instances->Set(imported_instance, imported_instance);
return UnwrapImportWrapper(target); return UnwrapExportWrapper(Handle<JSFunction>::cast(target));
} }
// No wasm function or being debugged. Compile a new wrapper for the new // No wasm function or being debugged. Compile a new wrapper for the new
// signature. // signature.
...@@ -1335,17 +1335,17 @@ int InstanceBuilder::ProcessImports(Handle<FixedArray> code_table, ...@@ -1335,17 +1335,17 @@ int InstanceBuilder::ProcessImports(Handle<FixedArray> code_table,
return -1; return -1;
} }
Handle<Code> import_wrapper = UnwrapOrCompileImportWrapper( Handle<Code> import_code = UnwrapExportOrCompileImportWrapper(
isolate_, index, module_->functions[import.index].sig, isolate_, index, module_->functions[import.index].sig,
Handle<JSReceiver>::cast(value), module_name, import_name, Handle<JSReceiver>::cast(value), module_name, import_name,
module_->origin(), &imported_wasm_instances); module_->origin(), &imported_wasm_instances);
if (import_wrapper.is_null()) { if (import_code.is_null()) {
ReportLinkError("imported function does not match the expected type", ReportLinkError("imported function does not match the expected type",
index, module_name, import_name); index, module_name, import_name);
return -1; return -1;
} }
code_table->set(num_imported_functions, *import_wrapper); code_table->set(num_imported_functions, *import_code);
RecordStats(*import_wrapper, counters()); RecordStats(*import_code, counters());
num_imported_functions++; num_imported_functions++;
break; break;
} }
...@@ -1403,8 +1403,7 @@ int InstanceBuilder::ProcessImports(Handle<FixedArray> code_table, ...@@ -1403,8 +1403,7 @@ int InstanceBuilder::ProcessImports(Handle<FixedArray> code_table,
for (int i = 0; i < table_size; ++i) { for (int i = 0; i < table_size; ++i) {
Handle<Object> val(table_instance.js_wrappers->get(i), isolate_); Handle<Object> val(table_instance.js_wrappers->get(i), isolate_);
if (!val->IsJSFunction()) continue; if (!val->IsJSFunction()) continue;
WasmFunction* function = WasmFunction* function = GetWasmFunctionForExport(isolate_, val);
GetWasmFunctionForImportWrapper(isolate_, val);
if (function == nullptr) { if (function == nullptr) {
thrower_->LinkError("table import %d[%d] is not a wasm function", thrower_->LinkError("table import %d[%d] is not a wasm function",
index, i); index, i);
...@@ -1412,7 +1411,8 @@ int InstanceBuilder::ProcessImports(Handle<FixedArray> code_table, ...@@ -1412,7 +1411,8 @@ int InstanceBuilder::ProcessImports(Handle<FixedArray> code_table,
} }
int sig_index = table.map.FindOrInsert(function->sig); int sig_index = table.map.FindOrInsert(function->sig);
table_instance.signature_table->set(i, Smi::FromInt(sig_index)); table_instance.signature_table->set(i, Smi::FromInt(sig_index));
table_instance.function_table->set(i, *UnwrapImportWrapper(val)); table_instance.function_table->set(
i, *UnwrapExportWrapper(Handle<JSFunction>::cast(val)));
} }
num_imported_tables++; num_imported_tables++;
......
...@@ -367,7 +367,7 @@ WasmInstanceObject* GetOwningWasmInstance(Code* code) { ...@@ -367,7 +367,7 @@ WasmInstanceObject* GetOwningWasmInstance(Code* code) {
WasmModule::WasmModule(std::unique_ptr<Zone> owned) WasmModule::WasmModule(std::unique_ptr<Zone> owned)
: signature_zone(std::move(owned)) {} : signature_zone(std::move(owned)) {}
WasmFunction* GetWasmFunctionForImportWrapper(Isolate* isolate, WasmFunction* GetWasmFunctionForExport(Isolate* isolate,
Handle<Object> target) { Handle<Object> target) {
if (target->IsJSFunction()) { if (target->IsJSFunction()) {
Handle<JSFunction> func = Handle<JSFunction>::cast(target); Handle<JSFunction> func = Handle<JSFunction>::cast(target);
...@@ -381,9 +381,9 @@ WasmFunction* GetWasmFunctionForImportWrapper(Isolate* isolate, ...@@ -381,9 +381,9 @@ WasmFunction* GetWasmFunctionForImportWrapper(Isolate* isolate,
return nullptr; return nullptr;
} }
Handle<Code> UnwrapImportWrapper(Handle<Object> import_wrapper) { Handle<Code> UnwrapExportWrapper(Handle<JSFunction> export_wrapper) {
Handle<JSFunction> func = Handle<JSFunction>::cast(import_wrapper); Handle<Code> export_wrapper_code = handle(export_wrapper->code());
Handle<Code> export_wrapper_code = handle(func->code()); DCHECK_EQ(export_wrapper_code->kind(), Code::JS_TO_WASM_FUNCTION);
int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET);
for (RelocIterator it(*export_wrapper_code, mask);; it.next()) { for (RelocIterator it(*export_wrapper_code, mask);; it.next()) {
DCHECK(!it.done()); DCHECK(!it.done());
...@@ -447,11 +447,14 @@ void TableSet(ErrorThrower* thrower, Isolate* isolate, ...@@ -447,11 +447,14 @@ void TableSet(ErrorThrower* thrower, Isolate* isolate,
WasmFunction* wasm_function = nullptr; WasmFunction* wasm_function = nullptr;
Handle<Code> code = Handle<Code>::null(); Handle<Code> code = Handle<Code>::null();
Handle<Object> value = handle(isolate->heap()->null_value()); Handle<Object> value = isolate->factory()->null_value();
if (!function.is_null()) { if (!function.is_null()) {
wasm_function = GetWasmFunctionForImportWrapper(isolate, function); wasm_function = GetWasmFunctionForExport(isolate, function);
code = UnwrapImportWrapper(function); // The verification that {function} is an export was done
// by the caller.
DCHECK_NOT_NULL(wasm_function);
code = UnwrapExportWrapper(function);
value = Handle<Object>::cast(function); value = Handle<Object>::cast(function);
} }
......
...@@ -339,12 +339,14 @@ void DetachWebAssemblyMemoryBuffer(Isolate* isolate, ...@@ -339,12 +339,14 @@ void DetachWebAssemblyMemoryBuffer(Isolate* isolate,
Handle<JSArrayBuffer> buffer, Handle<JSArrayBuffer> buffer,
bool free_memory); bool free_memory);
// If the target is an export wrapper, return the {WasmFunction*} corresponding
// to the wrapped wasm function; in all other cases, return nullptr.
// The returned pointer is owned by the wasm instance target belongs to. The // The returned pointer is owned by the wasm instance target belongs to. The
// result is alive as long as the instance exists. // result is alive as long as the instance exists.
WasmFunction* GetWasmFunctionForImportWrapper(Isolate* isolate, WasmFunction* GetWasmFunctionForExport(Isolate* isolate, Handle<Object> target);
Handle<Object> target);
Handle<Code> UnwrapImportWrapper(Handle<Object> import_wrapper); // {export_wrapper} is known to be an export.
Handle<Code> UnwrapExportWrapper(Handle<JSFunction> export_wrapper);
void TableSet(ErrorThrower* thrower, Isolate* isolate, void TableSet(ErrorThrower* thrower, Isolate* isolate,
Handle<WasmTableObject> table, int64_t index, Handle<WasmTableObject> table, int64_t index,
......
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