| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index d98ce2ff3c8ca0f0322464e1387bbae1d6848653..4c9a85b1a9ba6aa1e85c5752bd54f03653f506c9 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -4547,14 +4547,6 @@ void HOptimizedGraphBuilder::AddCheckMap(HValue* object, Handle<Map> map) {
|
| }
|
|
|
|
|
| -void HOptimizedGraphBuilder::AddCheckMapsWithTransitions(HValue* object,
|
| - Handle<Map> map) {
|
| - BuildCheckHeapObject(object);
|
| - AddInstruction(HCheckMaps::NewWithTransitions(
|
| - object, map, zone(), top_info()));
|
| -}
|
| -
|
| -
|
| HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField(
|
| HValue* object,
|
| Handle<String> name,
|
| @@ -4654,7 +4646,7 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedMonomorphic(
|
| // Handle a store to a known field.
|
| LookupResult lookup(isolate());
|
| if (ComputeLoadStoreField(map, name, &lookup, true)) {
|
| - AddCheckMapsWithTransitions(object, map);
|
| + AddCheckMap(object, map);
|
| return BuildStoreNamedField(object, name, value, map, &lookup);
|
| }
|
|
|
| @@ -5434,7 +5426,7 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic(
|
| // Handle access to various length properties
|
| if (name->Equals(isolate()->heap()->length_string())) {
|
| if (map->instance_type() == JS_ARRAY_TYPE) {
|
| - AddCheckMapsWithTransitions(object, map);
|
| + AddCheckMap(object, map);
|
| return new(zone()) HLoadNamedField(object,
|
| HObjectAccess::ForArrayLength(map->elements_kind()));
|
| }
|
| @@ -5976,7 +5968,7 @@ void HOptimizedGraphBuilder::AddCheckConstantFunction(
|
| // Constant functions have the nice property that the map will change if they
|
| // are overwritten. Therefore it is enough to check the map of the holder and
|
| // its prototypes.
|
| - AddCheckMapsWithTransitions(receiver, receiver_map);
|
| + AddCheckMap(receiver, receiver_map);
|
| AddCheckPrototypeMaps(holder, receiver_map);
|
| }
|
|
|
| @@ -6929,55 +6921,6 @@ bool HOptimizedGraphBuilder::TryCallApply(Call* expr) {
|
| }
|
|
|
|
|
| -// Checks if all maps in |types| are from the same family, i.e., are elements
|
| -// transitions of each other. Returns either NULL if they are not from the same
|
| -// family, or a Map* indicating the map with the first elements kind of the
|
| -// family that is in the list.
|
| -static Map* CheckSameElementsFamily(SmallMapList* types) {
|
| - if (types->length() <= 1) return NULL;
|
| - // Check if all maps belong to the same transition family.
|
| - Map* kinds[kFastElementsKindCount];
|
| - Map* first_map = *types->first();
|
| - ElementsKind first_kind = first_map->elements_kind();
|
| - if (!IsFastElementsKind(first_kind)) return NULL;
|
| - int first_index = GetSequenceIndexFromFastElementsKind(first_kind);
|
| - int last_index = first_index;
|
| -
|
| - for (int i = 0; i < kFastElementsKindCount; i++) kinds[i] = NULL;
|
| -
|
| - kinds[first_index] = first_map;
|
| -
|
| - for (int i = 1; i < types->length(); ++i) {
|
| - Map* map = *types->at(i);
|
| - ElementsKind elements_kind = map->elements_kind();
|
| - if (!IsFastElementsKind(elements_kind)) return NULL;
|
| - int index = GetSequenceIndexFromFastElementsKind(elements_kind);
|
| - if (index < first_index) {
|
| - first_index = index;
|
| - } else if (index > last_index) {
|
| - last_index = index;
|
| - } else if (kinds[index] != map) {
|
| - return NULL;
|
| - }
|
| - kinds[index] = map;
|
| - }
|
| -
|
| - Map* current = kinds[first_index];
|
| - for (int i = first_index + 1; i <= last_index; i++) {
|
| - Map* next = kinds[i];
|
| - if (next != NULL) {
|
| - ElementsKind current_kind = next->elements_kind();
|
| - if (next != current->LookupElementsTransitionMap(current_kind)) {
|
| - return NULL;
|
| - }
|
| - current = next;
|
| - }
|
| - }
|
| -
|
| - return kinds[first_index];
|
| -}
|
| -
|
| -
|
| void HOptimizedGraphBuilder::VisitCall(Call* expr) {
|
| ASSERT(!HasStackOverflow());
|
| ASSERT(current_block() != NULL);
|
| @@ -7023,12 +6966,6 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) {
|
| receiver_map = (types == NULL || types->is_empty())
|
| ? Handle<Map>::null()
|
| : types->first();
|
| - } else {
|
| - Map* family_map = CheckSameElementsFamily(types);
|
| - if (family_map != NULL) {
|
| - receiver_map = Handle<Map>(family_map);
|
| - monomorphic = expr->ComputeTarget(receiver_map, name);
|
| - }
|
| }
|
|
|
| HValue* receiver =
|
| @@ -8220,8 +8157,8 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) {
|
| // Can we get away with map check and not instance type check?
|
| if (combined_type->IsClass()) {
|
| Handle<Map> map = combined_type->AsClass();
|
| - AddCheckMapsWithTransitions(left, map);
|
| - AddCheckMapsWithTransitions(right, map);
|
| + AddCheckMap(left, map);
|
| + AddCheckMap(right, map);
|
| HCompareObjectEqAndBranch* result =
|
| new(zone()) HCompareObjectEqAndBranch(left, right);
|
| result->set_position(expr->position());
|
|
|