| 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 417 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   428     case kTagged: return "tagged"; |   428     case kTagged: return "tagged"; | 
|   429     case kTaggedPrimitive: return "primitive"; |   429     case kTaggedPrimitive: return "primitive"; | 
|   430     case kTaggedNumber: return "number"; |   430     case kTaggedNumber: return "number"; | 
|   431     case kSmi: return "smi"; |   431     case kSmi: return "smi"; | 
|   432     case kHeapNumber: return "heap-number"; |   432     case kHeapNumber: return "heap-number"; | 
|   433     case kString: return "string"; |   433     case kString: return "string"; | 
|   434     case kBoolean: return "boolean"; |   434     case kBoolean: return "boolean"; | 
|   435     case kNonPrimitive: return "non-primitive"; |   435     case kNonPrimitive: return "non-primitive"; | 
|   436     case kJSArray: return "array"; |   436     case kJSArray: return "array"; | 
|   437     case kJSObject: return "object"; |   437     case kJSObject: return "object"; | 
|   438     case kUninitialized: return "uninitialized"; |  | 
|   439   } |   438   } | 
|   440   UNREACHABLE(); |   439   UNREACHABLE(); | 
|   441   return "unreachable"; |   440   return "unreachable"; | 
|   442 } |   441 } | 
|   443  |   442  | 
|   444  |   443  | 
|   445 HType HType::TypeFromValue(Handle<Object> value) { |   444 HType HType::TypeFromValue(Handle<Object> value) { | 
|   446   HType result = HType::Tagged(); |   445   HType result = HType::Tagged(); | 
|   447   if (value->IsSmi()) { |   446   if (value->IsSmi()) { | 
|   448     result = HType::Smi(); |   447     result = HType::Smi(); | 
| (...skipping 1153 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1602  |  1601  | 
|  1603       // Return NULL to remove this instruction from the graph. |  1602       // Return NULL to remove this instruction from the graph. | 
|  1604       return NULL; |  1603       return NULL; | 
|  1605     } |  1604     } | 
|  1606   } |  1605   } | 
|  1607   return this; |  1606   return this; | 
|  1608 } |  1607 } | 
|  1609  |  1608  | 
|  1610  |  1609  | 
|  1611 HValue* HCheckInstanceType::Canonicalize() { |  1610 HValue* HCheckInstanceType::Canonicalize() { | 
|  1612   if (check_ == IS_STRING && |  1611   if (check_ == IS_STRING && value()->type().IsString()) { | 
|  1613       !value()->type().IsUninitialized() && |  | 
|  1614       value()->type().IsString()) { |  | 
|  1615     return NULL; |  1612     return NULL; | 
|  1616   } |  1613   } | 
|  1617  |  1614  | 
|  1618   if (check_ == IS_INTERNALIZED_STRING && value()->IsConstant()) { |  1615   if (check_ == IS_INTERNALIZED_STRING && value()->IsConstant()) { | 
|  1619     if (HConstant::cast(value())->HasInternalizedStringValue()) return NULL; |  1616     if (HConstant::cast(value())->HasInternalizedStringValue()) return NULL; | 
|  1620   } |  1617   } | 
|  1621   return this; |  1618   return this; | 
|  1622 } |  1619 } | 
|  1623  |  1620  | 
|  1624  |  1621  | 
| (...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2604 HConstant::HConstant(Handle<Object> handle, Representation r) |  2601 HConstant::HConstant(Handle<Object> handle, Representation r) | 
|  2605   : handle_(handle), |  2602   : handle_(handle), | 
|  2606     unique_id_(), |  2603     unique_id_(), | 
|  2607     has_smi_value_(false), |  2604     has_smi_value_(false), | 
|  2608     has_int32_value_(false), |  2605     has_int32_value_(false), | 
|  2609     has_double_value_(false), |  2606     has_double_value_(false), | 
|  2610     is_internalized_string_(false), |  2607     is_internalized_string_(false), | 
|  2611     is_not_in_new_space_(true), |  2608     is_not_in_new_space_(true), | 
|  2612     is_cell_(false), |  2609     is_cell_(false), | 
|  2613     boolean_value_(handle->BooleanValue()) { |  2610     boolean_value_(handle->BooleanValue()) { | 
 |  2611   set_type(HType::TypeFromValue(handle)); | 
 |  2612  | 
|  2614   if (handle_->IsHeapObject()) { |  2613   if (handle_->IsHeapObject()) { | 
|  2615     Heap* heap = Handle<HeapObject>::cast(handle)->GetHeap(); |  2614     Heap* heap = Handle<HeapObject>::cast(handle)->GetHeap(); | 
|  2616     is_not_in_new_space_ = !heap->InNewSpace(*handle); |  2615     is_not_in_new_space_ = !heap->InNewSpace(*handle); | 
|  2617   } |  2616   } | 
|  2618   if (handle_->IsNumber()) { |  2617   if (handle_->IsNumber()) { | 
|  2619     double n = handle_->Number(); |  2618     double n = handle_->Number(); | 
|  2620     has_int32_value_ = IsInteger32(n); |  2619     has_int32_value_ = IsInteger32(n); | 
|  2621     int32_value_ = DoubleToInt32(n); |  2620     int32_value_ = DoubleToInt32(n); | 
|  2622     has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); |  2621     has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); | 
|  2623     double_value_ = n; |  2622     double_value_ = n; | 
|  2624     has_double_value_ = true; |  2623     has_double_value_ = true; | 
|  2625   } else { |  2624   } else { | 
|  2626     type_from_value_ = HType::TypeFromValue(handle_); |  | 
|  2627     is_internalized_string_ = handle_->IsInternalizedString(); |  2625     is_internalized_string_ = handle_->IsInternalizedString(); | 
|  2628   } |  2626   } | 
|  2629  |  2627  | 
|  2630   is_cell_ = !handle_.is_null() && |  2628   is_cell_ = !handle_.is_null() && | 
|  2631       (handle_->IsCell() || handle_->IsPropertyCell()); |  2629       (handle_->IsCell() || handle_->IsPropertyCell()); | 
|  2632   Initialize(r); |  2630   Initialize(r); | 
|  2633 } |  2631 } | 
|  2634  |  2632  | 
|  2635  |  2633  | 
|  2636 HConstant::HConstant(Handle<Object> handle, |  2634 HConstant::HConstant(Handle<Object> handle, | 
|  2637                      UniqueValueId unique_id, |  2635                      UniqueValueId unique_id, | 
|  2638                      Representation r, |  2636                      Representation r, | 
|  2639                      HType type, |  2637                      HType type, | 
|  2640                      bool is_internalize_string, |  2638                      bool is_internalize_string, | 
|  2641                      bool is_not_in_new_space, |  2639                      bool is_not_in_new_space, | 
|  2642                      bool is_cell, |  2640                      bool is_cell, | 
|  2643                      bool boolean_value) |  2641                      bool boolean_value) | 
|  2644     : handle_(handle), |  2642     : handle_(handle), | 
|  2645       unique_id_(unique_id), |  2643       unique_id_(unique_id), | 
|  2646       has_smi_value_(false), |  2644       has_smi_value_(false), | 
|  2647       has_int32_value_(false), |  2645       has_int32_value_(false), | 
|  2648       has_double_value_(false), |  2646       has_double_value_(false), | 
|  2649       is_internalized_string_(is_internalize_string), |  2647       is_internalized_string_(is_internalize_string), | 
|  2650       is_not_in_new_space_(is_not_in_new_space), |  2648       is_not_in_new_space_(is_not_in_new_space), | 
|  2651       is_cell_(is_cell), |  2649       is_cell_(is_cell), | 
|  2652       boolean_value_(boolean_value), |  2650       boolean_value_(boolean_value) { | 
|  2653       type_from_value_(type) { |  | 
|  2654   ASSERT(!handle.is_null()); |  2651   ASSERT(!handle.is_null()); | 
|  2655   ASSERT(!type.IsUninitialized()); |  | 
|  2656   ASSERT(!type.IsTaggedNumber()); |  2652   ASSERT(!type.IsTaggedNumber()); | 
 |  2653   set_type(type); | 
|  2657   Initialize(r); |  2654   Initialize(r); | 
|  2658 } |  2655 } | 
|  2659  |  2656  | 
|  2660  |  2657  | 
|  2661 HConstant::HConstant(int32_t integer_value, |  2658 HConstant::HConstant(int32_t integer_value, | 
|  2662                      Representation r, |  2659                      Representation r, | 
|  2663                      bool is_not_in_new_space, |  2660                      bool is_not_in_new_space, | 
|  2664                      Handle<Object> optional_handle) |  2661                      Handle<Object> optional_handle) | 
|  2665     : handle_(optional_handle), |  2662     : handle_(optional_handle), | 
|  2666       unique_id_(), |  2663       unique_id_(), | 
 |  2664       has_smi_value_(Smi::IsValid(integer_value)), | 
|  2667       has_int32_value_(true), |  2665       has_int32_value_(true), | 
|  2668       has_double_value_(true), |  2666       has_double_value_(true), | 
|  2669       is_internalized_string_(false), |  2667       is_internalized_string_(false), | 
|  2670       is_not_in_new_space_(is_not_in_new_space), |  2668       is_not_in_new_space_(is_not_in_new_space), | 
|  2671       is_cell_(false), |  2669       is_cell_(false), | 
|  2672       boolean_value_(integer_value != 0), |  2670       boolean_value_(integer_value != 0), | 
|  2673       int32_value_(integer_value), |  2671       int32_value_(integer_value), | 
|  2674       double_value_(FastI2D(integer_value)) { |  2672       double_value_(FastI2D(integer_value)) { | 
|  2675   has_smi_value_ = Smi::IsValid(int32_value_); |  2673   set_type(has_smi_value_ ? HType::Smi() : HType::TaggedNumber()); | 
|  2676   Initialize(r); |  2674   Initialize(r); | 
|  2677 } |  2675 } | 
|  2678  |  2676  | 
|  2679  |  2677  | 
|  2680 HConstant::HConstant(double double_value, |  2678 HConstant::HConstant(double double_value, | 
|  2681                      Representation r, |  2679                      Representation r, | 
|  2682                      bool is_not_in_new_space, |  2680                      bool is_not_in_new_space, | 
|  2683                      Handle<Object> optional_handle) |  2681                      Handle<Object> optional_handle) | 
|  2684     : handle_(optional_handle), |  2682     : handle_(optional_handle), | 
|  2685       unique_id_(), |  2683       unique_id_(), | 
|  2686       has_int32_value_(IsInteger32(double_value)), |  2684       has_int32_value_(IsInteger32(double_value)), | 
|  2687       has_double_value_(true), |  2685       has_double_value_(true), | 
|  2688       is_internalized_string_(false), |  2686       is_internalized_string_(false), | 
|  2689       is_not_in_new_space_(is_not_in_new_space), |  2687       is_not_in_new_space_(is_not_in_new_space), | 
|  2690       is_cell_(false), |  2688       is_cell_(false), | 
|  2691       boolean_value_(double_value != 0 && !std::isnan(double_value)), |  2689       boolean_value_(double_value != 0 && !std::isnan(double_value)), | 
|  2692       int32_value_(DoubleToInt32(double_value)), |  2690       int32_value_(DoubleToInt32(double_value)), | 
|  2693       double_value_(double_value) { |  2691       double_value_(double_value) { | 
|  2694   has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); |  2692   has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); | 
 |  2693   set_type(has_smi_value_ ? HType::Smi() : HType::TaggedNumber()); | 
|  2695   Initialize(r); |  2694   Initialize(r); | 
|  2696 } |  2695 } | 
|  2697  |  2696  | 
|  2698  |  2697  | 
|  2699 void HConstant::Initialize(Representation r) { |  2698 void HConstant::Initialize(Representation r) { | 
|  2700   if (r.IsNone()) { |  2699   if (r.IsNone()) { | 
|  2701     if (has_smi_value_) { |  2700     if (has_smi_value_) { | 
|  2702       r = Representation::Smi(); |  2701       r = Representation::Smi(); | 
|  2703     } else if (has_int32_value_) { |  2702     } else if (has_int32_value_) { | 
|  2704       r = Representation::Integer32(); |  2703       r = Representation::Integer32(); | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
|  2731   if (has_int32_value_) { |  2730   if (has_int32_value_) { | 
|  2732     return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, handle_); |  2731     return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, handle_); | 
|  2733   } |  2732   } | 
|  2734   if (has_double_value_) { |  2733   if (has_double_value_) { | 
|  2735     return new(zone) HConstant(double_value_, r, is_not_in_new_space_, handle_); |  2734     return new(zone) HConstant(double_value_, r, is_not_in_new_space_, handle_); | 
|  2736   } |  2735   } | 
|  2737   ASSERT(!handle_.is_null()); |  2736   ASSERT(!handle_.is_null()); | 
|  2738   return new(zone) HConstant(handle_, |  2737   return new(zone) HConstant(handle_, | 
|  2739                              unique_id_, |  2738                              unique_id_, | 
|  2740                              r, |  2739                              r, | 
|  2741                              type_from_value_, |  2740                              type_, | 
|  2742                              is_internalized_string_, |  2741                              is_internalized_string_, | 
|  2743                              is_not_in_new_space_, |  2742                              is_not_in_new_space_, | 
|  2744                              is_cell_, |  2743                              is_cell_, | 
|  2745                              boolean_value_); |  2744                              boolean_value_); | 
|  2746 } |  2745 } | 
|  2747  |  2746  | 
|  2748  |  2747  | 
|  2749 Maybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) { |  2748 Maybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) { | 
|  2750   HConstant* res = NULL; |  2749   HConstant* res = NULL; | 
|  2751   if (has_int32_value_) { |  2750   if (has_int32_value_) { | 
| (...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3603   return HType::NonPrimitive(); |  3602   return HType::NonPrimitive(); | 
|  3604 } |  3603 } | 
|  3605  |  3604  | 
|  3606  |  3605  | 
|  3607 HType HCheckSmi::CalculateInferredType() { |  3606 HType HCheckSmi::CalculateInferredType() { | 
|  3608   return HType::Smi(); |  3607   return HType::Smi(); | 
|  3609 } |  3608 } | 
|  3610  |  3609  | 
|  3611  |  3610  | 
|  3612 HType HPhi::CalculateInferredType() { |  3611 HType HPhi::CalculateInferredType() { | 
|  3613   HType result = HType::Uninitialized(); |  3612   if (OperandCount() == 0) return HType::Tagged(); | 
|  3614   for (int i = 0; i < OperandCount(); ++i) { |  3613   HType result = OperandAt(0)->type(); | 
 |  3614   for (int i = 1; i < OperandCount(); ++i) { | 
|  3615     HType current = OperandAt(i)->type(); |  3615     HType current = OperandAt(i)->type(); | 
|  3616     result = result.Combine(current); |  3616     result = result.Combine(current); | 
|  3617   } |  3617   } | 
|  3618   return result; |  3618   return result; | 
|  3619 } |  3619 } | 
|  3620  |  3620  | 
|  3621  |  3621  | 
|  3622 HType HConstant::CalculateInferredType() { |  | 
|  3623   if (has_int32_value_) { |  | 
|  3624     return Smi::IsValid(int32_value_) ? HType::Smi() : HType::HeapNumber(); |  | 
|  3625   } |  | 
|  3626   if (has_double_value_) return HType::HeapNumber(); |  | 
|  3627   ASSERT(!type_from_value_.IsUninitialized()); |  | 
|  3628   return type_from_value_; |  | 
|  3629 } |  | 
|  3630  |  | 
|  3631  |  | 
|  3632 HType HCompareGeneric::CalculateInferredType() { |  3622 HType HCompareGeneric::CalculateInferredType() { | 
|  3633   return HType::Boolean(); |  3623   return HType::Boolean(); | 
|  3634 } |  3624 } | 
|  3635  |  3625  | 
|  3636  |  3626  | 
|  3637 HType HInstanceOf::CalculateInferredType() { |  3627 HType HInstanceOf::CalculateInferredType() { | 
|  3638   return HType::Boolean(); |  3628   return HType::Boolean(); | 
|  3639 } |  3629 } | 
|  3640  |  3630  | 
|  3641  |  3631  | 
| (...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4493     case kBackingStore: |  4483     case kBackingStore: | 
|  4494       if (!name_.is_null()) stream->Add(*String::cast(*name_)->ToCString()); |  4484       if (!name_.is_null()) stream->Add(*String::cast(*name_)->ToCString()); | 
|  4495       stream->Add("[backing-store]"); |  4485       stream->Add("[backing-store]"); | 
|  4496       break; |  4486       break; | 
|  4497   } |  4487   } | 
|  4498  |  4488  | 
|  4499   stream->Add("@%d", offset()); |  4489   stream->Add("@%d", offset()); | 
|  4500 } |  4490 } | 
|  4501  |  4491  | 
|  4502 } }  // namespace v8::internal |  4492 } }  // namespace v8::internal | 
| OLD | NEW |