Chromium Code Reviews| Index: src/wasm/wasm-module.cc |
| diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc |
| index e4188da72a3bf1b0545c5a712c18c218ff5da8ba..ed915b10460f23381f9305b0fa4a8fa226aa4160 100644 |
| --- a/src/wasm/wasm-module.cc |
| +++ b/src/wasm/wasm-module.cc |
| @@ -16,6 +16,7 @@ |
| #include "src/snapshot/snapshot.h" |
| #include "src/v8.h" |
| +#include "src/asmjs/asm-wasm-builder.h" |
| #include "src/wasm/function-body-decoder.h" |
| #include "src/wasm/module-decoder.h" |
| #include "src/wasm/wasm-js.h" |
| @@ -1918,17 +1919,30 @@ class WasmInstanceBuilder { |
| Handle<JSFunction>::null()); |
| } |
| - Handle<JSObject> exports_object = instance; |
| + Handle<JSObject> exports_object; |
| if (module_->origin == kWasmOrigin) { |
| // Create the "exports" object. |
| exports_object = isolate_->factory()->NewJSObjectWithNullProto(); |
| - Handle<String> exports_name = |
| - isolate_->factory()->InternalizeUtf8String("exports"); |
| - JSObject::AddProperty(instance, exports_name, exports_object, NONE); |
| + } else if (module_->origin == kAsmJsOrigin) { |
| + Handle<JSFunction> object_function = Handle<JSFunction>( |
| + isolate_->native_context()->object_function(), isolate_); |
| + exports_object = isolate_->factory()->NewJSObject(object_function); |
| + } else { |
| + UNREACHABLE(); |
| } |
| + Handle<String> exports_name = |
| + isolate_->factory()->InternalizeUtf8String("exports"); |
| + JSObject::AddProperty(instance, exports_name, exports_object, NONE); |
| + |
| + Handle<String> foreign_init_name = |
| + isolate_->factory()->InternalizeUtf8String( |
| + wasm::AsmWasmBuilder::foreign_init_name); |
| + Handle<String> single_function_name = |
| + isolate_->factory()->InternalizeUtf8String( |
| + wasm::AsmWasmBuilder::single_function_name); |
| PropertyDescriptor desc; |
| - desc.set_writable(false); |
| + desc.set_writable(module_->origin == kAsmJsOrigin); |
| desc.set_enumerable(true); |
| // Count up export indexes. |
| @@ -1957,6 +1971,15 @@ class WasmInstanceBuilder { |
| WasmCompiledModule::ExtractUtf8StringFromModuleBytes( |
| isolate_, compiled_module_, exp.name_offset, exp.name_length) |
| .ToHandleChecked(); |
| + Handle<JSObject> export_to; |
| + if (module_->origin == kAsmJsOrigin && exp.kind == kExternalFunction && |
|
titzer
2017/01/31 00:08:13
Can you leave a TODO here? We're adding to string
|
| + (String::Equals(name, foreign_init_name) || |
| + String::Equals(name, single_function_name))) { |
| + export_to = instance; |
| + } else { |
| + export_to = exports_object; |
| + } |
| + |
| switch (exp.kind) { |
| case kExternalFunction: { |
| // Wrap and export the code as a JSFunction. |
| @@ -2053,14 +2076,13 @@ class WasmInstanceBuilder { |
| // Skip duplicates for asm.js. |
| if (module_->origin == kAsmJsOrigin) { |
| - v8::Maybe<bool> status = |
| - JSReceiver::HasOwnProperty(exports_object, name); |
| + v8::Maybe<bool> status = JSReceiver::HasOwnProperty(export_to, name); |
| if (status.FromMaybe(false)) { |
| continue; |
| } |
| } |
| v8::Maybe<bool> status = JSReceiver::DefineOwnProperty( |
| - isolate_, exports_object, name, &desc, Object::THROW_ON_ERROR); |
| + isolate_, export_to, name, &desc, Object::THROW_ON_ERROR); |
| if (!status.IsJust()) { |
| thrower_->LinkError("export of %.*s failed.", name->length(), |
| name->ToCString().get()); |