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

Side by Side Diff: src/asmjs/asm-js.cc

Issue 2251433002: [wasm] asm.js - Check stdlib.NaN is valid, prepare for the rest. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix Created 4 years, 4 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.h ('k') | src/asmjs/asm-typer.h » ('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 "src/asmjs/asm-js.h" 5 #include "src/asmjs/asm-js.h"
6 6
7 #include "src/api-natives.h" 7 #include "src/api-natives.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/asmjs/asm-typer.h" 9 #include "src/asmjs/asm-typer.h"
10 #include "src/asmjs/asm-wasm-builder.h" 10 #include "src/asmjs/asm-wasm-builder.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 } else if (result.failed()) { 46 } else if (result.failed()) {
47 thrower->Failed("", result); 47 thrower->Failed("", result);
48 } else { 48 } else {
49 compiled_module = result.val->CompileFunctions(isolate, thrower); 49 compiled_module = result.val->CompileFunctions(isolate, thrower);
50 } 50 }
51 51
52 if (result.val) delete result.val; 52 if (result.val) delete result.val;
53 return compiled_module; 53 return compiled_module;
54 } 54 }
55 55
56 bool IsStdlibMemberValid(i::Isolate* isolate, Handle<JSReceiver> stdlib,
57 i::Handle<i::Object> member_id) {
58 int32_t member_kind;
59 if (!member_id->ToInt32(&member_kind)) {
60 UNREACHABLE();
61 }
62 switch (member_kind) {
63 case wasm::AsmTyper::StandardMember::kNone:
64 case wasm::AsmTyper::StandardMember::kModule:
65 case wasm::AsmTyper::StandardMember::kStdlib: {
66 // Nothing to check for these.
67 return true;
68 }
69 case wasm::AsmTyper::StandardMember::kNaN: {
70 i::Handle<i::Name> name(isolate->factory()->InternalizeOneByteString(
71 STATIC_CHAR_VECTOR("NaN")));
72 i::MaybeHandle<i::Object> maybe_value =
73 i::Object::GetProperty(stdlib, name);
74 if (maybe_value.is_null()) {
75 return false;
76 }
77 i::Handle<i::Object> value = maybe_value.ToHandleChecked();
78 if (!value->IsNaN()) {
79 return false;
80 }
81 return true;
82 }
83 case wasm::AsmTyper::StandardMember::kHeap:
84 case wasm::AsmTyper::StandardMember::kFFI:
85 case wasm::AsmTyper::StandardMember::kInfinity:
86 case wasm::AsmTyper::StandardMember::kMathAcos:
87 case wasm::AsmTyper::StandardMember::kMathAsin:
88 case wasm::AsmTyper::StandardMember::kMathAtan:
89 case wasm::AsmTyper::StandardMember::kMathCos:
90 case wasm::AsmTyper::StandardMember::kMathSin:
91 case wasm::AsmTyper::StandardMember::kMathTan:
92 case wasm::AsmTyper::StandardMember::kMathExp:
93 case wasm::AsmTyper::StandardMember::kMathLog:
94 case wasm::AsmTyper::StandardMember::kMathCeil:
95 case wasm::AsmTyper::StandardMember::kMathFloor:
96 case wasm::AsmTyper::StandardMember::kMathSqrt:
97 case wasm::AsmTyper::StandardMember::kMathAbs:
98 case wasm::AsmTyper::StandardMember::kMathClz32:
99 case wasm::AsmTyper::StandardMember::kMathMin:
100 case wasm::AsmTyper::StandardMember::kMathMax:
101 case wasm::AsmTyper::StandardMember::kMathAtan2:
102 case wasm::AsmTyper::StandardMember::kMathPow:
103 case wasm::AsmTyper::StandardMember::kMathImul:
104 case wasm::AsmTyper::StandardMember::kMathFround:
105 case wasm::AsmTyper::StandardMember::kMathE:
106 case wasm::AsmTyper::StandardMember::kMathLN10:
107 case wasm::AsmTyper::StandardMember::kMathLN2:
108 case wasm::AsmTyper::StandardMember::kMathLOG2E:
109 case wasm::AsmTyper::StandardMember::kMathLOG10E:
110 case wasm::AsmTyper::StandardMember::kMathPI:
111 case wasm::AsmTyper::StandardMember::kMathSQRT1_2:
112 case wasm::AsmTyper::StandardMember::kMathSQRT2:
113 // TODO(bradnelson) Actually check these.
114 return true;
115 default: { UNREACHABLE(); }
116 }
117 return false;
118 }
119
56 } // namespace 120 } // namespace
57 121
58 MaybeHandle<FixedArray> AsmJs::ConvertAsmToWasm(ParseInfo* info) { 122 MaybeHandle<FixedArray> AsmJs::ConvertAsmToWasm(ParseInfo* info) {
59 ErrorThrower thrower(info->isolate(), "Asm.js -> WebAssembly conversion"); 123 ErrorThrower thrower(info->isolate(), "Asm.js -> WebAssembly conversion");
60 wasm::AsmTyper typer(info->isolate(), info->zone(), *(info->script()), 124 wasm::AsmTyper typer(info->isolate(), info->zone(), *(info->script()),
61 info->literal()); 125 info->literal());
62 if (!typer.Validate()) { 126 if (!typer.Validate()) {
63 DCHECK(!info->isolate()->has_pending_exception()); 127 DCHECK(!info->isolate()->has_pending_exception());
64 PrintF("Validation of asm.js module failed: %s", typer.error_message()); 128 PrintF("Validation of asm.js module failed: %s", typer.error_message());
65 return MaybeHandle<FixedArray>(); 129 return MaybeHandle<FixedArray>();
66 } 130 }
67 v8::internal::wasm::AsmWasmBuilder builder(info->isolate(), info->zone(), 131 v8::internal::wasm::AsmWasmBuilder builder(info->isolate(), info->zone(),
68 info->literal(), &typer); 132 info->literal(), &typer);
69 i::Handle<i::FixedArray> foreign_globals; 133 i::Handle<i::FixedArray> foreign_globals;
70 auto module = builder.Run(&foreign_globals); 134 auto module = builder.Run(&foreign_globals);
71 135
72 i::MaybeHandle<i::FixedArray> compiled = 136 i::MaybeHandle<i::FixedArray> compiled =
73 CompileModule(info->isolate(), module->begin(), module->end(), &thrower, 137 CompileModule(info->isolate(), module->begin(), module->end(), &thrower,
74 internal::wasm::kAsmJsOrigin); 138 internal::wasm::kAsmJsOrigin);
75 DCHECK(!compiled.is_null()); 139 DCHECK(!compiled.is_null());
76 140
77 Handle<FixedArray> result = info->isolate()->factory()->NewFixedArray(2); 141 wasm::AsmTyper::StdlibSet uses = typer.StdlibUses();
142 Handle<FixedArray> uses_array =
143 info->isolate()->factory()->NewFixedArray(static_cast<int>(uses.size()));
144 int count = 0;
145 for (auto i : uses) {
146 uses_array->set(count++, Smi::FromInt(i));
147 }
148
149 Handle<FixedArray> result = info->isolate()->factory()->NewFixedArray(3);
78 result->set(0, *compiled.ToHandleChecked()); 150 result->set(0, *compiled.ToHandleChecked());
79 result->set(1, *foreign_globals); 151 result->set(1, *foreign_globals);
152 result->set(2, *uses_array);
80 return result; 153 return result;
81 } 154 }
82 155
156 bool AsmJs::IsStdlibValid(i::Isolate* isolate, Handle<FixedArray> wasm_data,
157 Handle<JSReceiver> stdlib) {
158 i::Handle<i::FixedArray> uses(i::FixedArray::cast(wasm_data->get(2)));
159 for (int i = 0; i < uses->length(); ++i) {
160 if (!IsStdlibMemberValid(isolate, stdlib,
161 uses->GetValueChecked<i::Object>(isolate, i))) {
162 return false;
163 }
164 }
165 return true;
166 }
167
83 MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate, 168 MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate,
84 Handle<FixedArray> wasm_data, 169 Handle<FixedArray> wasm_data,
85 Handle<JSArrayBuffer> memory, 170 Handle<JSArrayBuffer> memory,
86 Handle<JSObject> foreign) { 171 Handle<JSReceiver> foreign) {
87 i::Handle<i::FixedArray> compiled(i::FixedArray::cast(wasm_data->get(0))); 172 i::Handle<i::FixedArray> compiled(i::FixedArray::cast(wasm_data->get(0)));
88 i::Handle<i::FixedArray> foreign_globals( 173 i::Handle<i::FixedArray> foreign_globals(
89 i::FixedArray::cast(wasm_data->get(1))); 174 i::FixedArray::cast(wasm_data->get(1)));
90 175
91 ErrorThrower thrower(isolate, "Asm.js -> WebAssembly instantiation"); 176 ErrorThrower thrower(isolate, "Asm.js -> WebAssembly instantiation");
92 177
93 i::MaybeHandle<i::JSObject> maybe_module_object = 178 i::MaybeHandle<i::JSObject> maybe_module_object =
94 i::wasm::WasmModule::Instantiate(isolate, compiled, foreign, memory); 179 i::wasm::WasmModule::Instantiate(isolate, compiled, foreign, memory);
95 if (maybe_module_object.is_null()) { 180 if (maybe_module_object.is_null()) {
96 return MaybeHandle<Object>(); 181 return MaybeHandle<Object>();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 if (retval.is_null()) { 215 if (retval.is_null()) {
131 thrower.Error( 216 thrower.Error(
132 "WASM.instantiateModuleFromAsm(): foreign init function failed"); 217 "WASM.instantiateModuleFromAsm(): foreign init function failed");
133 return MaybeHandle<Object>(); 218 return MaybeHandle<Object>();
134 } 219 }
135 return maybe_module_object; 220 return maybe_module_object;
136 } 221 }
137 222
138 } // namespace internal 223 } // namespace internal
139 } // namespace v8 224 } // namespace v8
OLDNEW
« no previous file with comments | « src/asmjs/asm-js.h ('k') | src/asmjs/asm-typer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698