| Index: src/hydrogen-instructions.cc
|
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
|
| index 538772d583563326fecdd79567d5938d854e5e40..db519b02b9d49539a629e5e831d7bf534f7a047e 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,18 +1835,44 @@ 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),
|
| + is_internalized_string_(is_internalize_string),
|
| + boolean_value_(boolean_value),
|
| + type_from_value_(type) {
|
| + ASSERT(!handle.is_null());
|
| + ASSERT(!type.IsUninitialized());
|
| + ASSERT(!type.IsTaggedNumber());
|
| + Initialize(r);
|
| +}
|
| +
|
| +
|
| +HConstant::HConstant(int32_t integer_value,
|
| + Representation r,
|
| + Handle<Object> optional_handle)
|
| : has_int32_value_(true),
|
| has_double_value_(true),
|
| + is_internalized_string_(false),
|
| + boolean_value_(integer_value != 0),
|
| int32_value_(integer_value),
|
| double_value_(FastI2D(integer_value)) {
|
| Initialize(r);
|
| }
|
|
|
|
|
| -HConstant::HConstant(double double_value, Representation r)
|
| +HConstant::HConstant(double double_value,
|
| + Representation r,
|
| + Handle<Object> optional_handle)
|
| : has_int32_value_(IsInteger32(double_value)),
|
| has_double_value_(true),
|
| + is_internalized_string_(false),
|
| + boolean_value_(double_value != 0 && !isnan(double_value)),
|
| int32_value_(DoubleToInt32(double_value)),
|
| double_value_(double_value) {
|
| Initialize(r);
|
| @@ -1869,53 +1891,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 +2596,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_;
|
| }
|
|
|
|
|
|
|