OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 4456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4467 for (int i = map_or_index->IsSmi() ? Smi::cast(map_or_index)->value() : 0; | 4467 for (int i = map_or_index->IsSmi() ? Smi::cast(map_or_index)->value() : 0; |
4468 i < contents->length(); | 4468 i < contents->length(); |
4469 i += 2) { | 4469 i += 2) { |
4470 PropertyDetails details(Smi::cast(contents->get(i + 1))); | 4470 PropertyDetails details(Smi::cast(contents->get(i + 1))); |
4471 if (details.IsTransition()) { | 4471 if (details.IsTransition()) { |
4472 // Found a map in the transition array. We record our progress in | 4472 // Found a map in the transition array. We record our progress in |
4473 // the transition array by recording the current map in the map field | 4473 // the transition array by recording the current map in the map field |
4474 // of the next map and recording the index in the transition array in | 4474 // of the next map and recording the index in the transition array in |
4475 // the map field of the array. | 4475 // the map field of the array. |
4476 Map* next = Map::cast(contents->get(i)); | 4476 Map* next = Map::cast(contents->get(i)); |
4477 next->set_map(current); | 4477 next->set_map_unsafe(current); |
4478 *map_or_index_field = Smi::FromInt(i + 2); | 4478 *map_or_index_field = Smi::FromInt(i + 2); |
4479 current = next; | 4479 current = next; |
4480 map_done = false; | 4480 map_done = false; |
4481 break; | 4481 break; |
4482 } | 4482 } |
4483 } | 4483 } |
4484 if (!map_done) continue; | 4484 if (!map_done) continue; |
4485 } else { | 4485 } else { |
4486 map_or_index_field = NULL; | 4486 map_or_index_field = NULL; |
4487 } | 4487 } |
4488 // That was the regular transitions, now for the prototype transitions. | 4488 // That was the regular transitions, now for the prototype transitions. |
4489 FixedArray* prototype_transitions = | 4489 FixedArray* prototype_transitions = |
4490 current->unchecked_prototype_transitions(); | 4490 current->unchecked_prototype_transitions(); |
4491 Object** proto_map_or_index_field = | 4491 Object** proto_map_or_index_field = |
4492 RawField(prototype_transitions, HeapObject::kMapOffset); | 4492 RawField(prototype_transitions, HeapObject::kMapOffset); |
4493 Object* map_or_index = *proto_map_or_index_field; | 4493 Object* map_or_index = *proto_map_or_index_field; |
4494 const int start = kProtoTransitionHeaderSize + kProtoTransitionMapOffset; | 4494 const int start = kProtoTransitionHeaderSize + kProtoTransitionMapOffset; |
4495 int i = map_or_index->IsSmi() ? Smi::cast(map_or_index)->value() : start; | 4495 int i = map_or_index->IsSmi() ? Smi::cast(map_or_index)->value() : start; |
4496 if (i < prototype_transitions->length()) { | 4496 if (i < prototype_transitions->length()) { |
4497 // Found a map in the prototype transition array. Record progress in | 4497 // Found a map in the prototype transition array. Record progress in |
4498 // an analogous way to the regular transitions array above. | 4498 // an analogous way to the regular transitions array above. |
4499 Object* perhaps_map = prototype_transitions->get(i); | 4499 Object* perhaps_map = prototype_transitions->get(i); |
4500 if (perhaps_map->IsMap()) { | 4500 if (perhaps_map->IsMap()) { |
4501 Map* next = Map::cast(perhaps_map); | 4501 Map* next = Map::cast(perhaps_map); |
4502 next->set_map(current); | 4502 next->set_map_unsafe(current); |
4503 *proto_map_or_index_field = | 4503 *proto_map_or_index_field = |
4504 Smi::FromInt(i + kProtoTransitionElementsPerEntry); | 4504 Smi::FromInt(i + kProtoTransitionElementsPerEntry); |
4505 current = next; | 4505 current = next; |
4506 continue; | 4506 continue; |
4507 } | 4507 } |
4508 } | 4508 } |
4509 *proto_map_or_index_field = GetHeap()->fixed_array_map(); | 4509 *proto_map_or_index_field = GetHeap()->fixed_array_map(); |
4510 if (map_or_index_field != NULL) { | 4510 if (map_or_index_field != NULL) { |
4511 *map_or_index_field = GetHeap()->fixed_array_map(); | 4511 *map_or_index_field = GetHeap()->fixed_array_map(); |
4512 } | 4512 } |
4513 | 4513 |
4514 // The callback expects a map to have a real map as its map, so we save | 4514 // The callback expects a map to have a real map as its map, so we save |
4515 // the map field, which is being used to track the traversal and put the | 4515 // the map field, which is being used to track the traversal and put the |
4516 // correct map (the meta_map) in place while we do the callback. | 4516 // correct map (the meta_map) in place while we do the callback. |
4517 Map* prev = current->map(); | 4517 Map* prev = current->map(); |
4518 current->set_map(meta_map); | 4518 current->set_map_unsafe(meta_map); |
4519 callback(current, data); | 4519 callback(current, data); |
4520 current = prev; | 4520 current = prev; |
4521 } | 4521 } |
4522 } | 4522 } |
4523 | 4523 |
4524 | 4524 |
4525 MaybeObject* CodeCache::Update(String* name, Code* code) { | 4525 MaybeObject* CodeCache::Update(String* name, Code* code) { |
4526 // The number of monomorphic stubs for normal load/store/call IC's can grow to | 4526 // The number of monomorphic stubs for normal load/store/call IC's can grow to |
4527 // a large number and therefore they need to go into a hash table. They are | 4527 // a large number and therefore they need to go into a hash table. They are |
4528 // used to load global properties from cells. | 4528 // used to load global properties from cells. |
(...skipping 7539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12068 if (break_point_objects()->IsUndefined()) return 0; | 12068 if (break_point_objects()->IsUndefined()) return 0; |
12069 // Single break point. | 12069 // Single break point. |
12070 if (!break_point_objects()->IsFixedArray()) return 1; | 12070 if (!break_point_objects()->IsFixedArray()) return 1; |
12071 // Multiple break points. | 12071 // Multiple break points. |
12072 return FixedArray::cast(break_point_objects())->length(); | 12072 return FixedArray::cast(break_point_objects())->length(); |
12073 } | 12073 } |
12074 #endif | 12074 #endif |
12075 | 12075 |
12076 | 12076 |
12077 } } // namespace v8::internal | 12077 } } // namespace v8::internal |
OLD | NEW |