| Index: src/objects.cc | 
| diff --git a/src/objects.cc b/src/objects.cc | 
| index 426327c9caa686573939181a56f1b38f91000a99..e4cd7763dd0faf3f1f44c0617b257f3e694bfdfc 100644 | 
| --- a/src/objects.cc | 
| +++ b/src/objects.cc | 
| @@ -4954,15 +4954,43 @@ class IntrusiveMapTransitionIterator { | 
| Map* Next() { | 
| ASSERT(IsIterating()); | 
| FixedArray* contents = ContentArray(); | 
| +    // Attention, tricky index manipulation ahead: Every entry in the contents | 
| +    // array consists of a value/details pair, so the index is typically even. | 
| +    // An exception is made for CALLBACKS entries: An even index means we look | 
| +    // at its getter, and an odd index means we look at its setter. | 
| int index = Smi::cast(*ContentHeader())->value(); | 
| while (index < contents->length()) { | 
| -      int next_index = index + 2; | 
| -      PropertyDetails details(Smi::cast(contents->get(index + 1))); | 
| -      if (details.IsTransition()) { | 
| -        *ContentHeader() = Smi::FromInt(next_index); | 
| -        return static_cast<Map*>(contents->get(index)); | 
| +      PropertyDetails details(Smi::cast(contents->get(index | 1))); | 
| +      switch (details.type()) { | 
| +        case MAP_TRANSITION: | 
| +        case CONSTANT_TRANSITION: | 
| +        case ELEMENTS_TRANSITION: | 
| +          // We definitely have a map transition. | 
| +          *ContentHeader() = Smi::FromInt(index + 2); | 
| +          return static_cast<Map*>(contents->get(index)); | 
| +        case CALLBACKS: { | 
| +          // We might have a map transition in a getter or in a setter. | 
| +          AccessorPair* accessors = | 
| +              static_cast<AccessorPair*>(contents->get(index & ~1)); | 
| +          Object* accessor = | 
| +              ((index & 1) == 0) ? accessors->getter() : accessors->setter(); | 
| +          index++; | 
| +          if (accessor->IsMap()) { | 
| +            *ContentHeader() = Smi::FromInt(index); | 
| +            return static_cast<Map*>(accessor); | 
| +          } | 
| +          break; | 
| +        } | 
| +        case NORMAL: | 
| +        case FIELD: | 
| +        case CONSTANT_FUNCTION: | 
| +        case HANDLER: | 
| +        case INTERCEPTOR: | 
| +        case NULL_DESCRIPTOR: | 
| +          // We definitely have no map transition. | 
| +          index += 2; | 
| +          break; | 
| } | 
| -      index = next_index; | 
| } | 
| *ContentHeader() = descriptor_array_->GetHeap()->fixed_array_map(); | 
| return NULL; | 
|  |