Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Side by Side Diff: src/wasm/wasm-module.cc

Issue 2664493002: [wasm][asm.js] Make asm.js->wasm return a regular object. (Closed)
Patch Set: fix Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/asmjs/asm-js.cc ('k') | test/mjsunit/asm/asm-validation.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <memory> 5 #include <memory>
6 6
7 #include "src/assembler-inl.h" 7 #include "src/assembler-inl.h"
8 #include "src/base/adapters.h" 8 #include "src/base/adapters.h"
9 #include "src/base/atomic-utils.h" 9 #include "src/base/atomic-utils.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
11 #include "src/compiler/wasm-compiler.h" 11 #include "src/compiler/wasm-compiler.h"
12 #include "src/debug/interface-types.h" 12 #include "src/debug/interface-types.h"
13 #include "src/objects.h" 13 #include "src/objects.h"
14 #include "src/property-descriptor.h" 14 #include "src/property-descriptor.h"
15 #include "src/simulator.h" 15 #include "src/simulator.h"
16 #include "src/snapshot/snapshot.h" 16 #include "src/snapshot/snapshot.h"
17 #include "src/v8.h" 17 #include "src/v8.h"
18 18
19 #include "src/asmjs/asm-wasm-builder.h"
19 #include "src/wasm/function-body-decoder.h" 20 #include "src/wasm/function-body-decoder.h"
20 #include "src/wasm/module-decoder.h" 21 #include "src/wasm/module-decoder.h"
21 #include "src/wasm/wasm-js.h" 22 #include "src/wasm/wasm-js.h"
22 #include "src/wasm/wasm-limits.h" 23 #include "src/wasm/wasm-limits.h"
23 #include "src/wasm/wasm-module.h" 24 #include "src/wasm/wasm-module.h"
24 #include "src/wasm/wasm-objects.h" 25 #include "src/wasm/wasm-objects.h"
25 #include "src/wasm/wasm-result.h" 26 #include "src/wasm/wasm-result.h"
26 27
27 using namespace v8::internal; 28 using namespace v8::internal;
28 using namespace v8::internal::wasm; 29 using namespace v8::internal::wasm;
(...skipping 1882 matching lines...) Expand 10 before | Expand all | Expand 10 after
1911 // and globals. 1912 // and globals.
1912 void ProcessExports(Handle<FixedArray> code_table, 1913 void ProcessExports(Handle<FixedArray> code_table,
1913 Handle<WasmInstanceObject> instance, 1914 Handle<WasmInstanceObject> instance,
1914 Handle<WasmCompiledModule> compiled_module) { 1915 Handle<WasmCompiledModule> compiled_module) {
1915 if (NeedsWrappers()) { 1916 if (NeedsWrappers()) {
1916 // Fill the table to cache the exported JSFunction wrappers. 1917 // Fill the table to cache the exported JSFunction wrappers.
1917 js_wrappers_.insert(js_wrappers_.begin(), module_->functions.size(), 1918 js_wrappers_.insert(js_wrappers_.begin(), module_->functions.size(),
1918 Handle<JSFunction>::null()); 1919 Handle<JSFunction>::null());
1919 } 1920 }
1920 1921
1921 Handle<JSObject> exports_object = instance; 1922 Handle<JSObject> exports_object;
1922 if (module_->origin == kWasmOrigin) { 1923 if (module_->origin == kWasmOrigin) {
1923 // Create the "exports" object. 1924 // Create the "exports" object.
1924 exports_object = isolate_->factory()->NewJSObjectWithNullProto(); 1925 exports_object = isolate_->factory()->NewJSObjectWithNullProto();
1925 Handle<String> exports_name = 1926 } else if (module_->origin == kAsmJsOrigin) {
1926 isolate_->factory()->InternalizeUtf8String("exports"); 1927 Handle<JSFunction> object_function = Handle<JSFunction>(
1927 JSObject::AddProperty(instance, exports_name, exports_object, NONE); 1928 isolate_->native_context()->object_function(), isolate_);
1929 exports_object = isolate_->factory()->NewJSObject(object_function);
1930 } else {
1931 UNREACHABLE();
1928 } 1932 }
1933 Handle<String> exports_name =
1934 isolate_->factory()->InternalizeUtf8String("exports");
1935 JSObject::AddProperty(instance, exports_name, exports_object, NONE);
1936
1937 Handle<String> foreign_init_name =
1938 isolate_->factory()->InternalizeUtf8String(
1939 wasm::AsmWasmBuilder::foreign_init_name);
1940 Handle<String> single_function_name =
1941 isolate_->factory()->InternalizeUtf8String(
1942 wasm::AsmWasmBuilder::single_function_name);
1929 1943
1930 PropertyDescriptor desc; 1944 PropertyDescriptor desc;
1931 desc.set_writable(false); 1945 desc.set_writable(module_->origin == kAsmJsOrigin);
1932 desc.set_enumerable(true); 1946 desc.set_enumerable(true);
1933 1947
1934 // Count up export indexes. 1948 // Count up export indexes.
1935 int export_index = 0; 1949 int export_index = 0;
1936 for (auto exp : module_->export_table) { 1950 for (auto exp : module_->export_table) {
1937 if (exp.kind == kExternalFunction) { 1951 if (exp.kind == kExternalFunction) {
1938 ++export_index; 1952 ++export_index;
1939 } 1953 }
1940 } 1954 }
1941 1955
1942 // Store weak references to all exported functions. 1956 // Store weak references to all exported functions.
1943 Handle<FixedArray> weak_exported_functions; 1957 Handle<FixedArray> weak_exported_functions;
1944 if (compiled_module->has_weak_exported_functions()) { 1958 if (compiled_module->has_weak_exported_functions()) {
1945 weak_exported_functions = compiled_module->weak_exported_functions(); 1959 weak_exported_functions = compiled_module->weak_exported_functions();
1946 } else { 1960 } else {
1947 weak_exported_functions = 1961 weak_exported_functions =
1948 isolate_->factory()->NewFixedArray(export_index); 1962 isolate_->factory()->NewFixedArray(export_index);
1949 compiled_module->set_weak_exported_functions(weak_exported_functions); 1963 compiled_module->set_weak_exported_functions(weak_exported_functions);
1950 } 1964 }
1951 DCHECK_EQ(export_index, weak_exported_functions->length()); 1965 DCHECK_EQ(export_index, weak_exported_functions->length());
1952 1966
1953 // Process each export in the export table (go in reverse so asm.js 1967 // Process each export in the export table (go in reverse so asm.js
1954 // can skip duplicates). 1968 // can skip duplicates).
1955 for (auto exp : base::Reversed(module_->export_table)) { 1969 for (auto exp : base::Reversed(module_->export_table)) {
1956 Handle<String> name = 1970 Handle<String> name =
1957 WasmCompiledModule::ExtractUtf8StringFromModuleBytes( 1971 WasmCompiledModule::ExtractUtf8StringFromModuleBytes(
1958 isolate_, compiled_module_, exp.name_offset, exp.name_length) 1972 isolate_, compiled_module_, exp.name_offset, exp.name_length)
1959 .ToHandleChecked(); 1973 .ToHandleChecked();
1974 Handle<JSObject> export_to;
1975 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
1976 (String::Equals(name, foreign_init_name) ||
1977 String::Equals(name, single_function_name))) {
1978 export_to = instance;
1979 } else {
1980 export_to = exports_object;
1981 }
1982
1960 switch (exp.kind) { 1983 switch (exp.kind) {
1961 case kExternalFunction: { 1984 case kExternalFunction: {
1962 // Wrap and export the code as a JSFunction. 1985 // Wrap and export the code as a JSFunction.
1963 WasmFunction& function = module_->functions[exp.index]; 1986 WasmFunction& function = module_->functions[exp.index];
1964 int func_index = 1987 int func_index =
1965 static_cast<int>(module_->functions.size() + --export_index); 1988 static_cast<int>(module_->functions.size() + --export_index);
1966 Handle<JSFunction> js_function = js_wrappers_[exp.index]; 1989 Handle<JSFunction> js_function = js_wrappers_[exp.index];
1967 if (js_function.is_null()) { 1990 if (js_function.is_null()) {
1968 // Wrap the exported code as a JSFunction. 1991 // Wrap the exported code as a JSFunction.
1969 Handle<Code> export_code = 1992 Handle<Code> export_code =
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
2046 desc.set_value(isolate_->factory()->NewNumber(num)); 2069 desc.set_value(isolate_->factory()->NewNumber(num));
2047 break; 2070 break;
2048 } 2071 }
2049 default: 2072 default:
2050 UNREACHABLE(); 2073 UNREACHABLE();
2051 break; 2074 break;
2052 } 2075 }
2053 2076
2054 // Skip duplicates for asm.js. 2077 // Skip duplicates for asm.js.
2055 if (module_->origin == kAsmJsOrigin) { 2078 if (module_->origin == kAsmJsOrigin) {
2056 v8::Maybe<bool> status = 2079 v8::Maybe<bool> status = JSReceiver::HasOwnProperty(export_to, name);
2057 JSReceiver::HasOwnProperty(exports_object, name);
2058 if (status.FromMaybe(false)) { 2080 if (status.FromMaybe(false)) {
2059 continue; 2081 continue;
2060 } 2082 }
2061 } 2083 }
2062 v8::Maybe<bool> status = JSReceiver::DefineOwnProperty( 2084 v8::Maybe<bool> status = JSReceiver::DefineOwnProperty(
2063 isolate_, exports_object, name, &desc, Object::THROW_ON_ERROR); 2085 isolate_, export_to, name, &desc, Object::THROW_ON_ERROR);
2064 if (!status.IsJust()) { 2086 if (!status.IsJust()) {
2065 thrower_->LinkError("export of %.*s failed.", name->length(), 2087 thrower_->LinkError("export of %.*s failed.", name->length(),
2066 name->ToCString().get()); 2088 name->ToCString().get());
2067 return; 2089 return;
2068 } 2090 }
2069 } 2091 }
2070 2092
2071 if (module_->origin == kWasmOrigin) { 2093 if (module_->origin == kWasmOrigin) {
2072 v8::Maybe<bool> success = JSReceiver::SetIntegrityLevel( 2094 v8::Maybe<bool> success = JSReceiver::SetIntegrityLevel(
2073 exports_object, FROZEN, Object::DONT_THROW); 2095 exports_object, FROZEN, Object::DONT_THROW);
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after
2793 Handle<FixedArray> storage = factory->NewFixedArray(num_custom_sections); 2815 Handle<FixedArray> storage = factory->NewFixedArray(num_custom_sections);
2794 JSArray::SetContent(array_object, storage); 2816 JSArray::SetContent(array_object, storage);
2795 array_object->set_length(Smi::FromInt(num_custom_sections)); 2817 array_object->set_length(Smi::FromInt(num_custom_sections));
2796 2818
2797 for (int i = 0; i < num_custom_sections; i++) { 2819 for (int i = 0; i < num_custom_sections; i++) {
2798 storage->set(i, *matching_sections[i]); 2820 storage->set(i, *matching_sections[i]);
2799 } 2821 }
2800 2822
2801 return array_object; 2823 return array_object;
2802 } 2824 }
OLDNEW
« no previous file with comments | « src/asmjs/asm-js.cc ('k') | test/mjsunit/asm/asm-validation.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698