OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 | 410 |
411 KeyedLoadStubCompiler compiler(isolate_); | 411 KeyedLoadStubCompiler compiler(isolate_); |
412 Handle<Code> code = compiler.CompileLoadFunctionPrototype(name); | 412 Handle<Code> code = compiler.CompileLoadFunctionPrototype(name); |
413 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 413 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
414 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 414 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
415 JSObject::UpdateMapCodeCache(receiver, name, code); | 415 JSObject::UpdateMapCodeCache(receiver, name, code); |
416 return code; | 416 return code; |
417 } | 417 } |
418 | 418 |
419 | 419 |
420 Handle<Code> StoreStubCompiler::CompileStoreField(Handle<JSObject> object, | |
421 int index, | |
422 Handle<Map> transition, | |
423 Handle<String> name) { | |
424 CALL_HEAP_FUNCTION( | |
425 isolate(), | |
426 (set_failure(NULL), | |
427 CompileStoreField(*object, index, | |
428 transition.is_null() ? NULL : *transition, | |
429 *name)), | |
430 Code); | |
431 } | |
432 | |
433 | |
434 Handle<Code> StubCache::ComputeStoreField(Handle<String> name, | 420 Handle<Code> StubCache::ComputeStoreField(Handle<String> name, |
435 Handle<JSObject> receiver, | 421 Handle<JSObject> receiver, |
436 int field_index, | 422 int field_index, |
437 Handle<Map> transition, | 423 Handle<Map> transition, |
438 StrictModeFlag strict_mode) { | 424 StrictModeFlag strict_mode) { |
439 PropertyType type = (transition.is_null()) ? FIELD : MAP_TRANSITION; | 425 PropertyType type = (transition.is_null()) ? FIELD : MAP_TRANSITION; |
440 Code::Flags flags = Code::ComputeMonomorphicFlags( | 426 Code::Flags flags = Code::ComputeMonomorphicFlags( |
441 Code::STORE_IC, type, strict_mode); | 427 Code::STORE_IC, type, strict_mode); |
442 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 428 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
443 if (probe->IsCode()) return Handle<Code>::cast(probe); | 429 if (probe->IsCode()) return Handle<Code>::cast(probe); |
444 | 430 |
445 StoreStubCompiler compiler(isolate_, strict_mode); | 431 StoreStubCompiler compiler(isolate_, strict_mode); |
446 Handle<Code> code = | 432 Handle<Code> code = |
447 compiler.CompileStoreField(receiver, field_index, transition, name); | 433 compiler.CompileStoreField(receiver, field_index, transition, name); |
448 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 434 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
449 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 435 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
450 JSObject::UpdateMapCodeCache(receiver, name, code); | 436 JSObject::UpdateMapCodeCache(receiver, name, code); |
451 return code; | 437 return code; |
452 } | 438 } |
453 | 439 |
454 | 440 |
455 Handle<Code> KeyedStoreStubCompiler::CompileStoreElement(Handle<Map> map) { | |
456 CALL_HEAP_FUNCTION(isolate(), | |
457 (set_failure(NULL), | |
458 CompileStoreElement(*map)), | |
459 Code); | |
460 } | |
461 | |
462 | |
463 Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement( | 441 Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement( |
464 Handle<JSObject> receiver, | 442 Handle<JSObject> receiver, |
465 KeyedIC::StubKind stub_kind, | 443 KeyedIC::StubKind stub_kind, |
466 StrictModeFlag strict_mode) { | 444 StrictModeFlag strict_mode) { |
467 Code::Flags flags = | 445 Code::Flags flags = |
468 Code::ComputeMonomorphicFlags( | 446 Code::ComputeMonomorphicFlags( |
469 stub_kind == KeyedIC::LOAD ? Code::KEYED_LOAD_IC | 447 stub_kind == KeyedIC::LOAD ? Code::KEYED_LOAD_IC |
470 : Code::KEYED_STORE_IC, | 448 : Code::KEYED_STORE_IC, |
471 NORMAL, | 449 NORMAL, |
472 strict_mode); | 450 strict_mode); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 if (stub_kind == KeyedIC::LOAD) { | 486 if (stub_kind == KeyedIC::LOAD) { |
509 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, 0)); | 487 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, 0)); |
510 } else { | 488 } else { |
511 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, 0)); | 489 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, 0)); |
512 } | 490 } |
513 JSObject::UpdateMapCodeCache(receiver, name, code); | 491 JSObject::UpdateMapCodeCache(receiver, name, code); |
514 return code; | 492 return code; |
515 } | 493 } |
516 | 494 |
517 | 495 |
518 Handle<Code> KeyedStoreStubCompiler::CompileStorePolymorphic( | |
519 MapHandleList* receiver_maps, | |
520 CodeHandleList* handler_stubs, | |
521 MapHandleList* transitioned_maps) { | |
522 MapList raw_receiver_maps(receiver_maps->length()); | |
523 CodeList raw_handler_stubs(handler_stubs->length()); | |
524 MapList raw_transitioned_maps(transitioned_maps->length()); | |
525 CALL_HEAP_FUNCTION( | |
526 isolate(), | |
527 (set_failure(NULL), | |
528 raw_receiver_maps.Clear(), | |
529 raw_handler_stubs.Clear(), | |
530 raw_transitioned_maps.Clear(), | |
531 CompileStorePolymorphic(UnwrapHandleList(&raw_receiver_maps, | |
532 receiver_maps), | |
533 UnwrapHandleList(&raw_handler_stubs, | |
534 handler_stubs), | |
535 UnwrapHandleList(&raw_transitioned_maps, | |
536 transitioned_maps))), | |
537 Code); | |
538 } | |
539 | |
540 | |
541 Handle<Code> StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { | 496 Handle<Code> StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { |
542 return (strict_mode == kStrictMode) | 497 return (strict_mode == kStrictMode) |
543 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() | 498 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() |
544 : isolate_->builtins()->Builtins::StoreIC_Normal(); | 499 : isolate_->builtins()->Builtins::StoreIC_Normal(); |
545 } | 500 } |
546 | 501 |
547 | 502 |
548 Handle<Code> StoreStubCompiler::CompileStoreGlobal( | |
549 Handle<GlobalObject> object, | |
550 Handle<JSGlobalPropertyCell> holder, | |
551 Handle<String> name) { | |
552 CALL_HEAP_FUNCTION(isolate(), | |
553 (set_failure(NULL), | |
554 CompileStoreGlobal(*object, *holder, *name)), | |
555 Code); | |
556 } | |
557 | |
558 | |
559 Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, | 503 Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, |
560 Handle<GlobalObject> receiver, | 504 Handle<GlobalObject> receiver, |
561 Handle<JSGlobalPropertyCell> cell, | 505 Handle<JSGlobalPropertyCell> cell, |
562 StrictModeFlag strict_mode) { | 506 StrictModeFlag strict_mode) { |
563 Code::Flags flags = Code::ComputeMonomorphicFlags( | 507 Code::Flags flags = Code::ComputeMonomorphicFlags( |
564 Code::STORE_IC, NORMAL, strict_mode); | 508 Code::STORE_IC, NORMAL, strict_mode); |
565 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 509 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
566 if (probe->IsCode()) return Handle<Code>::cast(probe); | 510 if (probe->IsCode()) return Handle<Code>::cast(probe); |
567 | 511 |
568 StoreStubCompiler compiler(isolate_, strict_mode); | 512 StoreStubCompiler compiler(isolate_, strict_mode); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 if (probe->IsCode()) return Handle<Code>::cast(probe); | 566 if (probe->IsCode()) return Handle<Code>::cast(probe); |
623 | 567 |
624 StoreStubCompiler compiler(isolate_, strict_mode); | 568 StoreStubCompiler compiler(isolate_, strict_mode); |
625 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); | 569 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); |
626 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 570 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
627 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 571 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
628 JSObject::UpdateMapCodeCache(receiver, name, code); | 572 JSObject::UpdateMapCodeCache(receiver, name, code); |
629 return code; | 573 return code; |
630 } | 574 } |
631 | 575 |
632 Handle<Code> KeyedStoreStubCompiler::CompileStoreField(Handle<JSObject> object, | |
633 int index, | |
634 Handle<Map> transition, | |
635 Handle<String> name) { | |
636 CALL_HEAP_FUNCTION( | |
637 isolate(), | |
638 (set_failure(NULL), | |
639 CompileStoreField(*object, index, | |
640 transition.is_null() ? NULL : *transition, | |
641 *name)), | |
642 Code); | |
643 } | |
644 | |
645 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, | 576 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, |
646 Handle<JSObject> receiver, | 577 Handle<JSObject> receiver, |
647 int field_index, | 578 int field_index, |
648 Handle<Map> transition, | 579 Handle<Map> transition, |
649 StrictModeFlag strict_mode) { | 580 StrictModeFlag strict_mode) { |
650 PropertyType type = (transition.is_null()) ? FIELD : MAP_TRANSITION; | 581 PropertyType type = (transition.is_null()) ? FIELD : MAP_TRANSITION; |
651 Code::Flags flags = Code::ComputeMonomorphicFlags( | 582 Code::Flags flags = Code::ComputeMonomorphicFlags( |
652 Code::KEYED_STORE_IC, type, strict_mode); | 583 Code::KEYED_STORE_IC, type, strict_mode); |
653 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 584 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
654 if (probe->IsCode()) return Handle<Code>::cast(probe); | 585 if (probe->IsCode()) return Handle<Code>::cast(probe); |
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1609 Code::cast(result->ToObjectUnchecked()), | 1540 Code::cast(result->ToObjectUnchecked()), |
1610 name)); | 1541 name)); |
1611 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, | 1542 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, |
1612 name, | 1543 name, |
1613 Code::cast(result->ToObjectUnchecked()))); | 1544 Code::cast(result->ToObjectUnchecked()))); |
1614 } | 1545 } |
1615 return result; | 1546 return result; |
1616 } | 1547 } |
1617 | 1548 |
1618 | 1549 |
1619 MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { | 1550 Handle<Code> StoreStubCompiler::GetCode(PropertyType type, |
| 1551 Handle<String> name) { |
| 1552 Code::Flags flags = |
| 1553 Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_); |
| 1554 Handle<Code> code = GetCodeWithFlags(flags, name); |
| 1555 PROFILE(isolate(), CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
| 1556 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 1557 return code; |
| 1558 } |
| 1559 |
| 1560 |
| 1561 // TODO(ulan): Eliminate this function when the stub cache is fully |
| 1562 // handlified. |
| 1563 MaybeObject* StoreStubCompiler::TryGetCode(PropertyType type, String* name) { |
1620 Code::Flags flags = | 1564 Code::Flags flags = |
1621 Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_); | 1565 Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_); |
1622 MaybeObject* result = TryGetCodeWithFlags(flags, name); | 1566 MaybeObject* result = TryGetCodeWithFlags(flags, name); |
1623 if (!result->IsFailure()) { | 1567 if (!result->IsFailure()) { |
1624 PROFILE(isolate(), | 1568 PROFILE(isolate(), |
1625 CodeCreateEvent(Logger::STORE_IC_TAG, | 1569 CodeCreateEvent(Logger::STORE_IC_TAG, |
1626 Code::cast(result->ToObjectUnchecked()), | 1570 Code::cast(result->ToObjectUnchecked()), |
1627 name)); | 1571 name)); |
1628 GDBJIT(AddCode(GDBJITInterface::STORE_IC, | 1572 GDBJIT(AddCode(GDBJITInterface::STORE_IC, |
1629 name, | 1573 name, |
1630 Code::cast(result->ToObjectUnchecked()))); | 1574 Code::cast(result->ToObjectUnchecked()))); |
1631 } | 1575 } |
1632 return result; | 1576 return result; |
1633 } | 1577 } |
1634 | 1578 |
1635 | 1579 |
1636 MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type, | 1580 Handle<Code> KeyedStoreStubCompiler::GetCode(PropertyType type, |
1637 String* name, | 1581 Handle<String> name, |
1638 InlineCacheState state) { | 1582 InlineCacheState state) { |
1639 Code::Flags flags = | 1583 Code::Flags flags = |
1640 Code::ComputeFlags(Code::KEYED_STORE_IC, state, strict_mode_, type); | 1584 Code::ComputeFlags(Code::KEYED_STORE_IC, state, strict_mode_, type); |
1641 MaybeObject* result = TryGetCodeWithFlags(flags, name); | 1585 Handle<Code> code = GetCodeWithFlags(flags, name); |
1642 if (!result->IsFailure()) { | 1586 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); |
1643 PROFILE(isolate(), | 1587 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); |
1644 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, | 1588 return code; |
1645 Code::cast(result->ToObjectUnchecked()), | |
1646 name)); | |
1647 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, | |
1648 name, | |
1649 Code::cast(result->ToObjectUnchecked()))); | |
1650 } | |
1651 return result; | |
1652 } | 1589 } |
1653 | 1590 |
1654 | 1591 |
1655 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( | 1592 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( |
1656 MacroAssembler* masm) { | 1593 MacroAssembler* masm) { |
1657 KeyedStoreIC::GenerateSlow(masm); | 1594 KeyedStoreIC::GenerateSlow(masm); |
1658 } | 1595 } |
1659 | 1596 |
1660 | 1597 |
1661 CallStubCompiler::CallStubCompiler(Isolate* isolate, | 1598 CallStubCompiler::CallStubCompiler(Isolate* isolate, |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1838 expected_receiver_type_ = | 1775 expected_receiver_type_ = |
1839 FunctionTemplateInfo::cast(signature->receiver()); | 1776 FunctionTemplateInfo::cast(signature->receiver()); |
1840 } | 1777 } |
1841 } | 1778 } |
1842 | 1779 |
1843 is_simple_api_call_ = true; | 1780 is_simple_api_call_ = true; |
1844 } | 1781 } |
1845 | 1782 |
1846 | 1783 |
1847 } } // namespace v8::internal | 1784 } } // namespace v8::internal |
OLD | NEW |