| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 2d471cc294962012df6315462c24cc93101cda96..d68774ec3ba0c690896edf5fde66a617c77ba65e 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -4101,12 +4101,40 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object,
|
| type_todo[i] = false;
|
| }
|
|
|
| + // Elements_kind transition support.
|
| + MapList transition_target(maps->length());
|
| + if (is_store) {
|
| + // Collect possible transition targets.
|
| + MapList possible_transitioned_maps(maps->length());
|
| + for (int i = 0; i < maps->length(); ++i) {
|
| + Handle<Map> map = maps->at(i);
|
| + ElementsKind elements_kind = map->elements_kind();
|
| + if (elements_kind == FAST_DOUBLE_ELEMENTS ||
|
| + elements_kind == FAST_ELEMENTS) {
|
| + possible_transitioned_maps.Add(*map);
|
| + }
|
| + }
|
| + // Get transition target for each map (NULL == no transition).
|
| + for (int i = 0; i < maps->length(); ++i) {
|
| + Handle<Map> map = maps->at(i);
|
| + Map* transitioned_map =
|
| + map->FindTransitionedMap(&possible_transitioned_maps);
|
| + transition_target.Add(transitioned_map);
|
| + }
|
| + }
|
| +
|
| for (int i = 0; i < maps->length(); ++i) {
|
| - ASSERT(maps->at(i)->IsMap());
|
| - type_todo[maps->at(i)->elements_kind()] = true;
|
| - if (maps->at(i)->elements_kind()
|
| - >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND) {
|
| - todo_external_array = true;
|
| + Handle<Map> map = maps->at(i);
|
| + ASSERT(map->IsMap());
|
| + ASSERT(!is_store || (transition_target.length() == maps->length()));
|
| + if (is_store && transition_target.at(i) != NULL) {
|
| + object = AddInstruction(new(zone()) HTransitionElementsKind(
|
| + object, map, Handle<Map>(transition_target.at(i))));
|
| + } else {
|
| + type_todo[map->elements_kind()] = true;
|
| + if (map->elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND) {
|
| + todo_external_array = true;
|
| + }
|
| }
|
| }
|
|
|
|
|