| 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/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 Loading... |
| 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->IsJSFunction()) return false; |
| 490 Handle<JSFunction> js_function(JSFunction::cast(object)); |
| 491 if (Code::JS_TO_WASM_FUNCTION != js_function->code()->kind()) return false; |
| 492 |
| 493 Handle<Symbol> symbol( |
| 494 js_function->GetIsolate()->factory()->wasm_instance_symbol()); |
| 495 MaybeHandle<Object> maybe_result = |
| 496 JSObject::GetPropertyOrElement(js_function, symbol); |
| 497 Handle<Object> result; |
| 498 if (!maybe_result.ToHandle(&result)) return false; |
| 499 return result->IsWasmInstanceObject(); |
| 500 } |
| 501 |
| 488 WasmExportedFunction* WasmExportedFunction::cast(Object* object) { | 502 WasmExportedFunction* WasmExportedFunction::cast(Object* object) { |
| 489 DCHECK(object && object->IsJSFunction()); | 503 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); | 504 return reinterpret_cast<WasmExportedFunction*>(object); |
| 494 } | 505 } |
| 495 | 506 |
| 507 WasmInstanceObject* WasmExportedFunction::instance() { |
| 508 DisallowHeapAllocation no_allocation; |
| 509 Handle<Symbol> symbol(GetIsolate()->factory()->wasm_instance_symbol()); |
| 510 MaybeHandle<Object> result = |
| 511 JSObject::GetPropertyOrElement(handle(this), symbol); |
| 512 return WasmInstanceObject::cast(*(result.ToHandleChecked())); |
| 513 } |
| 514 |
| 515 int WasmExportedFunction::function_index() { |
| 516 DisallowHeapAllocation no_allocation; |
| 517 Handle<Symbol> symbol = GetIsolate()->factory()->wasm_function_index_symbol(); |
| 518 MaybeHandle<Object> result = |
| 519 JSObject::GetPropertyOrElement(handle(this), symbol); |
| 520 return result.ToHandleChecked()->Number(); |
| 521 } |
| 522 |
| 496 Handle<WasmExportedFunction> WasmExportedFunction::New( | 523 Handle<WasmExportedFunction> WasmExportedFunction::New( |
| 497 Isolate* isolate, Handle<WasmInstanceObject> instance, | 524 Isolate* isolate, Handle<WasmInstanceObject> instance, |
| 498 MaybeHandle<String> maybe_name, int func_index, int arity, | 525 MaybeHandle<String> maybe_name, int func_index, int arity, |
| 499 Handle<Code> export_wrapper) { | 526 Handle<Code> export_wrapper) { |
| 527 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, export_wrapper->kind()); |
| 500 Handle<String> name; | 528 Handle<String> name; |
| 501 if (!maybe_name.ToHandle(&name)) { | 529 if (!maybe_name.ToHandle(&name)) { |
| 502 EmbeddedVector<char, 16> buffer; | 530 EmbeddedVector<char, 16> buffer; |
| 503 int length = SNPrintF(buffer, "%d", func_index); | 531 int length = SNPrintF(buffer, "%d", func_index); |
| 504 name = isolate->factory() | 532 name = isolate->factory() |
| 505 ->NewStringFromOneByte( | 533 ->NewStringFromOneByte( |
| 506 Vector<uint8_t>::cast(buffer.SubVector(0, length))) | 534 Vector<uint8_t>::cast(buffer.SubVector(0, length))) |
| 507 .ToHandleChecked(); | 535 .ToHandleChecked(); |
| 508 } | 536 } |
| 509 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, export_wrapper->kind()); | |
| 510 Handle<SharedFunctionInfo> shared = | 537 Handle<SharedFunctionInfo> shared = |
| 511 isolate->factory()->NewSharedFunctionInfo(name, export_wrapper, false); | 538 isolate->factory()->NewSharedFunctionInfo(name, export_wrapper, false); |
| 512 shared->set_length(arity); | 539 shared->set_length(arity); |
| 513 shared->set_internal_formal_parameter_count(arity); | 540 shared->set_internal_formal_parameter_count(arity); |
| 514 Handle<JSFunction> js_function = isolate->factory()->NewFunction( | 541 Handle<JSFunction> js_function = isolate->factory()->NewFunction( |
| 515 isolate->wasm_function_map(), name, export_wrapper); | 542 isolate->sloppy_function_map(), name, export_wrapper); |
| 516 | 543 |
| 517 Handle<WasmExportedFunction> function( | 544 js_function->set_shared(*shared); |
| 518 reinterpret_cast<WasmExportedFunction*>(*js_function), isolate); | 545 Handle<Symbol> instance_symbol(isolate->factory()->wasm_instance_symbol()); |
| 546 JSObject::AddProperty(js_function, instance_symbol, instance, DONT_ENUM); |
| 519 | 547 |
| 520 function->set_shared(*shared); | 548 Handle<Symbol> function_index_symbol( |
| 521 function->set_instance(*instance); | 549 isolate->factory()->wasm_function_index_symbol()); |
| 522 function->set_function_index(func_index); | 550 JSObject::AddProperty(js_function, function_index_symbol, |
| 551 isolate->factory()->NewNumber(func_index), DONT_ENUM); |
| 523 | 552 |
| 524 return Handle<WasmExportedFunction>::cast(function); | 553 return Handle<WasmExportedFunction>::cast(js_function); |
| 525 } | 554 } |
| 526 | 555 |
| 527 bool WasmSharedModuleData::IsWasmSharedModuleData(Object* object) { | 556 bool WasmSharedModuleData::IsWasmSharedModuleData(Object* object) { |
| 528 if (!object->IsFixedArray()) return false; | 557 if (!object->IsFixedArray()) return false; |
| 529 FixedArray* arr = FixedArray::cast(object); | 558 FixedArray* arr = FixedArray::cast(object); |
| 530 if (arr->length() != kFieldCount) return false; | 559 if (arr->length() != kFieldCount) return false; |
| 531 Isolate* isolate = arr->GetIsolate(); | 560 Isolate* isolate = arr->GetIsolate(); |
| 532 if (!arr->get(kModuleWrapperIndex)->IsForeign()) return false; | 561 if (!arr->get(kModuleWrapperIndex)->IsForeign()) return false; |
| 533 if (!arr->get(kModuleBytesIndex)->IsUndefined(isolate) && | 562 if (!arr->get(kModuleBytesIndex)->IsUndefined(isolate) && |
| 534 !arr->get(kModuleBytesIndex)->IsSeqOneByteString()) | 563 !arr->get(kModuleBytesIndex)->IsSeqOneByteString()) |
| (...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1376 Isolate* isolate, Handle<WasmInstanceObject> instance, Handle<Code> caller, | 1405 Isolate* isolate, Handle<WasmInstanceObject> instance, Handle<Code> caller, |
| 1377 int offset, int func_index, bool patch_caller) { | 1406 int offset, int func_index, bool patch_caller) { |
| 1378 isolate->set_context(*instance->compiled_module()->native_context()); | 1407 isolate->set_context(*instance->compiled_module()->native_context()); |
| 1379 Object* orch_obj = | 1408 Object* orch_obj = |
| 1380 instance->compiled_module()->shared()->lazy_compilation_orchestrator(); | 1409 instance->compiled_module()->shared()->lazy_compilation_orchestrator(); |
| 1381 LazyCompilationOrchestrator* orch = | 1410 LazyCompilationOrchestrator* orch = |
| 1382 Managed<LazyCompilationOrchestrator>::cast(orch_obj)->get(); | 1411 Managed<LazyCompilationOrchestrator>::cast(orch_obj)->get(); |
| 1383 return orch->CompileLazy(isolate, instance, caller, offset, func_index, | 1412 return orch->CompileLazy(isolate, instance, caller, offset, func_index, |
| 1384 patch_caller); | 1413 patch_caller); |
| 1385 } | 1414 } |
| OLD | NEW |