Chromium Code Reviews| 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/api-natives.h" | 5 #include "src/api-natives.h" |
| 6 #include "src/api.h" | 6 #include "src/api.h" |
| 7 #include "src/asmjs/asm-js.h" | 7 #include "src/asmjs/asm-js.h" |
| 8 #include "src/asmjs/asm-typer.h" | 8 #include "src/asmjs/asm-typer.h" |
| 9 #include "src/asmjs/asm-wasm-builder.h" | 9 #include "src/asmjs/asm-wasm-builder.h" |
| 10 #include "src/assert-scope.h" | 10 #include "src/assert-scope.h" |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 153 } | 153 } |
| 154 | 154 |
| 155 i::Handle<i::JSArrayBuffer> memory = i::Handle<i::JSArrayBuffer>::null(); | 155 i::Handle<i::JSArrayBuffer> memory = i::Handle<i::JSArrayBuffer>::null(); |
| 156 if (args.Length() > 2 && args[2]->IsArrayBuffer()) { | 156 if (args.Length() > 2 && args[2]->IsArrayBuffer()) { |
| 157 Local<Object> obj = Local<Object>::Cast(args[2]); | 157 Local<Object> obj = Local<Object>::Cast(args[2]); |
| 158 i::Handle<i::Object> mem_obj = v8::Utils::OpenHandle(*obj); | 158 i::Handle<i::Object> mem_obj = v8::Utils::OpenHandle(*obj); |
| 159 memory = i::Handle<i::JSArrayBuffer>(i::JSArrayBuffer::cast(*mem_obj)); | 159 memory = i::Handle<i::JSArrayBuffer>(i::JSArrayBuffer::cast(*mem_obj)); |
| 160 } | 160 } |
| 161 | 161 |
| 162 object = i::wasm::WasmModule::Instantiate( | 162 object = i::wasm::WasmModule::Instantiate( |
| 163 isolate, module_object.ToHandleChecked(), ffi, memory); | 163 isolate, thrower, module_object.ToHandleChecked(), ffi, memory); |
| 164 if (!object.is_null()) { | 164 if (!object.is_null()) { |
| 165 args.GetReturnValue().Set(v8::Utils::ToLocal(object.ToHandleChecked())); | 165 args.GetReturnValue().Set(v8::Utils::ToLocal(object.ToHandleChecked())); |
| 166 } | 166 } |
| 167 } | 167 } |
| 168 return object; | 168 return object; |
| 169 } | 169 } |
| 170 | 170 |
| 171 void InstantiateModule(const v8::FunctionCallbackInfo<v8::Value>& args) { | 171 void InstantiateModule(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 172 HandleScope scope(args.GetIsolate()); | 172 HandleScope scope(args.GetIsolate()); |
| 173 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate()); | 173 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate()); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 289 Local<Object> obj = Local<Object>::Cast(args[1]); | 289 Local<Object> obj = Local<Object>::Cast(args[1]); |
| 290 ffi = i::Handle<i::JSReceiver>::cast(v8::Utils::OpenHandle(*obj)); | 290 ffi = i::Handle<i::JSReceiver>::cast(v8::Utils::OpenHandle(*obj)); |
| 291 } | 291 } |
| 292 | 292 |
| 293 i::Handle<i::JSArrayBuffer> memory = i::Handle<i::JSArrayBuffer>::null(); | 293 i::Handle<i::JSArrayBuffer> memory = i::Handle<i::JSArrayBuffer>::null(); |
| 294 if (args.Length() > 2 && args[2]->IsArrayBuffer()) { | 294 if (args.Length() > 2 && args[2]->IsArrayBuffer()) { |
| 295 Local<Object> obj = Local<Object>::Cast(args[2]); | 295 Local<Object> obj = Local<Object>::Cast(args[2]); |
| 296 i::Handle<i::Object> mem_obj = v8::Utils::OpenHandle(*obj); | 296 i::Handle<i::Object> mem_obj = v8::Utils::OpenHandle(*obj); |
| 297 memory = i::Handle<i::JSArrayBuffer>(i::JSArrayBuffer::cast(*mem_obj)); | 297 memory = i::Handle<i::JSArrayBuffer>(i::JSArrayBuffer::cast(*mem_obj)); |
| 298 } | 298 } |
| 299 i::MaybeHandle<i::JSObject> instance = | 299 i::MaybeHandle<i::JSObject> instance = i::wasm::WasmModule::Instantiate( |
| 300 i::wasm::WasmModule::Instantiate(i_isolate, module_obj, ffi, memory); | 300 i_isolate, &thrower, module_obj, ffi, memory); |
| 301 if (instance.is_null()) { | 301 if (instance.is_null()) { |
| 302 thrower.Error("Could not instantiate module"); | 302 if (!thrower.error()) thrower.Error("Could not instantiate module"); |
| 303 return; | 303 return; |
| 304 } | 304 } |
| 305 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); | 305 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| 306 return_value.Set(Utils::ToLocal(instance.ToHandleChecked())); | 306 return_value.Set(Utils::ToLocal(instance.ToHandleChecked())); |
| 307 } | 307 } |
| 308 | 308 |
| 309 bool GetIntegerProperty(v8::Isolate* isolate, ErrorThrower* thrower, | 309 bool GetIntegerProperty(v8::Isolate* isolate, ErrorThrower* thrower, |
| 310 Local<Context> context, Local<v8::Object> object, | 310 Local<Context> context, Local<v8::Object> object, |
| 311 Local<String> property, int* result, int lower_bound, | 311 Local<String> property, int* result, int lower_bound, |
| 312 int upper_bound) { | 312 int upper_bound) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 399 table_obj->SetInternalField(0, *fixed_array); | 399 table_obj->SetInternalField(0, *fixed_array); |
| 400 table_obj->SetInternalField( | 400 table_obj->SetInternalField( |
| 401 1, has_maximum | 401 1, has_maximum |
| 402 ? static_cast<i::Object*>(i::Smi::FromInt(maximum)) | 402 ? static_cast<i::Object*>(i::Smi::FromInt(maximum)) |
| 403 : static_cast<i::Object*>(i_isolate->heap()->undefined_value())); | 403 : static_cast<i::Object*>(i_isolate->heap()->undefined_value())); |
| 404 i::Handle<i::Symbol> table_sym(i_isolate->native_context()->wasm_table_sym()); | 404 i::Handle<i::Symbol> table_sym(i_isolate->native_context()->wasm_table_sym()); |
| 405 i::Object::SetProperty(table_obj, table_sym, table_obj, i::STRICT).Check(); | 405 i::Object::SetProperty(table_obj, table_sym, table_obj, i::STRICT).Check(); |
| 406 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); | 406 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| 407 return_value.Set(Utils::ToLocal(table_obj)); | 407 return_value.Set(Utils::ToLocal(table_obj)); |
| 408 } | 408 } |
| 409 | |
| 409 void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { | 410 void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 410 v8::Isolate* isolate = args.GetIsolate(); | 411 v8::Isolate* isolate = args.GetIsolate(); |
| 411 HandleScope scope(isolate); | 412 HandleScope scope(isolate); |
| 412 ErrorThrower thrower(reinterpret_cast<i::Isolate*>(isolate), | 413 ErrorThrower thrower(reinterpret_cast<i::Isolate*>(isolate), |
| 413 "WebAssembly.Module()"); | 414 "WebAssembly.Module()"); |
| 414 if (args.Length() < 1 || !args[0]->IsObject()) { | 415 if (args.Length() < 1 || !args[0]->IsObject()) { |
| 415 thrower.TypeError("Argument 0 must be a table descriptor"); | 416 thrower.TypeError("Argument 0 must be a table descriptor"); |
| 416 return; | 417 return; |
| 417 } | 418 } |
| 418 Local<Context> context = isolate->GetCurrentContext(); | 419 Local<Context> context = isolate->GetCurrentContext(); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 429 65536)) { | 430 65536)) { |
| 430 if (reinterpret_cast<i::Isolate*>(isolate)->has_pending_exception() || | 431 if (reinterpret_cast<i::Isolate*>(isolate)->has_pending_exception() || |
| 431 thrower.error()) { | 432 thrower.error()) { |
| 432 return; | 433 return; |
| 433 } else { | 434 } else { |
| 434 // There was no error, the property just does not exist. | 435 // There was no error, the property just does not exist. |
| 435 has_maximum = false; | 436 has_maximum = false; |
| 436 } | 437 } |
| 437 } | 438 } |
| 438 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 439 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 439 i::Handle<i::JSFunction> memory_cons( | |
| 440 i_isolate->native_context()->wasm_memory_constructor()); | |
| 441 i::Handle<i::JSObject> memory_obj = | |
| 442 i_isolate->factory()->NewJSObject(memory_cons); | |
| 443 i::Handle<i::JSArrayBuffer> buffer = | 440 i::Handle<i::JSArrayBuffer> buffer = |
| 444 i_isolate->factory()->NewJSArrayBuffer(i::SharedFlag::kNotShared); | 441 i_isolate->factory()->NewJSArrayBuffer(i::SharedFlag::kNotShared); |
| 445 size_t size = static_cast<size_t>(i::wasm::WasmModule::kPageSize) * | 442 size_t size = static_cast<size_t>(i::wasm::WasmModule::kPageSize) * |
| 446 static_cast<size_t>(initial); | 443 static_cast<size_t>(initial); |
| 447 i::JSArrayBuffer::SetupAllocatingData(buffer, i_isolate, size); | 444 i::JSArrayBuffer::SetupAllocatingData(buffer, i_isolate, size); |
| 448 memory_obj->SetInternalField(0, *buffer); | 445 |
| 449 memory_obj->SetInternalField( | 446 i::Handle<i::JSObject> memory_obj = i::WasmJs::CreateWasmMemoryObject( |
| 450 1, has_maximum | 447 i_isolate, buffer, has_maximum, maximum); |
| 451 ? static_cast<i::Object*>(i::Smi::FromInt(maximum)) | |
| 452 : static_cast<i::Object*>(i_isolate->heap()->undefined_value())); | |
| 453 i::Handle<i::Symbol> memory_sym( | |
| 454 i_isolate->native_context()->wasm_memory_sym()); | |
| 455 i::Object::SetProperty(memory_obj, memory_sym, memory_obj, i::STRICT).Check(); | |
| 456 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); | 448 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| 457 return_value.Set(Utils::ToLocal(memory_obj)); | 449 return_value.Set(Utils::ToLocal(memory_obj)); |
| 458 } | 450 } |
| 459 void WebAssemblyTableGetLength( | 451 void WebAssemblyTableGetLength( |
| 460 const v8::FunctionCallbackInfo<v8::Value>& args) { | 452 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 461 // TODO(rossberg) | 453 // TODO(rossberg) |
| 462 } | 454 } |
| 463 void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { | 455 void WebAssemblyTableGrow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 464 // TODO(rossberg) | 456 // TODO(rossberg) |
| 465 } | 457 } |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 485 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 477 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 486 i::Handle<i::JSObject> receiver = | 478 i::Handle<i::JSObject> receiver = |
| 487 i::Handle<i::JSObject>::cast(Utils::OpenHandle(*args.This())); | 479 i::Handle<i::JSObject>::cast(Utils::OpenHandle(*args.This())); |
| 488 i::Handle<i::Object> buffer(receiver->GetInternalField(0), i_isolate); | 480 i::Handle<i::Object> buffer(receiver->GetInternalField(0), i_isolate); |
| 489 DCHECK(buffer->IsJSArrayBuffer()); | 481 DCHECK(buffer->IsJSArrayBuffer()); |
| 490 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); | 482 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); |
| 491 return_value.Set(Utils::ToLocal(buffer)); | 483 return_value.Set(Utils::ToLocal(buffer)); |
| 492 } | 484 } |
| 493 } // namespace | 485 } // namespace |
| 494 | 486 |
| 487 i::Handle<i::JSObject> i::WasmJs::CreateWasmMemoryObject( | |
| 488 i::Isolate* i_isolate, i::Handle<i::JSArrayBuffer> buffer, bool has_maximum, | |
| 489 int maximum) { | |
| 490 i::Handle<i::JSFunction> memory_cons( | |
|
bradnelson
2016/09/23 11:36:01
Unfortunate abreviation in a context with s-exprs
titzer
2016/09/23 12:07:30
Changed to _ctor.
| |
| 491 i_isolate->native_context()->wasm_memory_constructor()); | |
| 492 i::Handle<i::JSObject> memory_obj = | |
| 493 i_isolate->factory()->NewJSObject(memory_cons); | |
| 494 memory_obj->SetInternalField(0, *buffer); | |
| 495 memory_obj->SetInternalField( | |
| 496 1, has_maximum | |
| 497 ? static_cast<i::Object*>(i::Smi::FromInt(maximum)) | |
| 498 : static_cast<i::Object*>(i_isolate->heap()->undefined_value())); | |
| 499 i::Handle<i::Symbol> memory_sym( | |
| 500 i_isolate->native_context()->wasm_memory_sym()); | |
| 501 i::Object::SetProperty(memory_obj, memory_sym, memory_obj, i::STRICT).Check(); | |
| 502 return memory_obj; | |
| 503 } | |
| 504 | |
| 495 // TODO(titzer): we use the API to create the function template because the | 505 // TODO(titzer): we use the API to create the function template because the |
| 496 // internal guts are too ugly to replicate here. | 506 // internal guts are too ugly to replicate here. |
| 497 static i::Handle<i::FunctionTemplateInfo> NewTemplate(i::Isolate* i_isolate, | 507 static i::Handle<i::FunctionTemplateInfo> NewTemplate(i::Isolate* i_isolate, |
| 498 FunctionCallback func) { | 508 FunctionCallback func) { |
| 499 Isolate* isolate = reinterpret_cast<Isolate*>(i_isolate); | 509 Isolate* isolate = reinterpret_cast<Isolate*>(i_isolate); |
| 500 Local<FunctionTemplate> local = FunctionTemplate::New(isolate, func); | 510 Local<FunctionTemplate> local = FunctionTemplate::New(isolate, func); |
| 501 return v8::Utils::OpenHandle(*local); | 511 return v8::Utils::OpenHandle(*local); |
| 502 } | 512 } |
| 503 | 513 |
| 504 namespace internal { | 514 namespace internal { |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 687 int unused_property_fields = in_object_properties - pre_allocated; | 697 int unused_property_fields = in_object_properties - pre_allocated; |
| 688 Handle<Map> map = Map::CopyInitialMap( | 698 Handle<Map> map = Map::CopyInitialMap( |
| 689 prev_map, instance_size, in_object_properties, unused_property_fields); | 699 prev_map, instance_size, in_object_properties, unused_property_fields); |
| 690 | 700 |
| 691 context->set_wasm_function_map(*map); | 701 context->set_wasm_function_map(*map); |
| 692 } | 702 } |
| 693 } | 703 } |
| 694 | 704 |
| 695 } // namespace internal | 705 } // namespace internal |
| 696 } // namespace v8 | 706 } // namespace v8 |
| OLD | NEW |