| OLD | NEW |
| 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 12 matching lines...) Expand all Loading... |
| 23 #include "src/wasm/wasm-result.h" | 23 #include "src/wasm/wasm-result.h" |
| 24 | 24 |
| 25 typedef uint8_t byte; | 25 typedef uint8_t byte; |
| 26 | 26 |
| 27 using v8::internal::wasm::ErrorThrower; | 27 using v8::internal::wasm::ErrorThrower; |
| 28 | 28 |
| 29 namespace v8 { | 29 namespace v8 { |
| 30 namespace internal { | 30 namespace internal { |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
| 33 i::MaybeHandle<i::FixedArray> CompileModule( | |
| 34 i::Isolate* isolate, const byte* start, const byte* end, | |
| 35 ErrorThrower* thrower, | |
| 36 internal::wasm::ModuleOrigin origin = i::wasm::kWasmOrigin) { | |
| 37 // Decode but avoid a redundant pass over function bodies for verification. | |
| 38 // Verification will happen during compilation. | |
| 39 i::Zone zone(isolate->allocator()); | |
| 40 internal::wasm::ModuleResult result = internal::wasm::DecodeWasmModule( | |
| 41 isolate, &zone, start, end, false, origin); | |
| 42 | |
| 43 i::MaybeHandle<i::FixedArray> compiled_module; | |
| 44 if (result.failed() && origin == internal::wasm::kAsmJsOrigin) { | |
| 45 thrower->Error("Asm.js converted module failed to decode"); | |
| 46 } else if (result.failed()) { | |
| 47 thrower->Failed("", result); | |
| 48 } else { | |
| 49 compiled_module = result.val->CompileFunctions(isolate, thrower); | |
| 50 } | |
| 51 | |
| 52 if (result.val) delete result.val; | |
| 53 return compiled_module; | |
| 54 } | |
| 55 | |
| 56 Handle<i::Object> StdlibMathMember(i::Isolate* isolate, | 33 Handle<i::Object> StdlibMathMember(i::Isolate* isolate, |
| 57 Handle<JSReceiver> stdlib, | 34 Handle<JSReceiver> stdlib, |
| 58 Handle<Name> name) { | 35 Handle<Name> name) { |
| 59 if (stdlib.is_null()) { | 36 if (stdlib.is_null()) { |
| 60 return Handle<i::Object>(); | 37 return Handle<i::Object>(); |
| 61 } | 38 } |
| 62 Handle<i::Name> math_name( | 39 Handle<i::Name> math_name( |
| 63 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("Math"))); | 40 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("Math"))); |
| 64 MaybeHandle<i::Object> maybe_math = i::Object::GetProperty(stdlib, math_name); | 41 MaybeHandle<i::Object> maybe_math = i::Object::GetProperty(stdlib, math_name); |
| 65 if (maybe_math.is_null()) { | 42 if (maybe_math.is_null()) { |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 if (!typer.Validate()) { | 157 if (!typer.Validate()) { |
| 181 DCHECK(!info->isolate()->has_pending_exception()); | 158 DCHECK(!info->isolate()->has_pending_exception()); |
| 182 PrintF("Validation of asm.js module failed: %s", typer.error_message()); | 159 PrintF("Validation of asm.js module failed: %s", typer.error_message()); |
| 183 return MaybeHandle<FixedArray>(); | 160 return MaybeHandle<FixedArray>(); |
| 184 } | 161 } |
| 185 v8::internal::wasm::AsmWasmBuilder builder(info->isolate(), info->zone(), | 162 v8::internal::wasm::AsmWasmBuilder builder(info->isolate(), info->zone(), |
| 186 info->literal(), &typer); | 163 info->literal(), &typer); |
| 187 i::Handle<i::FixedArray> foreign_globals; | 164 i::Handle<i::FixedArray> foreign_globals; |
| 188 auto module = builder.Run(&foreign_globals); | 165 auto module = builder.Run(&foreign_globals); |
| 189 | 166 |
| 190 i::MaybeHandle<i::FixedArray> compiled = | 167 i::MaybeHandle<i::JSObject> compiled = wasm::CreateModuleObjectFromBytes( |
| 191 CompileModule(info->isolate(), module->begin(), module->end(), &thrower, | 168 info->isolate(), module->begin(), module->end(), &thrower, |
| 192 internal::wasm::kAsmJsOrigin); | 169 internal::wasm::kAsmJsOrigin); |
| 193 DCHECK(!compiled.is_null()); | 170 DCHECK(!compiled.is_null()); |
| 194 | 171 |
| 195 wasm::AsmTyper::StdlibSet uses = typer.StdlibUses(); | 172 wasm::AsmTyper::StdlibSet uses = typer.StdlibUses(); |
| 196 Handle<FixedArray> uses_array = | 173 Handle<FixedArray> uses_array = |
| 197 info->isolate()->factory()->NewFixedArray(static_cast<int>(uses.size())); | 174 info->isolate()->factory()->NewFixedArray(static_cast<int>(uses.size())); |
| 198 int count = 0; | 175 int count = 0; |
| 199 for (auto i : uses) { | 176 for (auto i : uses) { |
| 200 uses_array->set(count++, Smi::FromInt(i)); | 177 uses_array->set(count++, Smi::FromInt(i)); |
| 201 } | 178 } |
| 202 | 179 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 216 return false; | 193 return false; |
| 217 } | 194 } |
| 218 } | 195 } |
| 219 return true; | 196 return true; |
| 220 } | 197 } |
| 221 | 198 |
| 222 MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate, | 199 MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate, |
| 223 Handle<FixedArray> wasm_data, | 200 Handle<FixedArray> wasm_data, |
| 224 Handle<JSArrayBuffer> memory, | 201 Handle<JSArrayBuffer> memory, |
| 225 Handle<JSReceiver> foreign) { | 202 Handle<JSReceiver> foreign) { |
| 226 i::Handle<i::FixedArray> compiled(i::FixedArray::cast(wasm_data->get(0))); | 203 i::Handle<i::JSObject> module(i::JSObject::cast(wasm_data->get(0))); |
| 204 i::Handle<i::FixedArray> compiled( |
| 205 i::FixedArray::cast(module->GetInternalField(0))); |
| 227 i::Handle<i::FixedArray> foreign_globals( | 206 i::Handle<i::FixedArray> foreign_globals( |
| 228 i::FixedArray::cast(wasm_data->get(1))); | 207 i::FixedArray::cast(wasm_data->get(1))); |
| 229 | 208 |
| 230 ErrorThrower thrower(isolate, "Asm.js -> WebAssembly instantiation"); | 209 ErrorThrower thrower(isolate, "Asm.js -> WebAssembly instantiation"); |
| 231 | 210 |
| 232 i::MaybeHandle<i::JSObject> maybe_module_object = | 211 i::MaybeHandle<i::JSObject> maybe_module_object = |
| 233 i::wasm::WasmModule::Instantiate(isolate, compiled, foreign, memory); | 212 i::wasm::WasmModule::Instantiate(isolate, compiled, foreign, memory); |
| 234 if (maybe_module_object.is_null()) { | 213 if (maybe_module_object.is_null()) { |
| 235 return MaybeHandle<Object>(); | 214 return MaybeHandle<Object>(); |
| 236 } | 215 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 266 isolate, init, undefined, foreign_globals->length(), foreign_args_array); | 245 isolate, init, undefined, foreign_globals->length(), foreign_args_array); |
| 267 delete[] foreign_args_array; | 246 delete[] foreign_args_array; |
| 268 | 247 |
| 269 DCHECK(!retval.is_null()); | 248 DCHECK(!retval.is_null()); |
| 270 | 249 |
| 271 return maybe_module_object; | 250 return maybe_module_object; |
| 272 } | 251 } |
| 273 | 252 |
| 274 } // namespace internal | 253 } // namespace internal |
| 275 } // namespace v8 | 254 } // namespace v8 |
| OLD | NEW |