| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/double.h" | 8 #include "src/double.h" |
| 9 #include "src/factory.h" | 9 #include "src/factory.h" |
| 10 #include "src/hydrogen-infer-representation.h" | 10 #include "src/hydrogen-infer-representation.h" |
| (...skipping 1771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1782 : HValue::InferRange(zone); | 1782 : HValue::InferRange(zone); |
| 1783 result->set_can_be_minus_zero(!to().IsSmiOrInteger32() || | 1783 result->set_can_be_minus_zero(!to().IsSmiOrInteger32() || |
| 1784 !(CheckFlag(kAllUsesTruncatingToInt32) || | 1784 !(CheckFlag(kAllUsesTruncatingToInt32) || |
| 1785 CheckFlag(kAllUsesTruncatingToSmi))); | 1785 CheckFlag(kAllUsesTruncatingToSmi))); |
| 1786 if (to().IsSmi()) result->ClampToSmi(); | 1786 if (to().IsSmi()) result->ClampToSmi(); |
| 1787 return result; | 1787 return result; |
| 1788 } | 1788 } |
| 1789 | 1789 |
| 1790 | 1790 |
| 1791 Range* HConstant::InferRange(Zone* zone) { | 1791 Range* HConstant::InferRange(Zone* zone) { |
| 1792 if (has_int32_value_) { | 1792 if (HasInteger32Value()) { |
| 1793 Range* result = new(zone) Range(int32_value_, int32_value_); | 1793 Range* result = new(zone) Range(int32_value_, int32_value_); |
| 1794 result->set_can_be_minus_zero(false); | 1794 result->set_can_be_minus_zero(false); |
| 1795 return result; | 1795 return result; |
| 1796 } | 1796 } |
| 1797 return HValue::InferRange(zone); | 1797 return HValue::InferRange(zone); |
| 1798 } | 1798 } |
| 1799 | 1799 |
| 1800 | 1800 |
| 1801 HSourcePosition HPhi::position() const { | 1801 HSourcePosition HPhi::position() const { |
| 1802 return block()->first()->position(); | 1802 return block()->first()->position(); |
| (...skipping 796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2599 } | 2599 } |
| 2600 os << NameOf(values_[i]); | 2600 os << NameOf(values_[i]); |
| 2601 if (i > 0) os << ","; | 2601 if (i > 0) os << ","; |
| 2602 } | 2602 } |
| 2603 } | 2603 } |
| 2604 return os; | 2604 return os; |
| 2605 } | 2605 } |
| 2606 | 2606 |
| 2607 | 2607 |
| 2608 void HSimulate::ReplayEnvironment(HEnvironment* env) { | 2608 void HSimulate::ReplayEnvironment(HEnvironment* env) { |
| 2609 if (done_with_replay_) return; | 2609 if (is_done_with_replay()) return; |
| 2610 DCHECK(env != NULL); | 2610 DCHECK(env != NULL); |
| 2611 env->set_ast_id(ast_id()); | 2611 env->set_ast_id(ast_id()); |
| 2612 env->Drop(pop_count()); | 2612 env->Drop(pop_count()); |
| 2613 for (int i = values()->length() - 1; i >= 0; --i) { | 2613 for (int i = values()->length() - 1; i >= 0; --i) { |
| 2614 HValue* value = values()->at(i); | 2614 HValue* value = values()->at(i); |
| 2615 if (HasAssignedIndexAt(i)) { | 2615 if (HasAssignedIndexAt(i)) { |
| 2616 env->Bind(GetAssignedIndexAt(i), value); | 2616 env->Bind(GetAssignedIndexAt(i), value); |
| 2617 } else { | 2617 } else { |
| 2618 env->Push(value); | 2618 env->Push(value); |
| 2619 } | 2619 } |
| 2620 } | 2620 } |
| 2621 done_with_replay_ = true; | 2621 set_done_with_replay(); |
| 2622 } | 2622 } |
| 2623 | 2623 |
| 2624 | 2624 |
| 2625 static void ReplayEnvironmentNested(const ZoneList<HValue*>* values, | 2625 static void ReplayEnvironmentNested(const ZoneList<HValue*>* values, |
| 2626 HCapturedObject* other) { | 2626 HCapturedObject* other) { |
| 2627 for (int i = 0; i < values->length(); ++i) { | 2627 for (int i = 0; i < values->length(); ++i) { |
| 2628 HValue* value = values->at(i); | 2628 HValue* value = values->at(i); |
| 2629 if (value->IsCapturedObject()) { | 2629 if (value->IsCapturedObject()) { |
| 2630 if (HCapturedObject::cast(value)->capture_id() == other->capture_id()) { | 2630 if (HCapturedObject::cast(value)->capture_id() == other->capture_id()) { |
| 2631 values->at(i) = other; | 2631 values->at(i) = other; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2667 } | 2667 } |
| 2668 | 2668 |
| 2669 | 2669 |
| 2670 static bool IsInteger32(double value) { | 2670 static bool IsInteger32(double value) { |
| 2671 double roundtrip_value = static_cast<double>(static_cast<int32_t>(value)); | 2671 double roundtrip_value = static_cast<double>(static_cast<int32_t>(value)); |
| 2672 return bit_cast<int64_t>(roundtrip_value) == bit_cast<int64_t>(value); | 2672 return bit_cast<int64_t>(roundtrip_value) == bit_cast<int64_t>(value); |
| 2673 } | 2673 } |
| 2674 | 2674 |
| 2675 | 2675 |
| 2676 HConstant::HConstant(Handle<Object> object, Representation r) | 2676 HConstant::HConstant(Handle<Object> object, Representation r) |
| 2677 : HTemplateInstruction<0>(HType::FromValue(object)), | 2677 : HTemplateInstruction<0>(HType::FromValue(object)), |
| 2678 object_(Unique<Object>::CreateUninitialized(object)), | 2678 object_(Unique<Object>::CreateUninitialized(object)), |
| 2679 object_map_(Handle<Map>::null()), | 2679 object_map_(Handle<Map>::null()), |
| 2680 has_stable_map_value_(false), | 2680 bit_field_(HasStableMapValueField::encode(false) | |
| 2681 has_smi_value_(false), | 2681 HasSmiValueField::encode(false) | |
| 2682 has_int32_value_(false), | 2682 HasInt32ValueField::encode(false) | |
| 2683 has_double_value_(false), | 2683 HasDoubleValueField::encode(false) | |
| 2684 has_external_reference_value_(false), | 2684 HasExternalReferenceValueField::encode(false) | |
| 2685 is_not_in_new_space_(true), | 2685 IsNotInNewSpaceField::encode(true) | |
| 2686 boolean_value_(object->BooleanValue()), | 2686 BooleanValueField::encode(object->BooleanValue()) | |
| 2687 is_undetectable_(false), | 2687 IsUndetectableField::encode(false) | |
| 2688 instance_type_(kUnknownInstanceType) { | 2688 InstanceTypeField::encode(kUnknownInstanceType)) { |
| 2689 if (object->IsHeapObject()) { | 2689 if (object->IsHeapObject()) { |
| 2690 Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object); | 2690 Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object); |
| 2691 Isolate* isolate = heap_object->GetIsolate(); | 2691 Isolate* isolate = heap_object->GetIsolate(); |
| 2692 Handle<Map> map(heap_object->map(), isolate); | 2692 Handle<Map> map(heap_object->map(), isolate); |
| 2693 is_not_in_new_space_ = !isolate->heap()->InNewSpace(*object); | 2693 bit_field_ = IsNotInNewSpaceField::update( |
| 2694 instance_type_ = map->instance_type(); | 2694 bit_field_, !isolate->heap()->InNewSpace(*object)); |
| 2695 is_undetectable_ = map->is_undetectable(); | 2695 bit_field_ = InstanceTypeField::update(bit_field_, map->instance_type()); |
| 2696 bit_field_ = |
| 2697 IsUndetectableField::update(bit_field_, map->is_undetectable()); |
| 2696 if (map->is_stable()) object_map_ = Unique<Map>::CreateImmovable(map); | 2698 if (map->is_stable()) object_map_ = Unique<Map>::CreateImmovable(map); |
| 2697 has_stable_map_value_ = (instance_type_ == MAP_TYPE && | 2699 bit_field_ = HasStableMapValueField::update( |
| 2698 Handle<Map>::cast(heap_object)->is_stable()); | 2700 bit_field_, |
| 2701 HasMapValue() && Handle<Map>::cast(heap_object)->is_stable()); |
| 2699 } | 2702 } |
| 2700 if (object->IsNumber()) { | 2703 if (object->IsNumber()) { |
| 2701 double n = object->Number(); | 2704 double n = object->Number(); |
| 2702 has_int32_value_ = IsInteger32(n); | 2705 bool has_int32_value = IsInteger32(n); |
| 2706 bit_field_ = HasInt32ValueField::update(bit_field_, has_int32_value); |
| 2703 int32_value_ = DoubleToInt32(n); | 2707 int32_value_ = DoubleToInt32(n); |
| 2704 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); | 2708 bit_field_ = HasSmiValueField::update( |
| 2709 bit_field_, has_int32_value && Smi::IsValid(int32_value_)); |
| 2705 double_value_ = n; | 2710 double_value_ = n; |
| 2706 has_double_value_ = true; | 2711 bit_field_ = HasDoubleValueField::update(bit_field_, true); |
| 2707 // TODO(titzer): if this heap number is new space, tenure a new one. | 2712 // TODO(titzer): if this heap number is new space, tenure a new one. |
| 2708 } | 2713 } |
| 2709 | 2714 |
| 2710 Initialize(r); | 2715 Initialize(r); |
| 2711 } | 2716 } |
| 2712 | 2717 |
| 2713 | 2718 |
| 2714 HConstant::HConstant(Unique<Object> object, | 2719 HConstant::HConstant(Unique<Object> object, Unique<Map> object_map, |
| 2715 Unique<Map> object_map, | 2720 bool has_stable_map_value, Representation r, HType type, |
| 2716 bool has_stable_map_value, | 2721 bool is_not_in_new_space, bool boolean_value, |
| 2717 Representation r, | 2722 bool is_undetectable, InstanceType instance_type) |
| 2718 HType type, | 2723 : HTemplateInstruction<0>(type), |
| 2719 bool is_not_in_new_space, | 2724 object_(object), |
| 2720 bool boolean_value, | 2725 object_map_(object_map), |
| 2721 bool is_undetectable, | 2726 bit_field_(HasStableMapValueField::encode(has_stable_map_value) | |
| 2722 InstanceType instance_type) | 2727 HasSmiValueField::encode(false) | |
| 2723 : HTemplateInstruction<0>(type), | 2728 HasInt32ValueField::encode(false) | |
| 2724 object_(object), | 2729 HasDoubleValueField::encode(false) | |
| 2725 object_map_(object_map), | 2730 HasExternalReferenceValueField::encode(false) | |
| 2726 has_stable_map_value_(has_stable_map_value), | 2731 IsNotInNewSpaceField::encode(is_not_in_new_space) | |
| 2727 has_smi_value_(false), | 2732 BooleanValueField::encode(boolean_value) | |
| 2728 has_int32_value_(false), | 2733 IsUndetectableField::encode(is_undetectable) | |
| 2729 has_double_value_(false), | 2734 InstanceTypeField::encode(instance_type)) { |
| 2730 has_external_reference_value_(false), | |
| 2731 is_not_in_new_space_(is_not_in_new_space), | |
| 2732 boolean_value_(boolean_value), | |
| 2733 is_undetectable_(is_undetectable), | |
| 2734 instance_type_(instance_type) { | |
| 2735 DCHECK(!object.handle().is_null()); | 2735 DCHECK(!object.handle().is_null()); |
| 2736 DCHECK(!type.IsTaggedNumber() || type.IsNone()); | 2736 DCHECK(!type.IsTaggedNumber() || type.IsNone()); |
| 2737 Initialize(r); | 2737 Initialize(r); |
| 2738 } | 2738 } |
| 2739 | 2739 |
| 2740 | 2740 |
| 2741 HConstant::HConstant(int32_t integer_value, | 2741 HConstant::HConstant(int32_t integer_value, Representation r, |
| 2742 Representation r, | 2742 bool is_not_in_new_space, Unique<Object> object) |
| 2743 bool is_not_in_new_space, | 2743 : object_(object), |
| 2744 Unique<Object> object) | 2744 object_map_(Handle<Map>::null()), |
| 2745 : object_(object), | 2745 bit_field_(HasStableMapValueField::encode(false) | |
| 2746 object_map_(Handle<Map>::null()), | 2746 HasSmiValueField::encode(Smi::IsValid(integer_value)) | |
| 2747 has_stable_map_value_(false), | 2747 HasInt32ValueField::encode(true) | |
| 2748 has_smi_value_(Smi::IsValid(integer_value)), | 2748 HasDoubleValueField::encode(true) | |
| 2749 has_int32_value_(true), | 2749 HasExternalReferenceValueField::encode(false) | |
| 2750 has_double_value_(true), | 2750 IsNotInNewSpaceField::encode(is_not_in_new_space) | |
| 2751 has_external_reference_value_(false), | 2751 BooleanValueField::encode(integer_value != 0) | |
| 2752 is_not_in_new_space_(is_not_in_new_space), | 2752 IsUndetectableField::encode(false) | |
| 2753 boolean_value_(integer_value != 0), | 2753 InstanceTypeField::encode(kUnknownInstanceType)), |
| 2754 is_undetectable_(false), | 2754 int32_value_(integer_value), |
| 2755 int32_value_(integer_value), | 2755 double_value_(FastI2D(integer_value)) { |
| 2756 double_value_(FastI2D(integer_value)), | |
| 2757 instance_type_(kUnknownInstanceType) { | |
| 2758 // It's possible to create a constant with a value in Smi-range but stored | 2756 // It's possible to create a constant with a value in Smi-range but stored |
| 2759 // in a (pre-existing) HeapNumber. See crbug.com/349878. | 2757 // in a (pre-existing) HeapNumber. See crbug.com/349878. |
| 2760 bool could_be_heapobject = r.IsTagged() && !object.handle().is_null(); | 2758 bool could_be_heapobject = r.IsTagged() && !object.handle().is_null(); |
| 2761 bool is_smi = has_smi_value_ && !could_be_heapobject; | 2759 bool is_smi = HasSmiValue() && !could_be_heapobject; |
| 2762 set_type(is_smi ? HType::Smi() : HType::TaggedNumber()); | 2760 set_type(is_smi ? HType::Smi() : HType::TaggedNumber()); |
| 2763 Initialize(r); | 2761 Initialize(r); |
| 2764 } | 2762 } |
| 2765 | 2763 |
| 2766 | 2764 |
| 2767 HConstant::HConstant(double double_value, | 2765 HConstant::HConstant(double double_value, Representation r, |
| 2768 Representation r, | 2766 bool is_not_in_new_space, Unique<Object> object) |
| 2769 bool is_not_in_new_space, | 2767 : object_(object), |
| 2770 Unique<Object> object) | 2768 object_map_(Handle<Map>::null()), |
| 2771 : object_(object), | 2769 bit_field_(HasStableMapValueField::encode(false) | |
| 2772 object_map_(Handle<Map>::null()), | 2770 HasInt32ValueField::encode(IsInteger32(double_value)) | |
| 2773 has_stable_map_value_(false), | 2771 HasDoubleValueField::encode(true) | |
| 2774 has_int32_value_(IsInteger32(double_value)), | 2772 HasExternalReferenceValueField::encode(false) | |
| 2775 has_double_value_(true), | 2773 IsNotInNewSpaceField::encode(is_not_in_new_space) | |
| 2776 has_external_reference_value_(false), | 2774 BooleanValueField::encode(double_value != 0 && |
| 2777 is_not_in_new_space_(is_not_in_new_space), | 2775 !std::isnan(double_value)) | |
| 2778 boolean_value_(double_value != 0 && !std::isnan(double_value)), | 2776 IsUndetectableField::encode(false) | |
| 2779 is_undetectable_(false), | 2777 InstanceTypeField::encode(kUnknownInstanceType)), |
| 2780 int32_value_(DoubleToInt32(double_value)), | 2778 int32_value_(DoubleToInt32(double_value)), |
| 2781 double_value_(double_value), | 2779 double_value_(double_value) { |
| 2782 instance_type_(kUnknownInstanceType) { | 2780 bit_field_ = HasSmiValueField::update( |
| 2783 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); | 2781 bit_field_, HasInteger32Value() && Smi::IsValid(int32_value_)); |
| 2784 // It's possible to create a constant with a value in Smi-range but stored | 2782 // It's possible to create a constant with a value in Smi-range but stored |
| 2785 // in a (pre-existing) HeapNumber. See crbug.com/349878. | 2783 // in a (pre-existing) HeapNumber. See crbug.com/349878. |
| 2786 bool could_be_heapobject = r.IsTagged() && !object.handle().is_null(); | 2784 bool could_be_heapobject = r.IsTagged() && !object.handle().is_null(); |
| 2787 bool is_smi = has_smi_value_ && !could_be_heapobject; | 2785 bool is_smi = HasSmiValue() && !could_be_heapobject; |
| 2788 set_type(is_smi ? HType::Smi() : HType::TaggedNumber()); | 2786 set_type(is_smi ? HType::Smi() : HType::TaggedNumber()); |
| 2789 Initialize(r); | 2787 Initialize(r); |
| 2790 } | 2788 } |
| 2791 | 2789 |
| 2792 | 2790 |
| 2793 HConstant::HConstant(ExternalReference reference) | 2791 HConstant::HConstant(ExternalReference reference) |
| 2794 : HTemplateInstruction<0>(HType::Any()), | 2792 : HTemplateInstruction<0>(HType::Any()), |
| 2795 object_(Unique<Object>(Handle<Object>::null())), | 2793 object_(Unique<Object>(Handle<Object>::null())), |
| 2796 object_map_(Handle<Map>::null()), | 2794 object_map_(Handle<Map>::null()), |
| 2797 has_stable_map_value_(false), | 2795 bit_field_( |
| 2798 has_smi_value_(false), | 2796 HasStableMapValueField::encode(false) | |
| 2799 has_int32_value_(false), | 2797 HasSmiValueField::encode(false) | HasInt32ValueField::encode(false) | |
| 2800 has_double_value_(false), | 2798 HasDoubleValueField::encode(false) | |
| 2801 has_external_reference_value_(true), | 2799 HasExternalReferenceValueField::encode(true) | |
| 2802 is_not_in_new_space_(true), | 2800 IsNotInNewSpaceField::encode(true) | BooleanValueField::encode(true) | |
| 2803 boolean_value_(true), | 2801 IsUndetectableField::encode(false) | |
| 2804 is_undetectable_(false), | 2802 InstanceTypeField::encode(kUnknownInstanceType)), |
| 2805 external_reference_value_(reference), | 2803 external_reference_value_(reference) { |
| 2806 instance_type_(kUnknownInstanceType) { | |
| 2807 Initialize(Representation::External()); | 2804 Initialize(Representation::External()); |
| 2808 } | 2805 } |
| 2809 | 2806 |
| 2810 | 2807 |
| 2811 void HConstant::Initialize(Representation r) { | 2808 void HConstant::Initialize(Representation r) { |
| 2812 if (r.IsNone()) { | 2809 if (r.IsNone()) { |
| 2813 if (has_smi_value_ && SmiValuesAre31Bits()) { | 2810 if (HasSmiValue() && SmiValuesAre31Bits()) { |
| 2814 r = Representation::Smi(); | 2811 r = Representation::Smi(); |
| 2815 } else if (has_int32_value_) { | 2812 } else if (HasInteger32Value()) { |
| 2816 r = Representation::Integer32(); | 2813 r = Representation::Integer32(); |
| 2817 } else if (has_double_value_) { | 2814 } else if (HasDoubleValue()) { |
| 2818 r = Representation::Double(); | 2815 r = Representation::Double(); |
| 2819 } else if (has_external_reference_value_) { | 2816 } else if (HasExternalReferenceValue()) { |
| 2820 r = Representation::External(); | 2817 r = Representation::External(); |
| 2821 } else { | 2818 } else { |
| 2822 Handle<Object> object = object_.handle(); | 2819 Handle<Object> object = object_.handle(); |
| 2823 if (object->IsJSObject()) { | 2820 if (object->IsJSObject()) { |
| 2824 // Try to eagerly migrate JSObjects that have deprecated maps. | 2821 // Try to eagerly migrate JSObjects that have deprecated maps. |
| 2825 Handle<JSObject> js_object = Handle<JSObject>::cast(object); | 2822 Handle<JSObject> js_object = Handle<JSObject>::cast(object); |
| 2826 if (js_object->map()->is_deprecated()) { | 2823 if (js_object->map()->is_deprecated()) { |
| 2827 JSObject::TryMigrateInstance(js_object); | 2824 JSObject::TryMigrateInstance(js_object); |
| 2828 } | 2825 } |
| 2829 } | 2826 } |
| 2830 r = Representation::Tagged(); | 2827 r = Representation::Tagged(); |
| 2831 } | 2828 } |
| 2832 } | 2829 } |
| 2833 if (r.IsSmi()) { | 2830 if (r.IsSmi()) { |
| 2834 // If we have an existing handle, zap it, because it might be a heap | 2831 // If we have an existing handle, zap it, because it might be a heap |
| 2835 // number which we must not re-use when copying this HConstant to | 2832 // number which we must not re-use when copying this HConstant to |
| 2836 // Tagged representation later, because having Smi representation now | 2833 // Tagged representation later, because having Smi representation now |
| 2837 // could cause heap object checks not to get emitted. | 2834 // could cause heap object checks not to get emitted. |
| 2838 object_ = Unique<Object>(Handle<Object>::null()); | 2835 object_ = Unique<Object>(Handle<Object>::null()); |
| 2839 } | 2836 } |
| 2840 set_representation(r); | 2837 set_representation(r); |
| 2841 SetFlag(kUseGVN); | 2838 SetFlag(kUseGVN); |
| 2842 } | 2839 } |
| 2843 | 2840 |
| 2844 | 2841 |
| 2845 bool HConstant::ImmortalImmovable() const { | 2842 bool HConstant::ImmortalImmovable() const { |
| 2846 if (has_int32_value_) { | 2843 if (HasInteger32Value()) { |
| 2847 return false; | 2844 return false; |
| 2848 } | 2845 } |
| 2849 if (has_double_value_) { | 2846 if (HasDoubleValue()) { |
| 2850 if (IsSpecialDouble()) { | 2847 if (IsSpecialDouble()) { |
| 2851 return true; | 2848 return true; |
| 2852 } | 2849 } |
| 2853 return false; | 2850 return false; |
| 2854 } | 2851 } |
| 2855 if (has_external_reference_value_) { | 2852 if (HasExternalReferenceValue()) { |
| 2856 return false; | 2853 return false; |
| 2857 } | 2854 } |
| 2858 | 2855 |
| 2859 DCHECK(!object_.handle().is_null()); | 2856 DCHECK(!object_.handle().is_null()); |
| 2860 Heap* heap = isolate()->heap(); | 2857 Heap* heap = isolate()->heap(); |
| 2861 DCHECK(!object_.IsKnownGlobal(heap->minus_zero_value())); | 2858 DCHECK(!object_.IsKnownGlobal(heap->minus_zero_value())); |
| 2862 DCHECK(!object_.IsKnownGlobal(heap->nan_value())); | 2859 DCHECK(!object_.IsKnownGlobal(heap->nan_value())); |
| 2863 return | 2860 return |
| 2864 #define IMMORTAL_IMMOVABLE_ROOT(name) \ | 2861 #define IMMORTAL_IMMOVABLE_ROOT(name) \ |
| 2865 object_.IsKnownGlobal(heap->root(Heap::k##name##RootIndex)) || | 2862 object_.IsKnownGlobal(heap->root(Heap::k##name##RootIndex)) || |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2886 } | 2883 } |
| 2887 if (HasNoUses()) return true; | 2884 if (HasNoUses()) return true; |
| 2888 if (IsCell()) return false; | 2885 if (IsCell()) return false; |
| 2889 if (representation().IsDouble()) return false; | 2886 if (representation().IsDouble()) return false; |
| 2890 if (representation().IsExternal()) return false; | 2887 if (representation().IsExternal()) return false; |
| 2891 return true; | 2888 return true; |
| 2892 } | 2889 } |
| 2893 | 2890 |
| 2894 | 2891 |
| 2895 HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const { | 2892 HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const { |
| 2896 if (r.IsSmi() && !has_smi_value_) return NULL; | 2893 if (r.IsSmi() && !HasSmiValue()) return NULL; |
| 2897 if (r.IsInteger32() && !has_int32_value_) return NULL; | 2894 if (r.IsInteger32() && !HasInteger32Value()) return NULL; |
| 2898 if (r.IsDouble() && !has_double_value_) return NULL; | 2895 if (r.IsDouble() && !HasDoubleValue()) return NULL; |
| 2899 if (r.IsExternal() && !has_external_reference_value_) return NULL; | 2896 if (r.IsExternal() && !HasExternalReferenceValue()) return NULL; |
| 2900 if (has_int32_value_) { | 2897 if (HasInteger32Value()) { |
| 2901 return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, object_); | 2898 return new (zone) HConstant(int32_value_, r, NotInNewSpace(), object_); |
| 2902 } | 2899 } |
| 2903 if (has_double_value_) { | 2900 if (HasDoubleValue()) { |
| 2904 return new(zone) HConstant(double_value_, r, is_not_in_new_space_, object_); | 2901 return new (zone) HConstant(double_value_, r, NotInNewSpace(), object_); |
| 2905 } | 2902 } |
| 2906 if (has_external_reference_value_) { | 2903 if (HasExternalReferenceValue()) { |
| 2907 return new(zone) HConstant(external_reference_value_); | 2904 return new(zone) HConstant(external_reference_value_); |
| 2908 } | 2905 } |
| 2909 DCHECK(!object_.handle().is_null()); | 2906 DCHECK(!object_.handle().is_null()); |
| 2910 return new(zone) HConstant(object_, | 2907 return new (zone) HConstant(object_, object_map_, HasStableMapValue(), r, |
| 2911 object_map_, | 2908 type_, NotInNewSpace(), BooleanValue(), |
| 2912 has_stable_map_value_, | 2909 IsUndetectable(), GetInstanceType()); |
| 2913 r, | |
| 2914 type_, | |
| 2915 is_not_in_new_space_, | |
| 2916 boolean_value_, | |
| 2917 is_undetectable_, | |
| 2918 instance_type_); | |
| 2919 } | 2910 } |
| 2920 | 2911 |
| 2921 | 2912 |
| 2922 Maybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) { | 2913 Maybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) { |
| 2923 HConstant* res = NULL; | 2914 HConstant* res = NULL; |
| 2924 if (has_int32_value_) { | 2915 if (HasInteger32Value()) { |
| 2925 res = new(zone) HConstant(int32_value_, | 2916 res = new (zone) HConstant(int32_value_, Representation::Integer32(), |
| 2926 Representation::Integer32(), | 2917 NotInNewSpace(), object_); |
| 2927 is_not_in_new_space_, | 2918 } else if (HasDoubleValue()) { |
| 2928 object_); | 2919 res = new (zone) |
| 2929 } else if (has_double_value_) { | 2920 HConstant(DoubleToInt32(double_value_), Representation::Integer32(), |
| 2930 res = new(zone) HConstant(DoubleToInt32(double_value_), | 2921 NotInNewSpace(), object_); |
| 2931 Representation::Integer32(), | |
| 2932 is_not_in_new_space_, | |
| 2933 object_); | |
| 2934 } | 2922 } |
| 2935 return Maybe<HConstant*>(res != NULL, res); | 2923 return Maybe<HConstant*>(res != NULL, res); |
| 2936 } | 2924 } |
| 2937 | 2925 |
| 2938 | 2926 |
| 2939 Maybe<HConstant*> HConstant::CopyToTruncatedNumber(Zone* zone) { | 2927 Maybe<HConstant*> HConstant::CopyToTruncatedNumber(Zone* zone) { |
| 2940 HConstant* res = NULL; | 2928 HConstant* res = NULL; |
| 2941 Handle<Object> handle = this->handle(zone->isolate()); | 2929 Handle<Object> handle = this->handle(zone->isolate()); |
| 2942 if (handle->IsBoolean()) { | 2930 if (handle->IsBoolean()) { |
| 2943 res = handle->BooleanValue() ? | 2931 res = handle->BooleanValue() ? |
| 2944 new(zone) HConstant(1) : new(zone) HConstant(0); | 2932 new(zone) HConstant(1) : new(zone) HConstant(0); |
| 2945 } else if (handle->IsUndefined()) { | 2933 } else if (handle->IsUndefined()) { |
| 2946 res = new(zone) HConstant(base::OS::nan_value()); | 2934 res = new(zone) HConstant(base::OS::nan_value()); |
| 2947 } else if (handle->IsNull()) { | 2935 } else if (handle->IsNull()) { |
| 2948 res = new(zone) HConstant(0); | 2936 res = new(zone) HConstant(0); |
| 2949 } | 2937 } |
| 2950 return Maybe<HConstant*>(res != NULL, res); | 2938 return Maybe<HConstant*>(res != NULL, res); |
| 2951 } | 2939 } |
| 2952 | 2940 |
| 2953 | 2941 |
| 2954 std::ostream& HConstant::PrintDataTo(std::ostream& os) const { // NOLINT | 2942 std::ostream& HConstant::PrintDataTo(std::ostream& os) const { // NOLINT |
| 2955 if (has_int32_value_) { | 2943 if (HasInteger32Value()) { |
| 2956 os << int32_value_ << " "; | 2944 os << int32_value_ << " "; |
| 2957 } else if (has_double_value_) { | 2945 } else if (HasDoubleValue()) { |
| 2958 os << double_value_ << " "; | 2946 os << double_value_ << " "; |
| 2959 } else if (has_external_reference_value_) { | 2947 } else if (HasExternalReferenceValue()) { |
| 2960 os << reinterpret_cast<void*>(external_reference_value_.address()) << " "; | 2948 os << reinterpret_cast<void*>(external_reference_value_.address()) << " "; |
| 2961 } else { | 2949 } else { |
| 2962 // The handle() method is silently and lazily mutating the object. | 2950 // The handle() method is silently and lazily mutating the object. |
| 2963 Handle<Object> h = const_cast<HConstant*>(this)->handle(Isolate::Current()); | 2951 Handle<Object> h = const_cast<HConstant*>(this)->handle(Isolate::Current()); |
| 2964 os << Brief(*h) << " "; | 2952 os << Brief(*h) << " "; |
| 2965 if (HasStableMapValue()) os << "[stable-map] "; | 2953 if (HasStableMapValue()) os << "[stable-map] "; |
| 2966 if (HasObjectMap()) os << "[map " << *ObjectMap().handle() << "] "; | 2954 if (HasObjectMap()) os << "[map " << *ObjectMap().handle() << "] "; |
| 2967 } | 2955 } |
| 2968 if (!is_not_in_new_space_) os << "[new space] "; | 2956 if (!NotInNewSpace()) os << "[new space] "; |
| 2969 return os; | 2957 return os; |
| 2970 } | 2958 } |
| 2971 | 2959 |
| 2972 | 2960 |
| 2973 std::ostream& HBinaryOperation::PrintDataTo(std::ostream& os) const { // NOLINT | 2961 std::ostream& HBinaryOperation::PrintDataTo(std::ostream& os) const { // NOLINT |
| 2974 os << NameOf(left()) << " " << NameOf(right()); | 2962 os << NameOf(left()) << " " << NameOf(right()); |
| 2975 if (CheckFlag(kCanOverflow)) os << " !"; | 2963 if (CheckFlag(kCanOverflow)) os << " !"; |
| 2976 if (CheckFlag(kBailoutOnMinusZero)) os << " -0?"; | 2964 if (CheckFlag(kBailoutOnMinusZero)) os << " -0?"; |
| 2977 return os; | 2965 return os; |
| 2978 } | 2966 } |
| (...skipping 1822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4801 break; | 4789 break; |
| 4802 case HObjectAccess::kExternalMemory: | 4790 case HObjectAccess::kExternalMemory: |
| 4803 os << "[external-memory]"; | 4791 os << "[external-memory]"; |
| 4804 break; | 4792 break; |
| 4805 } | 4793 } |
| 4806 | 4794 |
| 4807 return os << "@" << access.offset(); | 4795 return os << "@" << access.offset(); |
| 4808 } | 4796 } |
| 4809 | 4797 |
| 4810 } } // namespace v8::internal | 4798 } } // namespace v8::internal |
| OLD | NEW |