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

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

Issue 2977113002: [wasm] Fix user properties for exported wasm functions and add extensive tests. (Closed)
Patch Set: Remove .orig files Created 3 years, 5 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
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/wasm/wasm-objects.h" 5 #include "src/wasm/wasm-objects.h"
6 #include "src/utils.h" 6 #include "src/utils.h"
7 7
8 #include "src/assembler-inl.h" 8 #include "src/assembler-inl.h"
9 #include "src/base/iterator.h" 9 #include "src/base/iterator.h"
10 #include "src/compiler/wasm-compiler.h" 10 #include "src/compiler/wasm-compiler.h"
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 } 478 }
479 uint32_t compiled_max_pages = compiled_module()->module()->max_mem_pages; 479 uint32_t compiled_max_pages = compiled_module()->module()->max_mem_pages;
480 Isolate* isolate = GetIsolate(); 480 Isolate* isolate = GetIsolate();
481 assert(compiled_module()->module()->is_wasm()); 481 assert(compiled_module()->module()->is_wasm());
482 isolate->counters()->wasm_wasm_max_mem_pages_count()->AddSample( 482 isolate->counters()->wasm_wasm_max_mem_pages_count()->AddSample(
483 compiled_max_pages); 483 compiled_max_pages);
484 if (compiled_max_pages != 0) return compiled_max_pages; 484 if (compiled_max_pages != 0) return compiled_max_pages;
485 return FLAG_wasm_max_mem_pages; 485 return FLAG_wasm_max_mem_pages;
486 } 486 }
487 487
488 bool WasmExportedFunction::IsWasmExportedFunction(Object* object) {
489 if (!object) return false;
Igor Sheludko 2017/07/18 17:32:39 This check is not necessary. IsJSFunction() will d
titzer 2017/07/18 18:07:40 Done.
490 if (!object->IsJSFunction()) return false;
491 Handle<JSFunction> js_function(JSFunction::cast(object));
492 if (Code::JS_TO_WASM_FUNCTION != js_function->code()->kind()) return false;
493
494 Handle<Symbol> symbol(js_function->GetHeap()->wasm_instance_symbol());
Igor Sheludko 2017/07/18 17:32:38 This way we will reuse an existing handle instead
titzer 2017/07/18 18:07:40 Done.
495 MaybeHandle<Object> result =
496 JSObject::GetPropertyOrElement(js_function, symbol);
497 if (result.is_null()) return false;
498 return result.ToHandleChecked()->IsWasmInstanceObject();
Igor Sheludko 2017/07/18 17:32:38 Canonical way of using MaybeHandles would look lik
titzer 2017/07/18 18:07:40 Done.
499 }
500
488 WasmExportedFunction* WasmExportedFunction::cast(Object* object) { 501 WasmExportedFunction* WasmExportedFunction::cast(Object* object) {
489 DCHECK(object && object->IsJSFunction()); 502 DCHECK(IsWasmExportedFunction(object));
490 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION,
491 JSFunction::cast(object)->code()->kind());
492 // TODO(titzer): brand check for WasmExportedFunction.
493 return reinterpret_cast<WasmExportedFunction*>(object); 503 return reinterpret_cast<WasmExportedFunction*>(object);
494 } 504 }
495 505
506 WasmInstanceObject* WasmExportedFunction::instance() {
507 Handle<Symbol> symbol(GetHeap()->wasm_instance_symbol());
Igor Sheludko 2017/07/18 17:32:38 GetInstance()->wasm_instance_symbol() to avoid han
titzer 2017/07/18 18:07:40 Done.
508 MaybeHandle<Object> result =
509 JSObject::GetPropertyOrElement(handle(this), symbol);
Igor Sheludko 2017/07/18 17:32:38 You are calling handlified code from non-handlifie
titzer 2017/07/18 18:07:40 Done.
510 return WasmInstanceObject::cast(*(result.ToHandleChecked()));
511 }
512
513 int WasmExportedFunction::function_index() {
514 Handle<Symbol> symbol(GetHeap()->wasm_function_index_symbol());
Igor Sheludko 2017/07/18 17:32:38 Same here.
titzer 2017/07/18 18:07:40 Done.
515 MaybeHandle<Object> result =
516 JSObject::GetPropertyOrElement(handle(this), symbol);
Igor Sheludko 2017/07/18 17:32:38 And here. If the index field ever become an inobje
titzer 2017/07/18 18:07:40 I've added a DisallowHeapAllocation here.
517 return result.ToHandleChecked()->Number();
518 }
519
496 Handle<WasmExportedFunction> WasmExportedFunction::New( 520 Handle<WasmExportedFunction> WasmExportedFunction::New(
497 Isolate* isolate, Handle<WasmInstanceObject> instance, 521 Isolate* isolate, Handle<WasmInstanceObject> instance,
498 MaybeHandle<String> maybe_name, int func_index, int arity, 522 MaybeHandle<String> maybe_name, int func_index, int arity,
499 Handle<Code> export_wrapper) { 523 Handle<Code> export_wrapper) {
524 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, export_wrapper->kind());
500 Handle<String> name; 525 Handle<String> name;
501 if (!maybe_name.ToHandle(&name)) { 526 if (!maybe_name.ToHandle(&name)) {
502 EmbeddedVector<char, 16> buffer; 527 EmbeddedVector<char, 16> buffer;
503 int length = SNPrintF(buffer, "%d", func_index); 528 int length = SNPrintF(buffer, "%d", func_index);
504 name = isolate->factory() 529 name = isolate->factory()
505 ->NewStringFromOneByte( 530 ->NewStringFromOneByte(
506 Vector<uint8_t>::cast(buffer.SubVector(0, length))) 531 Vector<uint8_t>::cast(buffer.SubVector(0, length)))
507 .ToHandleChecked(); 532 .ToHandleChecked();
508 } 533 }
509 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, export_wrapper->kind());
510 Handle<SharedFunctionInfo> shared = 534 Handle<SharedFunctionInfo> shared =
511 isolate->factory()->NewSharedFunctionInfo(name, export_wrapper, false); 535 isolate->factory()->NewSharedFunctionInfo(name, export_wrapper, false);
512 shared->set_length(arity); 536 shared->set_length(arity);
513 shared->set_internal_formal_parameter_count(arity); 537 shared->set_internal_formal_parameter_count(arity);
514 Handle<JSFunction> js_function = isolate->factory()->NewFunction( 538 Handle<JSFunction> js_function = isolate->factory()->NewFunction(
515 isolate->wasm_function_map(), name, export_wrapper); 539 handle(isolate->native_context()->sloppy_function_map()), name,
Igor Sheludko 2017/07/18 17:32:38 Just isolate->sloppy_function_map() to make it nic
titzer 2017/07/18 18:07:40 Done.
540 export_wrapper);
516 541
517 Handle<WasmExportedFunction> function( 542 js_function->set_shared(*shared);
518 reinterpret_cast<WasmExportedFunction*>(*js_function), isolate); 543 Handle<Symbol> instance_symbol(isolate->heap()->wasm_instance_symbol());
544 JSObject::AddProperty(js_function, instance_symbol, instance, DONT_ENUM);
519 545
520 function->set_shared(*shared); 546 Handle<Symbol> function_index_symbol(
521 function->set_instance(*instance); 547 isolate->heap()->wasm_function_index_symbol());
Igor Sheludko 2017/07/18 17:32:39 s/heap()->// to avoid handle creation.
titzer 2017/07/18 18:07:40 Done.
522 function->set_function_index(func_index); 548 JSObject::AddProperty(js_function, function_index_symbol,
549 isolate->factory()->NewNumber(func_index), DONT_ENUM);
523 550
524 return Handle<WasmExportedFunction>::cast(function); 551 return Handle<WasmExportedFunction>::cast(js_function);
525 } 552 }
526 553
527 bool WasmSharedModuleData::IsWasmSharedModuleData(Object* object) { 554 bool WasmSharedModuleData::IsWasmSharedModuleData(Object* object) {
528 if (!object->IsFixedArray()) return false; 555 if (!object->IsFixedArray()) return false;
529 FixedArray* arr = FixedArray::cast(object); 556 FixedArray* arr = FixedArray::cast(object);
530 if (arr->length() != kFieldCount) return false; 557 if (arr->length() != kFieldCount) return false;
531 Isolate* isolate = arr->GetIsolate(); 558 Isolate* isolate = arr->GetIsolate();
532 if (!arr->get(kModuleWrapperIndex)->IsForeign()) return false; 559 if (!arr->get(kModuleWrapperIndex)->IsForeign()) return false;
533 if (!arr->get(kModuleBytesIndex)->IsUndefined(isolate) && 560 if (!arr->get(kModuleBytesIndex)->IsUndefined(isolate) &&
534 !arr->get(kModuleBytesIndex)->IsSeqOneByteString()) 561 !arr->get(kModuleBytesIndex)->IsSeqOneByteString())
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after
1376 Isolate* isolate, Handle<WasmInstanceObject> instance, Handle<Code> caller, 1403 Isolate* isolate, Handle<WasmInstanceObject> instance, Handle<Code> caller,
1377 int offset, int func_index, bool patch_caller) { 1404 int offset, int func_index, bool patch_caller) {
1378 isolate->set_context(*instance->compiled_module()->native_context()); 1405 isolate->set_context(*instance->compiled_module()->native_context());
1379 Object* orch_obj = 1406 Object* orch_obj =
1380 instance->compiled_module()->shared()->lazy_compilation_orchestrator(); 1407 instance->compiled_module()->shared()->lazy_compilation_orchestrator();
1381 LazyCompilationOrchestrator* orch = 1408 LazyCompilationOrchestrator* orch =
1382 Managed<LazyCompilationOrchestrator>::cast(orch_obj)->get(); 1409 Managed<LazyCompilationOrchestrator>::cast(orch_obj)->get();
1383 return orch->CompileLazy(isolate, instance, caller, offset, func_index, 1410 return orch->CompileLazy(isolate, instance, caller, offset, func_index,
1384 patch_caller); 1411 patch_caller);
1385 } 1412 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698