| OLD | NEW | 
|     1 // Copyright 2012 the V8 project authors. All rights reserved. |     1 // Copyright 2012 the V8 project authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 #include "src/v8.h" |     5 #include "src/v8.h" | 
|     6  |     6  | 
|     7 #include "src/base/atomicops.h" |     7 #include "src/base/atomicops.h" | 
|     8 #include "src/base/bits.h" |     8 #include "src/base/bits.h" | 
|     9 #include "src/code-stubs.h" |     9 #include "src/code-stubs.h" | 
|    10 #include "src/compilation-cache.h" |    10 #include "src/compilation-cache.h" | 
| (...skipping 1923 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1934  |  1934  | 
|  1935       offset += 2; |  1935       offset += 2; | 
|  1936       current_cell >>= 2; |  1936       current_cell >>= 2; | 
|  1937  |  1937  | 
|  1938       // TODO(hpayer): Refactor EvacuateObject and call this function instead. |  1938       // TODO(hpayer): Refactor EvacuateObject and call this function instead. | 
|  1939       if (heap()->ShouldBePromoted(object->address(), size) && |  1939       if (heap()->ShouldBePromoted(object->address(), size) && | 
|  1940           TryPromoteObject(object, size)) { |  1940           TryPromoteObject(object, size)) { | 
|  1941         continue; |  1941         continue; | 
|  1942       } |  1942       } | 
|  1943  |  1943  | 
|  1944       AllocationAlignment alignment = object->NeedsToEnsureDoubleAlignment() |  1944       AllocationAlignment alignment = object->RequiredAlignment(); | 
|  1945                                           ? kDoubleAligned |  | 
|  1946                                           : kWordAligned; |  | 
|  1947       AllocationResult allocation = new_space->AllocateRaw(size, alignment); |  1945       AllocationResult allocation = new_space->AllocateRaw(size, alignment); | 
|  1948       if (allocation.IsRetry()) { |  1946       if (allocation.IsRetry()) { | 
|  1949         if (!new_space->AddFreshPage()) { |  1947         if (!new_space->AddFreshPage()) { | 
|  1950           // Shouldn't happen. We are sweeping linearly, and to-space |  1948           // Shouldn't happen. We are sweeping linearly, and to-space | 
|  1951           // has the same number of pages as from-space, so there is |  1949           // has the same number of pages as from-space, so there is | 
|  1952           // always room. |  1950           // always room. | 
|  1953           UNREACHABLE(); |  1951           UNREACHABLE(); | 
|  1954         } |  1952         } | 
|  1955         allocation = new_space->AllocateRaw(size, alignment); |  1953         allocation = new_space->AllocateRaw(size, alignment); | 
|  1956         DCHECK(!allocation.IsRetry()); |  1954         DCHECK(!allocation.IsRetry()); | 
| (...skipping 1141 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3098 } |  3096 } | 
|  3099  |  3097  | 
|  3100  |  3098  | 
|  3101 bool MarkCompactCollector::TryPromoteObject(HeapObject* object, |  3099 bool MarkCompactCollector::TryPromoteObject(HeapObject* object, | 
|  3102                                             int object_size) { |  3100                                             int object_size) { | 
|  3103   DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); |  3101   DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); | 
|  3104  |  3102  | 
|  3105   OldSpace* old_space = heap()->old_space(); |  3103   OldSpace* old_space = heap()->old_space(); | 
|  3106  |  3104  | 
|  3107   HeapObject* target; |  3105   HeapObject* target; | 
|  3108   AllocationAlignment alignment = |  3106   AllocationAlignment alignment = object->RequiredAlignment(); | 
|  3109       object->NeedsToEnsureDoubleAlignment() ? kDoubleAligned : kWordAligned; |  | 
|  3110   AllocationResult allocation = old_space->AllocateRaw(object_size, alignment); |  3107   AllocationResult allocation = old_space->AllocateRaw(object_size, alignment); | 
|  3111   if (allocation.To(&target)) { |  3108   if (allocation.To(&target)) { | 
|  3112     MigrateObject(target, object, object_size, old_space->identity()); |  3109     MigrateObject(target, object, object_size, old_space->identity()); | 
|  3113     heap()->IncrementPromotedObjectsSize(object_size); |  3110     heap()->IncrementPromotedObjectsSize(object_size); | 
|  3114     return true; |  3111     return true; | 
|  3115   } |  3112   } | 
|  3116  |  3113  | 
|  3117   return false; |  3114   return false; | 
|  3118 } |  3115 } | 
|  3119  |  3116  | 
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3323  |  3320  | 
|  3324     if (*cell == 0) continue; |  3321     if (*cell == 0) continue; | 
|  3325  |  3322  | 
|  3326     int live_objects = MarkWordToObjectStarts(*cell, offsets); |  3323     int live_objects = MarkWordToObjectStarts(*cell, offsets); | 
|  3327     for (int i = 0; i < live_objects; i++) { |  3324     for (int i = 0; i < live_objects; i++) { | 
|  3328       Address object_addr = cell_base + offsets[i] * kPointerSize; |  3325       Address object_addr = cell_base + offsets[i] * kPointerSize; | 
|  3329       HeapObject* object = HeapObject::FromAddress(object_addr); |  3326       HeapObject* object = HeapObject::FromAddress(object_addr); | 
|  3330       DCHECK(Marking::IsBlack(Marking::MarkBitFrom(object))); |  3327       DCHECK(Marking::IsBlack(Marking::MarkBitFrom(object))); | 
|  3331  |  3328  | 
|  3332       int size = object->Size(); |  3329       int size = object->Size(); | 
|  3333  |  3330       AllocationAlignment alignment = object->RequiredAlignment(); | 
|  3334       AllocationAlignment alignment = object->NeedsToEnsureDoubleAlignment() |  | 
|  3335                                           ? kDoubleAligned |  | 
|  3336                                           : kWordAligned; |  | 
|  3337       HeapObject* target_object; |  3331       HeapObject* target_object; | 
|  3338       AllocationResult allocation = space->AllocateRaw(size, alignment); |  3332       AllocationResult allocation = space->AllocateRaw(size, alignment); | 
|  3339       if (!allocation.To(&target_object)) { |  3333       if (!allocation.To(&target_object)) { | 
|  3340         // If allocation failed, use emergency memory and re-try allocation. |  3334         // If allocation failed, use emergency memory and re-try allocation. | 
|  3341         CHECK(space->HasEmergencyMemory()); |  3335         CHECK(space->HasEmergencyMemory()); | 
|  3342         space->UseEmergencyMemory(); |  3336         space->UseEmergencyMemory(); | 
|  3343         allocation = space->AllocateRaw(size, alignment); |  3337         allocation = space->AllocateRaw(size, alignment); | 
|  3344       } |  3338       } | 
|  3345       if (!allocation.To(&target_object)) { |  3339       if (!allocation.To(&target_object)) { | 
|  3346         // OS refused to give us memory. |  3340         // OS refused to give us memory. | 
| (...skipping 1417 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4764   SlotsBuffer* buffer = *buffer_address; |  4758   SlotsBuffer* buffer = *buffer_address; | 
|  4765   while (buffer != NULL) { |  4759   while (buffer != NULL) { | 
|  4766     SlotsBuffer* next_buffer = buffer->next(); |  4760     SlotsBuffer* next_buffer = buffer->next(); | 
|  4767     DeallocateBuffer(buffer); |  4761     DeallocateBuffer(buffer); | 
|  4768     buffer = next_buffer; |  4762     buffer = next_buffer; | 
|  4769   } |  4763   } | 
|  4770   *buffer_address = NULL; |  4764   *buffer_address = NULL; | 
|  4771 } |  4765 } | 
|  4772 } |  4766 } | 
|  4773 }  // namespace v8::internal |  4767 }  // namespace v8::internal | 
| OLD | NEW |