| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 | 573 |
| 574 // TODO(rossberg): all RecordTypeFeedback functions should disappear | 574 // TODO(rossberg): all RecordTypeFeedback functions should disappear |
| 575 // once we use the common type field in the AST consistently. | 575 // once we use the common type field in the AST consistently. |
| 576 | 576 |
| 577 | 577 |
| 578 void Expression::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) { | 578 void Expression::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) { |
| 579 to_boolean_types_ = oracle->ToBooleanTypes(test_id()); | 579 to_boolean_types_ = oracle->ToBooleanTypes(test_id()); |
| 580 } | 580 } |
| 581 | 581 |
| 582 | 582 |
| 583 void Assignment::RecordTypeFeedback(TypeFeedbackOracle* oracle, | |
| 584 Zone* zone) { | |
| 585 Property* prop = target()->AsProperty(); | |
| 586 ASSERT(prop != NULL); | |
| 587 TypeFeedbackId id = AssignmentFeedbackId(); | |
| 588 is_uninitialized_ = oracle->StoreIsUninitialized(id); | |
| 589 if (is_uninitialized_) return; | |
| 590 | |
| 591 is_pre_monomorphic_ = oracle->StoreIsPreMonomorphic(id); | |
| 592 is_monomorphic_ = oracle->StoreIsMonomorphicNormal(id); | |
| 593 ASSERT(!is_pre_monomorphic_ || !is_monomorphic_); | |
| 594 receiver_types_.Clear(); | |
| 595 if (prop->key()->IsPropertyName()) { | |
| 596 Literal* lit_key = prop->key()->AsLiteral(); | |
| 597 ASSERT(lit_key != NULL && lit_key->value()->IsString()); | |
| 598 Handle<String> name = Handle<String>::cast(lit_key->value()); | |
| 599 oracle->StoreReceiverTypes(this, name, &receiver_types_); | |
| 600 } else if (is_monomorphic_) { | |
| 601 // Record receiver type for monomorphic keyed stores. | |
| 602 receiver_types_.Add(oracle->StoreMonomorphicReceiverType(id), zone); | |
| 603 store_mode_ = oracle->GetStoreMode(id); | |
| 604 } else if (oracle->StoreIsKeyedPolymorphic(id)) { | |
| 605 receiver_types_.Reserve(kMaxKeyedPolymorphism, zone); | |
| 606 oracle->CollectKeyedReceiverTypes(id, &receiver_types_); | |
| 607 store_mode_ = oracle->GetStoreMode(id); | |
| 608 } | |
| 609 } | |
| 610 | |
| 611 | |
| 612 bool Call::ComputeTarget(Handle<Map> type, Handle<String> name) { | 583 bool Call::ComputeTarget(Handle<Map> type, Handle<String> name) { |
| 613 // If there is an interceptor, we can't compute the target for a direct call. | 584 // If there is an interceptor, we can't compute the target for a direct call. |
| 614 if (type->has_named_interceptor()) return false; | 585 if (type->has_named_interceptor()) return false; |
| 615 | 586 |
| 616 if (check_type_ == RECEIVER_MAP_CHECK) { | 587 if (check_type_ == RECEIVER_MAP_CHECK) { |
| 617 // For primitive checks the holder is set up to point to the corresponding | 588 // For primitive checks the holder is set up to point to the corresponding |
| 618 // prototype object, i.e. one step of the algorithm below has been already | 589 // prototype object, i.e. one step of the algorithm below has been already |
| 619 // performed. For non-primitive checks we clear it to allow computing | 590 // performed. For non-primitive checks we clear it to allow computing |
| 620 // targets for polymorphic calls. | 591 // targets for polymorphic calls. |
| 621 holder_ = Handle<JSObject>::null(); | 592 holder_ = Handle<JSObject>::null(); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 function = native_context->boolean_function(); | 675 function = native_context->boolean_function(); |
| 705 break; | 676 break; |
| 706 } | 677 } |
| 707 ASSERT(function != NULL); | 678 ASSERT(function != NULL); |
| 708 return Handle<JSObject>(JSObject::cast(function->instance_prototype())); | 679 return Handle<JSObject>(JSObject::cast(function->instance_prototype())); |
| 709 } | 680 } |
| 710 | 681 |
| 711 | 682 |
| 712 void Call::RecordTypeFeedback(TypeFeedbackOracle* oracle, | 683 void Call::RecordTypeFeedback(TypeFeedbackOracle* oracle, |
| 713 CallKind call_kind) { | 684 CallKind call_kind) { |
| 714 is_monomorphic_ = oracle->CallIsMonomorphic(this); | 685 is_monomorphic_ = oracle->CallIsMonomorphic(CallFeedbackId()); |
| 715 Property* property = expression()->AsProperty(); | 686 Property* property = expression()->AsProperty(); |
| 716 if (property == NULL) { | 687 if (property == NULL) { |
| 717 // Function call. Specialize for monomorphic calls. | 688 // Function call. Specialize for monomorphic calls. |
| 718 if (is_monomorphic_) target_ = oracle->GetCallTarget(this); | 689 if (is_monomorphic_) target_ = oracle->GetCallTarget(CallFeedbackId()); |
| 719 } else if (property->key()->IsPropertyName()) { | 690 } else if (property->key()->IsPropertyName()) { |
| 720 // Method call. Specialize for the receiver types seen at runtime. | 691 // Method call. Specialize for the receiver types seen at runtime. |
| 721 Literal* key = property->key()->AsLiteral(); | 692 Literal* key = property->key()->AsLiteral(); |
| 722 ASSERT(key != NULL && key->value()->IsString()); | 693 ASSERT(key != NULL && key->value()->IsString()); |
| 723 Handle<String> name = Handle<String>::cast(key->value()); | 694 Handle<String> name = Handle<String>::cast(key->value()); |
| 724 check_type_ = oracle->GetCallCheckType(this); | 695 check_type_ = oracle->GetCallCheckType(CallFeedbackId()); |
| 725 receiver_types_.Clear(); | 696 receiver_types_.Clear(); |
| 726 if (check_type_ == RECEIVER_MAP_CHECK) { | 697 if (check_type_ == RECEIVER_MAP_CHECK) { |
| 727 oracle->CallReceiverTypes(this, name, call_kind, &receiver_types_); | 698 oracle->CallReceiverTypes(CallFeedbackId(), |
| 699 name, arguments()->length(), call_kind, &receiver_types_); |
| 728 is_monomorphic_ = is_monomorphic_ && receiver_types_.length() > 0; | 700 is_monomorphic_ = is_monomorphic_ && receiver_types_.length() > 0; |
| 729 } else { | 701 } else { |
| 730 holder_ = GetPrototypeForPrimitiveCheck(check_type_, oracle->isolate()); | 702 holder_ = GetPrototypeForPrimitiveCheck(check_type_, oracle->isolate()); |
| 731 receiver_types_.Add(handle(holder_->map()), oracle->zone()); | 703 receiver_types_.Add(handle(holder_->map()), oracle->zone()); |
| 732 } | 704 } |
| 733 #ifdef ENABLE_SLOW_ASSERTS | 705 #ifdef ENABLE_SLOW_ASSERTS |
| 734 if (FLAG_enable_slow_asserts) { | 706 if (FLAG_enable_slow_asserts) { |
| 735 int length = receiver_types_.length(); | 707 int length = receiver_types_.length(); |
| 736 for (int i = 0; i < length; i++) { | 708 for (int i = 0; i < length; i++) { |
| 737 Handle<Map> map = receiver_types_.at(i); | 709 Handle<Map> map = receiver_types_.at(i); |
| 738 ASSERT(!map.is_null() && *map != NULL); | 710 ASSERT(!map.is_null() && *map != NULL); |
| 739 } | 711 } |
| 740 } | 712 } |
| 741 #endif | 713 #endif |
| 742 if (is_monomorphic_) { | 714 if (is_monomorphic_) { |
| 743 Handle<Map> map = receiver_types_.first(); | 715 Handle<Map> map = receiver_types_.first(); |
| 744 is_monomorphic_ = ComputeTarget(map, name); | 716 is_monomorphic_ = ComputeTarget(map, name); |
| 745 } | 717 } |
| 746 } else { | 718 } else { |
| 747 if (is_monomorphic_) { | 719 if (is_monomorphic_) { |
| 748 keyed_array_call_is_holey_ = oracle->KeyedArrayCallIsHoley(this); | 720 keyed_array_call_is_holey_ = |
| 721 oracle->KeyedArrayCallIsHoley(CallFeedbackId()); |
| 749 } | 722 } |
| 750 } | 723 } |
| 751 } | 724 } |
| 752 | 725 |
| 753 | 726 |
| 754 void CallNew::RecordTypeFeedback(TypeFeedbackOracle* oracle) { | 727 void CallNew::RecordTypeFeedback(TypeFeedbackOracle* oracle) { |
| 755 allocation_info_cell_ = oracle->GetCallNewAllocationInfoCell(this); | 728 allocation_info_cell_ = |
| 756 is_monomorphic_ = oracle->CallNewIsMonomorphic(this); | 729 oracle->GetCallNewAllocationInfoCell(CallNewFeedbackId()); |
| 730 is_monomorphic_ = oracle->CallNewIsMonomorphic(CallNewFeedbackId()); |
| 757 if (is_monomorphic_) { | 731 if (is_monomorphic_) { |
| 758 target_ = oracle->GetCallNewTarget(this); | 732 target_ = oracle->GetCallNewTarget(CallNewFeedbackId()); |
| 759 Object* value = allocation_info_cell_->value(); | 733 Object* value = allocation_info_cell_->value(); |
| 760 ASSERT(!value->IsTheHole()); | 734 ASSERT(!value->IsTheHole()); |
| 761 if (value->IsAllocationSite()) { | 735 if (value->IsAllocationSite()) { |
| 762 AllocationSite* site = AllocationSite::cast(value); | 736 AllocationSite* site = AllocationSite::cast(value); |
| 763 elements_kind_ = site->GetElementsKind(); | 737 elements_kind_ = site->GetElementsKind(); |
| 764 } | 738 } |
| 765 } | 739 } |
| 766 } | 740 } |
| 767 | 741 |
| 768 | 742 |
| 769 void ObjectLiteral::Property::RecordTypeFeedback(TypeFeedbackOracle* oracle) { | 743 void ObjectLiteral::Property::RecordTypeFeedback(TypeFeedbackOracle* oracle) { |
| 770 receiver_type_ = oracle->ObjectLiteralStoreIsMonomorphic(this) | 744 TypeFeedbackId id = key()->LiteralFeedbackId(); |
| 771 ? oracle->GetObjectLiteralStoreMap(this) | 745 receiver_type_ = oracle->ObjectLiteralStoreIsMonomorphic(id) |
| 772 : Handle<Map>::null(); | 746 ? oracle->GetObjectLiteralStoreMap(id) : Handle<Map>::null(); |
| 773 } | 747 } |
| 774 | 748 |
| 775 | 749 |
| 776 // ---------------------------------------------------------------------------- | 750 // ---------------------------------------------------------------------------- |
| 777 // Implementation of AstVisitor | 751 // Implementation of AstVisitor |
| 778 | 752 |
| 779 void AstVisitor::VisitDeclarations(ZoneList<Declaration*>* declarations) { | 753 void AstVisitor::VisitDeclarations(ZoneList<Declaration*>* declarations) { |
| 780 for (int i = 0; i < declarations->length(); i++) { | 754 for (int i = 0; i < declarations->length(); i++) { |
| 781 Visit(declarations->at(i)); | 755 Visit(declarations->at(i)); |
| 782 } | 756 } |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1270 OS::SNPrintF(buffer, "%d", Smi::cast(*value_)->value()); | 1244 OS::SNPrintF(buffer, "%d", Smi::cast(*value_)->value()); |
| 1271 str = arr; | 1245 str = arr; |
| 1272 } else { | 1246 } else { |
| 1273 str = DoubleToCString(value_->Number(), buffer); | 1247 str = DoubleToCString(value_->Number(), buffer); |
| 1274 } | 1248 } |
| 1275 return isolate_->factory()->NewStringFromAscii(CStrVector(str)); | 1249 return isolate_->factory()->NewStringFromAscii(CStrVector(str)); |
| 1276 } | 1250 } |
| 1277 | 1251 |
| 1278 | 1252 |
| 1279 } } // namespace v8::internal | 1253 } } // namespace v8::internal |
| OLD | NEW |