| Index: src/hydrogen-instructions.cc
|
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
|
| index a685198ba6288e54e0913695f6e6f4e5cc797f09..d301036be1fa16e16922cd1aef4eaf7b25ff2df1 100644
|
| --- a/src/hydrogen-instructions.cc
|
| +++ b/src/hydrogen-instructions.cc
|
| @@ -2363,8 +2363,7 @@ static bool IsInteger32(double value) {
|
|
|
| HConstant::HConstant(Handle<Object> handle, Representation r)
|
| : HTemplateInstruction<0>(HType::TypeFromValue(handle)),
|
| - handle_(handle),
|
| - unique_id_(),
|
| + object_(Unique<Object>::CreateUninitialized(handle)),
|
| has_smi_value_(false),
|
| has_int32_value_(false),
|
| has_double_value_(false),
|
| @@ -2373,29 +2372,28 @@ HConstant::HConstant(Handle<Object> handle, Representation r)
|
| is_not_in_new_space_(true),
|
| is_cell_(false),
|
| boolean_value_(handle->BooleanValue()) {
|
| - if (handle_->IsHeapObject()) {
|
| + if (handle->IsHeapObject()) {
|
| Heap* heap = Handle<HeapObject>::cast(handle)->GetHeap();
|
| is_not_in_new_space_ = !heap->InNewSpace(*handle);
|
| }
|
| - if (handle_->IsNumber()) {
|
| - double n = handle_->Number();
|
| + if (handle->IsNumber()) {
|
| + double n = handle->Number();
|
| has_int32_value_ = IsInteger32(n);
|
| int32_value_ = DoubleToInt32(n);
|
| has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_);
|
| double_value_ = n;
|
| has_double_value_ = true;
|
| } else {
|
| - is_internalized_string_ = handle_->IsInternalizedString();
|
| + is_internalized_string_ = handle->IsInternalizedString();
|
| }
|
|
|
| - is_cell_ = !handle_.is_null() &&
|
| - (handle_->IsCell() || handle_->IsPropertyCell());
|
| + is_cell_ = !handle.is_null() &&
|
| + (handle->IsCell() || handle->IsPropertyCell());
|
| Initialize(r);
|
| }
|
|
|
|
|
| -HConstant::HConstant(Handle<Object> handle,
|
| - UniqueValueId unique_id,
|
| +HConstant::HConstant(Unique<Object> unique,
|
| Representation r,
|
| HType type,
|
| bool is_internalize_string,
|
| @@ -2403,8 +2401,7 @@ HConstant::HConstant(Handle<Object> handle,
|
| bool is_cell,
|
| bool boolean_value)
|
| : HTemplateInstruction<0>(type),
|
| - handle_(handle),
|
| - unique_id_(unique_id),
|
| + object_(unique),
|
| has_smi_value_(false),
|
| has_int32_value_(false),
|
| has_double_value_(false),
|
| @@ -2413,36 +2410,17 @@ HConstant::HConstant(Handle<Object> handle,
|
| is_not_in_new_space_(is_not_in_new_space),
|
| is_cell_(is_cell),
|
| boolean_value_(boolean_value) {
|
| - ASSERT(!handle.is_null());
|
| + ASSERT(!unique.handle().is_null());
|
| ASSERT(!type.IsTaggedNumber());
|
| Initialize(r);
|
| }
|
|
|
|
|
| -HConstant::HConstant(Handle<Map> handle,
|
| - UniqueValueId unique_id)
|
| - : HTemplateInstruction<0>(HType::Tagged()),
|
| - handle_(handle),
|
| - unique_id_(unique_id),
|
| - has_smi_value_(false),
|
| - has_int32_value_(false),
|
| - has_double_value_(false),
|
| - has_external_reference_value_(false),
|
| - is_internalized_string_(false),
|
| - is_not_in_new_space_(true),
|
| - is_cell_(false),
|
| - boolean_value_(false) {
|
| - ASSERT(!handle.is_null());
|
| - Initialize(Representation::Tagged());
|
| -}
|
| -
|
| -
|
| HConstant::HConstant(int32_t integer_value,
|
| Representation r,
|
| bool is_not_in_new_space,
|
| - Handle<Object> optional_handle)
|
| - : handle_(optional_handle),
|
| - unique_id_(),
|
| + Unique<Object> object)
|
| + : object_(object),
|
| has_smi_value_(Smi::IsValid(integer_value)),
|
| has_int32_value_(true),
|
| has_double_value_(true),
|
| @@ -2461,9 +2439,8 @@ HConstant::HConstant(int32_t integer_value,
|
| HConstant::HConstant(double double_value,
|
| Representation r,
|
| bool is_not_in_new_space,
|
| - Handle<Object> optional_handle)
|
| - : handle_(optional_handle),
|
| - unique_id_(),
|
| + Unique<Object> object)
|
| + : object_(object),
|
| has_int32_value_(IsInteger32(double_value)),
|
| has_double_value_(true),
|
| has_external_reference_value_(false),
|
| @@ -2481,6 +2458,7 @@ HConstant::HConstant(double double_value,
|
|
|
| HConstant::HConstant(ExternalReference reference)
|
| : HTemplateInstruction<0>(HType::None()),
|
| + object_(Unique<Object>(Handle<Object>::null())),
|
| has_smi_value_(false),
|
| has_int32_value_(false),
|
| has_double_value_(false),
|
| @@ -2494,14 +2472,6 @@ HConstant::HConstant(ExternalReference reference)
|
| }
|
|
|
|
|
| -static void PrepareConstant(Handle<Object> object) {
|
| - if (!object->IsJSObject()) return;
|
| - Handle<JSObject> js_object = Handle<JSObject>::cast(object);
|
| - if (!js_object->map()->is_deprecated()) return;
|
| - JSObject::TryMigrateInstance(js_object);
|
| -}
|
| -
|
| -
|
| void HConstant::Initialize(Representation r) {
|
| if (r.IsNone()) {
|
| if (has_smi_value_ && SmiValuesAre31Bits()) {
|
| @@ -2513,7 +2483,14 @@ void HConstant::Initialize(Representation r) {
|
| } else if (has_external_reference_value_) {
|
| r = Representation::External();
|
| } else {
|
| - PrepareConstant(handle_);
|
| + Handle<Object> object = object_.handle();
|
| + if (object->IsJSObject()) {
|
| + // Try to eagerly migrate JSObjects that have deprecated maps.
|
| + Handle<JSObject> js_object = Handle<JSObject>::cast(object);
|
| + if (js_object->map()->is_deprecated()) {
|
| + JSObject::TryMigrateInstance(js_object);
|
| + }
|
| + }
|
| r = Representation::Tagged();
|
| }
|
| }
|
| @@ -2541,17 +2518,16 @@ HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const {
|
| if (r.IsDouble() && !has_double_value_) return NULL;
|
| if (r.IsExternal() && !has_external_reference_value_) return NULL;
|
| if (has_int32_value_) {
|
| - return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, handle_);
|
| + return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, object_);
|
| }
|
| if (has_double_value_) {
|
| - return new(zone) HConstant(double_value_, r, is_not_in_new_space_, handle_);
|
| + return new(zone) HConstant(double_value_, r, is_not_in_new_space_, object_);
|
| }
|
| if (has_external_reference_value_) {
|
| return new(zone) HConstant(external_reference_value_);
|
| }
|
| - ASSERT(!handle_.is_null());
|
| - return new(zone) HConstant(handle_,
|
| - unique_id_,
|
| + ASSERT(!object_.handle().is_null());
|
| + return new(zone) HConstant(object_,
|
| r,
|
| type_,
|
| is_internalized_string_,
|
| @@ -2567,12 +2543,12 @@ Maybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) {
|
| res = new(zone) HConstant(int32_value_,
|
| Representation::Integer32(),
|
| is_not_in_new_space_,
|
| - handle_);
|
| + object_);
|
| } else if (has_double_value_) {
|
| res = new(zone) HConstant(DoubleToInt32(double_value_),
|
| Representation::Integer32(),
|
| is_not_in_new_space_,
|
| - handle_);
|
| + object_);
|
| }
|
| return Maybe<HConstant*>(res != NULL, res);
|
| }
|
| @@ -3439,8 +3415,8 @@ void HAllocate::CreateFreeSpaceFiller(int32_t free_space_size) {
|
| HConstant* filler_map = HConstant::New(
|
| zone,
|
| context(),
|
| - isolate()->factory()->free_space_map(),
|
| - UniqueValueId::free_space_map(isolate()->heap()));
|
| + isolate()->factory()->free_space_map());
|
| + filler_map->FinalizeUniqueness(); // TODO(titzer): should be init'd a'ready
|
| filler_map->InsertAfter(free_space_instr);
|
| HInstruction* store_map = HStoreNamedField::New(zone, context(),
|
| free_space_instr, HObjectAccess::ForMap(), filler_map);
|
|
|