| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 97e95e906f03d5126cc5cab9cc17068c1f9f0343..694822d833f371d87181cd79697bb0a95c51d90e 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -1152,10 +1152,13 @@ HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object,
|
| new_length->ClearFlag(HValue::kCanOverflow);
|
|
|
| Factory* factory = isolate()->factory();
|
| + Representation representation = IsFastElementsKind(kind)
|
| + ? Representation::Smi() : Representation::Tagged();
|
| HInstruction* length_store = AddInstruction(new(zone) HStoreNamedField(
|
| object,
|
| factory->length_field_string(),
|
| new_length, true,
|
| + representation,
|
| JSArray::kLengthOffset));
|
| length_store->SetGVNFlag(kChangesArrayLengths);
|
| }
|
| @@ -1376,9 +1379,12 @@ void HGraphBuilder::BuildInitializeElements(HValue* elements,
|
| BuildStoreMap(elements, map);
|
|
|
| Handle<String> fixed_array_length_field_name = factory->length_field_string();
|
| + Representation representation = IsFastElementsKind(kind)
|
| + ? Representation::Smi() : Representation::Tagged();
|
| HInstruction* store_length =
|
| new(zone) HStoreNamedField(elements, fixed_array_length_field_name,
|
| - capacity, true, FixedArray::kLengthOffset);
|
| + capacity, true, representation,
|
| + FixedArray::kLengthOffset);
|
| AddInstruction(store_length);
|
| }
|
|
|
| @@ -1399,7 +1405,8 @@ HInstruction* HGraphBuilder::BuildStoreMap(HValue* object,
|
| Handle<String> map_field_name = factory->map_field_string();
|
| HInstruction* store_map =
|
| new(zone) HStoreNamedField(object, map_field_name, map,
|
| - true, JSObject::kMapOffset);
|
| + true, Representation::Tagged(),
|
| + JSObject::kMapOffset);
|
| store_map->SetGVNFlag(kChangesMaps);
|
| AddInstruction(store_map);
|
| return store_map;
|
| @@ -1480,7 +1487,7 @@ HValue* HGraphBuilder::BuildGrowElementsCapacity(HValue* object,
|
| HInstruction* elements_store = AddInstruction(new(zone) HStoreNamedField(
|
| object,
|
| factory->elements_field_string(),
|
| - new_elements, true,
|
| + new_elements, true, Representation::Tagged(),
|
| JSArray::kElementsOffset));
|
| elements_store->SetGVNFlag(kChangesElementsPointer);
|
|
|
| @@ -1597,13 +1604,13 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context,
|
| // Copy the JS array part.
|
| for (int i = 0; i < JSArray::kSize; i += kPointerSize) {
|
| if ((i != JSArray::kElementsOffset) || (length == 0)) {
|
| - HInstruction* value =
|
| - AddInstruction(new(zone) HLoadNamedField(boilerplate, true, i));
|
| + HInstruction* value = AddInstruction(new(zone) HLoadNamedField(
|
| + boilerplate, true, Representation::Tagged(), i));
|
| if (i != JSArray::kMapOffset) {
|
| AddInstruction(new(zone) HStoreNamedField(object,
|
| factory->empty_string(),
|
| - value,
|
| - true, i));
|
| + value, true,
|
| + Representation::Tagged(), i));
|
| } else {
|
| BuildStoreMap(object, value);
|
| }
|
| @@ -1619,8 +1626,9 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context,
|
| int alloc_payload_offset = AllocationSiteInfo::kPayloadOffset;
|
| AddInstruction(new(zone) HStoreNamedField(alloc_site,
|
| factory->empty_string(),
|
| - boilerplate,
|
| - true, alloc_payload_offset));
|
| + boilerplate, true,
|
| + Representation::Tagged(),
|
| + alloc_payload_offset));
|
| }
|
|
|
| if (length > 0) {
|
| @@ -1632,18 +1640,19 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context,
|
| AddInstruction(new(zone) HInnerAllocatedObject(object, elems_offset));
|
| AddInstruction(new(zone) HStoreNamedField(object,
|
| factory->elements_field_string(),
|
| - object_elements,
|
| - true, JSObject::kElementsOffset));
|
| + object_elements, true,
|
| + Representation::Tagged(),
|
| + JSObject::kElementsOffset));
|
|
|
| // Copy the elements array header.
|
| for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) {
|
| HInstruction* value =
|
| - AddInstruction(new(zone) HLoadNamedField(boilerplate_elements,
|
| - true, i));
|
| + AddInstruction(new(zone) HLoadNamedField(
|
| + boilerplate_elements, true, Representation::Tagged(), i));
|
| AddInstruction(new(zone) HStoreNamedField(object_elements,
|
| factory->empty_string(),
|
| - value,
|
| - true, i));
|
| + value, true,
|
| + Representation::Tagged(), i));
|
| }
|
|
|
| // Copy the elements array contents.
|
| @@ -6574,14 +6583,29 @@ static bool ComputeLoadStoreField(Handle<Map> type,
|
|
|
|
|
| static int ComputeLoadStoreFieldIndex(Handle<Map> type,
|
| - Handle<String> name,
|
| LookupResult* lookup) {
|
| ASSERT(lookup->IsField() || lookup->IsTransitionToField(*type));
|
| if (lookup->IsField()) {
|
| return lookup->GetLocalFieldIndexFromMap(*type);
|
| } else {
|
| Map* transition = lookup->GetTransitionMapFromMap(*type);
|
| - return transition->PropertyIndexFor(*name) - type->inobject_properties();
|
| + int descriptor = transition->LastAdded();
|
| + int index = transition->instance_descriptors()->GetFieldIndex(descriptor);
|
| + return index - type->inobject_properties();
|
| + }
|
| +}
|
| +
|
| +
|
| +static Representation ComputeLoadStoreRepresentation(Handle<Map> type,
|
| + LookupResult* lookup) {
|
| + if (lookup->IsField()) {
|
| + return lookup->GetPropertyDetails().representation();
|
| + } else {
|
| + Map* transition = lookup->GetTransitionMapFromMap(*type);
|
| + int descriptor = transition->LastAdded();
|
| + PropertyDetails details =
|
| + transition->instance_descriptors()->GetDetails(descriptor);
|
| + return details.representation();
|
| }
|
| }
|
|
|
| @@ -6636,8 +6660,9 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField(
|
| zone()));
|
| }
|
|
|
| - int index = ComputeLoadStoreFieldIndex(map, name, lookup);
|
| + int index = ComputeLoadStoreFieldIndex(map, lookup);
|
| bool is_in_object = index < 0;
|
| + Representation representation = ComputeLoadStoreRepresentation(map, lookup);
|
| int offset = index * kPointerSize;
|
| if (index < 0) {
|
| // Negative property indices are in-object properties, indexed
|
| @@ -6646,8 +6671,8 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField(
|
| } else {
|
| offset += FixedArray::kHeaderSize;
|
| }
|
| - HStoreNamedField* instr =
|
| - new(zone()) HStoreNamedField(object, name, value, is_in_object, offset);
|
| + HStoreNamedField* instr = new(zone()) HStoreNamedField(
|
| + object, name, value, is_in_object, representation, offset);
|
| if (lookup->IsTransitionToField(*map)) {
|
| Handle<Map> transition(lookup->GetTransitionMapFromMap(*map));
|
| instr->set_transition(transition);
|
| @@ -6743,7 +6768,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr,
|
| for (int i = 0; i < types->length() && count < kMaxLoadPolymorphism; ++i) {
|
| map = types->at(i);
|
| if (ComputeLoadStoreField(map, name, &lookup, false)) {
|
| - int index = ComputeLoadStoreFieldIndex(map, name, &lookup);
|
| + int index = ComputeLoadStoreFieldIndex(map, &lookup);
|
| bool is_in_object = index < 0;
|
| int offset = index * kPointerSize;
|
| if (index < 0) {
|
| @@ -7334,16 +7359,17 @@ HLoadNamedField* HOptimizedGraphBuilder::BuildLoadNamedField(
|
| HValue* object,
|
| Handle<Map> map,
|
| LookupResult* lookup) {
|
| + Representation representation = lookup->GetPropertyDetails().representation();
|
| int index = lookup->GetLocalFieldIndexFromMap(*map);
|
| if (index < 0) {
|
| // Negative property indices are in-object properties, indexed
|
| // from the end of the fixed part of the object.
|
| int offset = (index * kPointerSize) + map->instance_size();
|
| - return new(zone()) HLoadNamedField(object, true, offset);
|
| + return new(zone()) HLoadNamedField(object, true, representation, offset);
|
| } else {
|
| // Non-negative property indices are in the properties array.
|
| int offset = (index * kPointerSize) + FixedArray::kHeaderSize;
|
| - return new(zone()) HLoadNamedField(object, false, offset);
|
| + return new(zone()) HLoadNamedField(object, false, representation, offset);
|
| }
|
| }
|
|
|
| @@ -10320,17 +10346,21 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy(
|
| isolate()));
|
| HInstruction* value_instruction =
|
| AddInstruction(new(zone) HInnerAllocatedObject(target, *offset));
|
| + // TODO(verwaest): choose correct storage.
|
| AddInstruction(new(zone) HStoreNamedField(
|
| object_properties, factory->unknown_field_string(), value_instruction,
|
| - true, boilerplate_object->GetInObjectPropertyOffset(i)));
|
| + true, Representation::Tagged(),
|
| + boilerplate_object->GetInObjectPropertyOffset(i)));
|
| BuildEmitDeepCopy(value_object, original_value_object, target,
|
| offset, DONT_TRACK_ALLOCATION_SITE);
|
| } else {
|
| + // TODO(verwaest): choose correct storage.
|
| HInstruction* value_instruction = AddInstruction(new(zone) HConstant(
|
| value, Representation::Tagged()));
|
| AddInstruction(new(zone) HStoreNamedField(
|
| object_properties, factory->unknown_field_string(), value_instruction,
|
| - true, boilerplate_object->GetInObjectPropertyOffset(i)));
|
| + true, Representation::Tagged(),
|
| + boilerplate_object->GetInObjectPropertyOffset(i)));
|
| }
|
| }
|
|
|
| @@ -10341,10 +10371,11 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy(
|
| Handle<Map> alloc_site_map(isolate()->heap()->allocation_site_info_map());
|
| BuildStoreMap(alloc_site, alloc_site_map);
|
| int alloc_payload_offset = AllocationSiteInfo::kPayloadOffset;
|
| - AddInstruction(new(zone) HStoreNamedField(alloc_site,
|
| - factory->payload_string(),
|
| - original_boilerplate,
|
| - true, alloc_payload_offset));
|
| + AddInstruction(new(zone) HStoreNamedField(
|
| + alloc_site,
|
| + factory->payload_string(),
|
| + original_boilerplate,
|
| + true, Representation::Tagged(), alloc_payload_offset));
|
| }
|
|
|
| if (object_elements != NULL) {
|
| @@ -10433,7 +10464,7 @@ HValue* HOptimizedGraphBuilder::BuildCopyObjectHeader(
|
| object_header,
|
| factory->elements_field_string(),
|
| elements,
|
| - true, JSObject::kElementsOffset));
|
| + true, Representation::Tagged(), JSObject::kElementsOffset));
|
| elements_store->SetGVNFlag(kChangesElementsPointer);
|
|
|
| Handle<Object> properties_field =
|
| @@ -10443,8 +10474,9 @@ HValue* HOptimizedGraphBuilder::BuildCopyObjectHeader(
|
| properties_field, Representation::None()));
|
| AddInstruction(new(zone) HStoreNamedField(object_header,
|
| factory->empty_string(),
|
| - properties,
|
| - true, JSObject::kPropertiesOffset));
|
| + properties, true,
|
| + Representation::Tagged(),
|
| + JSObject::kPropertiesOffset));
|
|
|
| if (boilerplate_object->IsJSArray()) {
|
| Handle<JSArray> boilerplate_array =
|
| @@ -10453,11 +10485,15 @@ HValue* HOptimizedGraphBuilder::BuildCopyObjectHeader(
|
| Handle<Object>(boilerplate_array->length(), isolate());
|
| HInstruction* length = AddInstruction(new(zone) HConstant(
|
| length_field, Representation::None()));
|
| + ASSERT(boilerplate_array->length()->IsSmi());
|
| + Representation representation =
|
| + IsFastElementsKind(boilerplate_array->GetElementsKind())
|
| + ? Representation::Smi() : Representation::Tagged();
|
| HInstruction* length_store = AddInstruction(new(zone) HStoreNamedField(
|
| object_header,
|
| factory->length_field_string(),
|
| length,
|
| - true, JSArray::kLengthOffset));
|
| + true, representation, JSArray::kLengthOffset));
|
| length_store->SetGVNFlag(kChangesArrayLengths);
|
| }
|
|
|
| @@ -10850,6 +10886,7 @@ void HOptimizedGraphBuilder::GenerateSetValueOf(CallRuntime* call) {
|
| name,
|
| value,
|
| true, // in-object store.
|
| + Representation::Tagged(),
|
| JSValue::kValueOffset));
|
| if_js_value->Goto(join);
|
| join->SetJoinId(call->id());
|
|
|