Chromium Code Reviews| Index: src/hydrogen-instructions.cc |
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc |
| index 538772d583563326fecdd79567d5938d854e5e40..8aa168c96d172b97ec9d7d79519028c9059944b5 100644 |
| --- a/src/hydrogen-instructions.cc |
| +++ b/src/hydrogen-instructions.cc |
| @@ -348,11 +348,7 @@ const char* HType::ToString() { |
| } |
| -HType HType::TypeFromValue(Isolate* isolate, Handle<Object> value) { |
| - // Handle dereferencing is safe here: an object's type as checked below |
| - // never changes. |
| - AllowHandleDereference allow_handle_deref(isolate); |
| - |
| +HType HType::TypeFromValue(Handle<Object> value) { |
| HType result = HType::Tagged(); |
| if (value->IsSmi()) { |
| result = HType::Smi(); |
| @@ -1309,10 +1305,7 @@ HValue* HCheckInstanceType::Canonicalize() { |
| } |
| if (check_ == IS_INTERNALIZED_STRING && value()->IsConstant()) { |
| - // Dereferencing is safe here: |
| - // an internalized string cannot become non-internalized. |
| - AllowHandleDereference allow_handle_deref(isolate()); |
| - if (HConstant::cast(value())->handle()->IsInternalizedString()) return NULL; |
| + if (HConstant::cast(value())->HasInternalizedStringValue()) return NULL; |
| } |
| return this; |
| } |
| @@ -1814,17 +1807,20 @@ static bool IsInteger32(double value) { |
| HConstant::HConstant(Handle<Object> handle, Representation r) |
| - : handle_(handle), |
| - has_int32_value_(false), |
| - has_double_value_(false) { |
| - // Dereferencing here is safe: the value of a number object does not change. |
| - AllowHandleDereference allow_handle_deref(Isolate::Current()); |
| + : handle_(handle), |
| + has_int32_value_(false), |
| + has_double_value_(false), |
| + is_internalized_string_(false), |
| + boolean_value_(handle->BooleanValue()) { |
| if (handle_->IsNumber()) { |
| double n = handle_->Number(); |
| has_int32_value_ = IsInteger32(n); |
| int32_value_ = DoubleToInt32(n); |
| double_value_ = n; |
| has_double_value_ = true; |
| + } else { |
| + type_from_value_ = HType::TypeFromValue(handle_); |
| + is_internalized_string_ = handle_->IsInternalizedString(); |
| } |
| if (r.IsNone()) { |
| if (has_int32_value_) { |
| @@ -1839,20 +1835,45 @@ HConstant::HConstant(Handle<Object> handle, Representation r) |
| } |
| -HConstant::HConstant(int32_t integer_value, Representation r) |
| +HConstant::HConstant(Handle<Object> handle, |
| + Representation r, |
| + HType type, |
| + bool is_internalize_string, |
| + bool boolean_value) |
| + : handle_(handle), |
| + has_int32_value_(false), |
| + has_double_value_(false), |
| + type_from_value_(type), |
| + is_internalized_string_(is_internalize_string), |
| + boolean_value_(boolean_value) { |
| + ASSERT(!handle.is_null()); |
| + ASSERT(!type.IsUninitialized()); |
| + ASSERT(!type.IsTaggedNumber()); |
| + ASSERT(!r.IsNone()); |
|
Jakob Kummerow
2013/03/13 15:50:31
This last ASSERT is unnecessary, you get it for fr
Yang
2013/03/13 17:00:15
Done.
|
| + Initialize(r); |
| +} |
| + |
| + |
| +HConstant::HConstant( |
| + int32_t integer_value, Representation r, Handle<Object> optional_handle) |
|
Jakob Kummerow
2013/03/13 15:50:31
each argument on its own line please
Yang
2013/03/13 17:00:15
Done.
|
| : has_int32_value_(true), |
| has_double_value_(true), |
| int32_value_(integer_value), |
| - double_value_(FastI2D(integer_value)) { |
| + double_value_(FastI2D(integer_value)), |
| + is_internalized_string_(false), |
| + boolean_value_(integer_value != 0) { |
| Initialize(r); |
| } |
| -HConstant::HConstant(double double_value, Representation r) |
| +HConstant::HConstant( |
| + double double_value, Representation r, Handle<Object> optional_handle) |
|
Jakob Kummerow
2013/03/13 15:50:31
each argument on its own line please
Yang
2013/03/13 17:00:15
Done.
|
| : has_int32_value_(IsInteger32(double_value)), |
| has_double_value_(true), |
| int32_value_(DoubleToInt32(double_value)), |
| - double_value_(double_value) { |
| + double_value_(double_value), |
| + is_internalized_string_(false), |
| + boolean_value_(double_value != 0 && !isnan(double_value)) { |
| Initialize(r); |
| } |
| @@ -1869,53 +1890,27 @@ void HConstant::Initialize(Representation r) { |
| HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const { |
| if (r.IsInteger32() && !has_int32_value_) return NULL; |
| if (r.IsDouble() && !has_double_value_) return NULL; |
| - if (handle_.is_null()) { |
| - ASSERT(has_int32_value_ || has_double_value_); |
| - if (has_int32_value_) return new(zone) HConstant(int32_value_, r); |
| - return new(zone) HConstant(double_value_, r); |
| - } |
| - return new(zone) HConstant(handle_, r); |
| + if (has_int32_value_) return new(zone) HConstant(int32_value_, r, handle_); |
| + if (has_double_value_) return new(zone) HConstant(double_value_, r, handle_); |
| + ASSERT(!handle_.is_null()); |
| + return new(zone) HConstant( |
| + handle_, r, type_from_value_, is_internalized_string_, boolean_value_); |
| } |
| HConstant* HConstant::CopyToTruncatedInt32(Zone* zone) const { |
| if (has_int32_value_) { |
| - if (handle_.is_null()) { |
| - return new(zone) HConstant(int32_value_, Representation::Integer32()); |
| - } else { |
| - // Re-use the existing Handle if possible. |
| - return new(zone) HConstant(handle_, Representation::Integer32()); |
| - } |
| - } else if (has_double_value_) { |
| - return new(zone) HConstant(DoubleToInt32(double_value_), |
| - Representation::Integer32()); |
| - } else { |
| - return NULL; |
| - } |
| -} |
| - |
| - |
| -bool HConstant::ToBoolean() { |
| - // Converts the constant's boolean value according to |
| - // ECMAScript section 9.2 ToBoolean conversion. |
| - if (HasInteger32Value()) return Integer32Value() != 0; |
| - if (HasDoubleValue()) { |
| - double v = DoubleValue(); |
| - return v != 0 && !isnan(v); |
| + return new(zone) HConstant( |
| + int32_value_, Representation::Integer32(), handle_); |
| } |
| - // Dereferencing is safe: singletons do not change and strings are |
| - // immutable. |
| - AllowHandleDereference allow_handle_deref(isolate()); |
| - if (handle_->IsTrue()) return true; |
| - if (handle_->IsFalse()) return false; |
| - if (handle_->IsUndefined()) return false; |
| - if (handle_->IsNull()) return false; |
| - if (handle_->IsString() && String::cast(*handle_)->length() == 0) { |
| - return false; |
| + if (has_double_value_) { |
| + return new(zone) HConstant( |
| + DoubleToInt32(double_value_), Representation::Integer32(), handle_); |
| } |
| - return true; |
| + return NULL; |
| } |
| + |
| void HConstant::PrintDataTo(StringStream* stream) { |
| if (has_int32_value_) { |
| stream->Add("%d ", int32_value_); |
| @@ -2600,7 +2595,8 @@ HType HConstant::CalculateInferredType() { |
| return Smi::IsValid(int32_value_) ? HType::Smi() : HType::HeapNumber(); |
| } |
| if (has_double_value_) return HType::HeapNumber(); |
| - return HType::TypeFromValue(isolate(), handle_); |
| + ASSERT(!type_from_value_.IsUninitialized()); |
| + return type_from_value_; |
| } |