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

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

Issue 2443353002: [wasm] Add support for exporting WebAssembly.Table instances. (Closed)
Patch Set: Fix identity of exported JSFunctions Created 4 years, 1 month 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/wasm/wasm-js.h ('k') | src/wasm/wasm-module.cc » ('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/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 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 return; 418 return;
419 } 419 }
420 if (has_maximum.FromJust()) { 420 if (has_maximum.FromJust()) {
421 if (!GetIntegerProperty(isolate, &thrower, context, descriptor, maximum_key, 421 if (!GetIntegerProperty(isolate, &thrower, context, descriptor, maximum_key,
422 &maximum, initial, max_table_size)) { 422 &maximum, initial, max_table_size)) {
423 return; 423 return;
424 } 424 }
425 } 425 }
426 426
427 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 427 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
428 i::Handle<i::JSFunction> table_ctor( 428 i::Handle<i::FixedArray> fixed_array;
429 i_isolate->native_context()->wasm_table_constructor()); 429 i::Handle<i::JSObject> table_obj = i::WasmJs::CreateWasmTableObject(
430 i::Handle<i::JSObject> table_obj = 430 i_isolate, initial, has_maximum.FromJust(), maximum, &fixed_array);
431 i_isolate->factory()->NewJSObject(table_ctor);
432 i::Handle<i::FixedArray> fixed_array =
433 i_isolate->factory()->NewFixedArray(initial);
434 i::Object* null = i_isolate->heap()->null_value();
435 for (int i = 0; i < initial; ++i) fixed_array->set(i, null);
436 table_obj->SetInternalField(kWasmTableArrayFieldIndex, *fixed_array);
437 table_obj->SetInternalField(
438 kWasmTableMaximumFieldIndex,
439 has_maximum.FromJust()
440 ? static_cast<i::Object*>(i::Smi::FromInt(maximum))
441 : static_cast<i::Object*>(i_isolate->heap()->undefined_value()));
442 i::Handle<i::Symbol> table_sym(i_isolate->native_context()->wasm_table_sym());
443 i::Object::SetProperty(table_obj, table_sym, table_obj, i::STRICT).Check();
444 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue(); 431 v8::ReturnValue<v8::Value> return_value = args.GetReturnValue();
445 return_value.Set(Utils::ToLocal(table_obj)); 432 return_value.Set(Utils::ToLocal(table_obj));
446 } 433 }
447 434
448 void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { 435 void WebAssemblyMemory(const v8::FunctionCallbackInfo<v8::Value>& args) {
449 v8::Isolate* isolate = args.GetIsolate(); 436 v8::Isolate* isolate = args.GetIsolate();
450 HandleScope scope(isolate); 437 HandleScope scope(isolate);
451 ErrorThrower thrower(reinterpret_cast<i::Isolate*>(isolate), 438 ErrorThrower thrower(reinterpret_cast<i::Isolate*>(isolate),
452 "WebAssembly.Module()"); 439 "WebAssembly.Module()");
453 if (args.Length() < 1 || !args[0]->IsObject()) { 440 if (args.Length() < 1 || !args[0]->IsObject()) {
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 kWasmMemoryMaximum, 701 kWasmMemoryMaximum,
715 has_maximum 702 has_maximum
716 ? static_cast<i::Object*>(i::Smi::FromInt(maximum)) 703 ? static_cast<i::Object*>(i::Smi::FromInt(maximum))
717 : static_cast<i::Object*>(i_isolate->heap()->undefined_value())); 704 : static_cast<i::Object*>(i_isolate->heap()->undefined_value()));
718 i::Handle<i::Symbol> memory_sym( 705 i::Handle<i::Symbol> memory_sym(
719 i_isolate->native_context()->wasm_memory_sym()); 706 i_isolate->native_context()->wasm_memory_sym());
720 i::Object::SetProperty(memory_obj, memory_sym, memory_obj, i::STRICT).Check(); 707 i::Object::SetProperty(memory_obj, memory_sym, memory_obj, i::STRICT).Check();
721 return memory_obj; 708 return memory_obj;
722 } 709 }
723 710
711 i::Handle<i::JSObject> i::WasmJs::CreateWasmTableObject(
712 i::Isolate* i_isolate, uint32_t initial, bool has_maximum, uint32_t maximum,
713 i::Handle<i::FixedArray>* array) {
714 i::Handle<i::JSFunction> table_ctor(
715 i_isolate->native_context()->wasm_table_constructor());
716 i::Handle<i::JSObject> table_obj =
717 i_isolate->factory()->NewJSObject(table_ctor);
718 *array = i_isolate->factory()->NewFixedArray(initial);
719 i::Object* null = i_isolate->heap()->null_value();
720 // TODO(titzer): consider moving FixedArray to size_t.
721 for (int i = 0; i < static_cast<int>(initial); ++i) (*array)->set(i, null);
722 table_obj->SetInternalField(kWasmTableArrayFieldIndex, *(*array));
723 table_obj->SetInternalField(
724 kWasmTableMaximumFieldIndex,
725 has_maximum
726 ? static_cast<i::Object*>(i::Smi::FromInt(maximum))
727 : static_cast<i::Object*>(i_isolate->heap()->undefined_value()));
728 i::Handle<i::Symbol> table_sym(i_isolate->native_context()->wasm_table_sym());
729 i::Object::SetProperty(table_obj, table_sym, table_obj, i::STRICT).Check();
730 return table_obj;
731 }
732
724 // TODO(titzer): we use the API to create the function template because the 733 // TODO(titzer): we use the API to create the function template because the
725 // internal guts are too ugly to replicate here. 734 // internal guts are too ugly to replicate here.
726 static i::Handle<i::FunctionTemplateInfo> NewTemplate(i::Isolate* i_isolate, 735 static i::Handle<i::FunctionTemplateInfo> NewTemplate(i::Isolate* i_isolate,
727 FunctionCallback func) { 736 FunctionCallback func) {
728 Isolate* isolate = reinterpret_cast<Isolate*>(i_isolate); 737 Isolate* isolate = reinterpret_cast<Isolate*>(i_isolate);
729 Local<FunctionTemplate> local = FunctionTemplate::New(isolate, func); 738 Local<FunctionTemplate> local = FunctionTemplate::New(isolate, func);
730 return v8::Utils::OpenHandle(*local); 739 return v8::Utils::OpenHandle(*local);
731 } 740 }
732 741
733 namespace internal { 742 namespace internal {
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 if (!memory_object->IsUndefined(isolate)) { 987 if (!memory_object->IsUndefined(isolate)) {
979 DCHECK(IsWasmMemoryObject(isolate, memory_object)); 988 DCHECK(IsWasmMemoryObject(isolate, memory_object));
980 // TODO(gdeepti): This should be a weak list of instance objects 989 // TODO(gdeepti): This should be a weak list of instance objects
981 // for instances that share memory. 990 // for instances that share memory.
982 JSObject::cast(*memory_object) 991 JSObject::cast(*memory_object)
983 ->SetInternalField(kWasmMemoryInstanceObject, *instance); 992 ->SetInternalField(kWasmMemoryInstanceObject, *instance);
984 } 993 }
985 } 994 }
986 } // namespace internal 995 } // namespace internal
987 } // namespace v8 996 } // namespace v8
OLDNEW
« no previous file with comments | « src/wasm/wasm-js.h ('k') | src/wasm/wasm-module.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698