| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index 33ee5f3746c52de23baadc1f7bc26e431474b3ca..b5d03bc94367d67821db5962e80939d558d627ed 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -79,6 +79,7 @@ Heap::Heap()
|
| // ConfigureHeap (survived_since_last_expansion_, external_allocation_limit_)
|
| // Will be 4 * reserved_semispace_size_ to ensure that young
|
| // generation can be aligned to its size.
|
| + maximum_committed_(0),
|
| survived_since_last_expansion_(0),
|
| sweep_generation_(0),
|
| always_allocate_scope_depth_(0),
|
| @@ -232,6 +233,16 @@ intptr_t Heap::CommittedMemoryExecutable() {
|
| }
|
|
|
|
|
| +void Heap::UpdateMaximumCommitted() {
|
| + if (!HasBeenSetUp()) return;
|
| +
|
| + intptr_t current_committed_memory = CommittedMemory();
|
| + if (current_committed_memory > maximum_committed_) {
|
| + maximum_committed_ = current_committed_memory;
|
| + }
|
| +}
|
| +
|
| +
|
| intptr_t Heap::Available() {
|
| if (!HasBeenSetUp()) return 0;
|
|
|
| @@ -441,6 +452,8 @@ void Heap::GarbageCollectionPrologue() {
|
| #endif
|
| }
|
|
|
| + UpdateMaximumCommitted();
|
| +
|
| #ifdef DEBUG
|
| ASSERT(!AllowHeapAllocation::IsAllowed() && gc_state_ == NOT_IN_GC);
|
|
|
| @@ -467,6 +480,20 @@ intptr_t Heap::SizeOfObjects() {
|
| }
|
|
|
|
|
| +void Heap::ClearAllICsByKind(Code::Kind kind) {
|
| + HeapObjectIterator it(code_space());
|
| +
|
| + for (Object* object = it.Next(); object != NULL; object = it.Next()) {
|
| + Code* code = Code::cast(object);
|
| + Code::Kind current_kind = code->kind();
|
| + if (current_kind == Code::FUNCTION ||
|
| + current_kind == Code::OPTIMIZED_FUNCTION) {
|
| + code->ClearInlineCaches(kind);
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| void Heap::RepairFreeListsAfterBoot() {
|
| PagedSpaces spaces(this);
|
| for (PagedSpace* space = spaces.next();
|
| @@ -506,6 +533,8 @@ void Heap::GarbageCollectionEpilogue() {
|
| }
|
| }
|
|
|
| + UpdateMaximumCommitted();
|
| +
|
| isolate_->counters()->alive_after_last_gc()->Set(
|
| static_cast<int>(SizeOfObjects()));
|
|
|
| @@ -567,6 +596,9 @@ void Heap::GarbageCollectionEpilogue() {
|
| property_cell_space()->CommittedMemory() / KB));
|
| isolate_->counters()->heap_sample_code_space_committed()->AddSample(
|
| static_cast<int>(code_space()->CommittedMemory() / KB));
|
| +
|
| + isolate_->counters()->heap_sample_maximum_committed()->AddSample(
|
| + static_cast<int>(MaximumCommittedMemory() / KB));
|
| }
|
|
|
| #define UPDATE_COUNTERS_FOR_SPACE(space) \
|
| @@ -735,6 +767,7 @@ int Heap::NotifyContextDisposed() {
|
| isolate()->optimizing_compiler_thread()->Flush();
|
| }
|
| flush_monomorphic_ics_ = true;
|
| + AgeInlineCaches();
|
| return ++contexts_disposed_;
|
| }
|
|
|
| @@ -807,9 +840,7 @@ static bool AbortIncrementalMarkingAndCollectGarbage(
|
| }
|
|
|
|
|
| -void Heap::ReserveSpace(
|
| - int *sizes,
|
| - Address *locations_out) {
|
| +void Heap::ReserveSpace(int *sizes, Address *locations_out) {
|
| bool gc_performed = true;
|
| int counter = 0;
|
| static const int kThreshold = 20;
|
| @@ -1132,8 +1163,6 @@ void Heap::MarkCompact(GCTracer* tracer) {
|
|
|
| isolate_->counters()->objs_since_last_full()->Set(0);
|
|
|
| - contexts_disposed_ = 0;
|
| -
|
| flush_monomorphic_ics_ = false;
|
| }
|
|
|
| @@ -2436,7 +2465,7 @@ void Heap::ScavengeObjectSlow(HeapObject** p, HeapObject* object) {
|
| MaybeObject* Heap::AllocatePartialMap(InstanceType instance_type,
|
| int instance_size) {
|
| Object* result;
|
| - MaybeObject* maybe_result = AllocateRawMap();
|
| + MaybeObject* maybe_result = AllocateRaw(Map::kSize, MAP_SPACE, MAP_SPACE);
|
| if (!maybe_result->ToObject(&result)) return maybe_result;
|
|
|
| // Map::cast cannot be used due to uninitialized map field.
|
| @@ -2461,7 +2490,7 @@ MaybeObject* Heap::AllocateMap(InstanceType instance_type,
|
| int instance_size,
|
| ElementsKind elements_kind) {
|
| Object* result;
|
| - MaybeObject* maybe_result = AllocateRawMap();
|
| + MaybeObject* maybe_result = AllocateRaw(Map::kSize, MAP_SPACE, MAP_SPACE);
|
| if (!maybe_result->To(&result)) return maybe_result;
|
|
|
| Map* map = reinterpret_cast<Map*>(result);
|
| @@ -2953,8 +2982,11 @@ MaybeObject* Heap::AllocateHeapNumber(double value, PretenureFlag pretenure) {
|
|
|
|
|
| MaybeObject* Heap::AllocateCell(Object* value) {
|
| + int size = Cell::kSize;
|
| + STATIC_ASSERT(Cell::kSize <= Page::kNonCodeObjectAreaSize);
|
| +
|
| Object* result;
|
| - { MaybeObject* maybe_result = AllocateRawCell();
|
| + { MaybeObject* maybe_result = AllocateRaw(size, CELL_SPACE, CELL_SPACE);
|
| if (!maybe_result->ToObject(&result)) return maybe_result;
|
| }
|
| HeapObject::cast(result)->set_map_no_write_barrier(cell_map());
|
| @@ -2964,8 +2996,12 @@ MaybeObject* Heap::AllocateCell(Object* value) {
|
|
|
|
|
| MaybeObject* Heap::AllocatePropertyCell() {
|
| + int size = PropertyCell::kSize;
|
| + STATIC_ASSERT(PropertyCell::kSize <= Page::kNonCodeObjectAreaSize);
|
| +
|
| Object* result;
|
| - MaybeObject* maybe_result = AllocateRawPropertyCell();
|
| + MaybeObject* maybe_result =
|
| + AllocateRaw(size, PROPERTY_CELL_SPACE, PROPERTY_CELL_SPACE);
|
| if (!maybe_result->ToObject(&result)) return maybe_result;
|
|
|
| HeapObject::cast(result)->set_map_no_write_barrier(
|
| @@ -3275,11 +3311,13 @@ bool Heap::CreateInitialObjects() {
|
| { MaybeObject* maybe_obj = AllocateSymbol();
|
| if (!maybe_obj->ToObject(&obj)) return false;
|
| }
|
| + Symbol::cast(obj)->set_is_private(true);
|
| set_frozen_symbol(Symbol::cast(obj));
|
|
|
| { MaybeObject* maybe_obj = AllocateSymbol();
|
| if (!maybe_obj->ToObject(&obj)) return false;
|
| }
|
| + Symbol::cast(obj)->set_is_private(true);
|
| set_elements_transition_symbol(Symbol::cast(obj));
|
|
|
| { MaybeObject* maybe_obj = SeededNumberDictionary::Allocate(this, 0, TENURED);
|
| @@ -3291,6 +3329,7 @@ bool Heap::CreateInitialObjects() {
|
| { MaybeObject* maybe_obj = AllocateSymbol();
|
| if (!maybe_obj->ToObject(&obj)) return false;
|
| }
|
| + Symbol::cast(obj)->set_is_private(true);
|
| set_observed_symbol(Symbol::cast(obj));
|
|
|
| // Handling of script id generation is in Factory::NewScript.
|
| @@ -4073,13 +4112,12 @@ MaybeObject* Heap::LookupSingleCharacterStringFromCode(uint16_t code) {
|
| return result;
|
| }
|
|
|
| - Object* result;
|
| + SeqTwoByteString* result;
|
| { MaybeObject* maybe_result = AllocateRawTwoByteString(1);
|
| - if (!maybe_result->ToObject(&result)) return maybe_result;
|
| + if (!maybe_result->To<SeqTwoByteString>(&result)) return maybe_result;
|
| }
|
| - String* answer = String::cast(result);
|
| - answer->Set(0, code);
|
| - return answer;
|
| + result->SeqTwoByteStringSet(0, code);
|
| + return result;
|
| }
|
|
|
|
|
| @@ -4160,7 +4198,7 @@ MaybeObject* Heap::CreateCode(const CodeDesc& desc,
|
| if (force_lo_space) {
|
| maybe_result = lo_space_->AllocateRaw(obj_size, EXECUTABLE);
|
| } else {
|
| - maybe_result = code_space_->AllocateRaw(obj_size);
|
| + maybe_result = AllocateRaw(obj_size, CODE_SPACE, CODE_SPACE);
|
| }
|
| if (!maybe_result->To<HeapObject>(&result)) return maybe_result;
|
|
|
| @@ -4187,7 +4225,7 @@ MaybeObject* Heap::CreateCode(const CodeDesc& desc,
|
| }
|
| code->set_is_crankshafted(crankshafted);
|
| code->set_deoptimization_data(empty_fixed_array(), SKIP_WRITE_BARRIER);
|
| - code->InitializeTypeFeedbackInfoNoWriteBarrier(undefined_value());
|
| + code->set_raw_type_feedback_info(undefined_value());
|
| code->set_handler_table(empty_fixed_array(), SKIP_WRITE_BARRIER);
|
| code->set_gc_metadata(Smi::FromInt(0));
|
| code->set_ic_age(global_ic_age_);
|
| @@ -4231,7 +4269,7 @@ MaybeObject* Heap::CopyCode(Code* code) {
|
| if (obj_size > code_space()->AreaSize()) {
|
| maybe_result = lo_space_->AllocateRaw(obj_size, EXECUTABLE);
|
| } else {
|
| - maybe_result = code_space_->AllocateRaw(obj_size);
|
| + maybe_result = AllocateRaw(obj_size, CODE_SPACE, CODE_SPACE);
|
| }
|
|
|
| Object* result;
|
| @@ -4274,7 +4312,7 @@ MaybeObject* Heap::CopyCode(Code* code, Vector<byte> reloc_info) {
|
| if (new_obj_size > code_space()->AreaSize()) {
|
| maybe_result = lo_space_->AllocateRaw(new_obj_size, EXECUTABLE);
|
| } else {
|
| - maybe_result = code_space_->AllocateRaw(new_obj_size);
|
| + maybe_result = AllocateRaw(new_obj_size, CODE_SPACE, CODE_SPACE);
|
| }
|
|
|
| Object* result;
|
| @@ -4363,39 +4401,6 @@ void Heap::InitializeFunction(JSFunction* function,
|
| }
|
|
|
|
|
| -MaybeObject* Heap::AllocateFunctionPrototype(JSFunction* function) {
|
| - // Make sure to use globals from the function's context, since the function
|
| - // can be from a different context.
|
| - Context* native_context = function->context()->native_context();
|
| - Map* new_map;
|
| - if (function->shared()->is_generator()) {
|
| - // Generator prototypes can share maps since they don't have "constructor"
|
| - // properties.
|
| - new_map = native_context->generator_object_prototype_map();
|
| - } else {
|
| - // Each function prototype gets a fresh map to avoid unwanted sharing of
|
| - // maps between prototypes of different constructors.
|
| - JSFunction* object_function = native_context->object_function();
|
| - ASSERT(object_function->has_initial_map());
|
| - MaybeObject* maybe_map = object_function->initial_map()->Copy();
|
| - if (!maybe_map->To(&new_map)) return maybe_map;
|
| - }
|
| -
|
| - Object* prototype;
|
| - MaybeObject* maybe_prototype = AllocateJSObjectFromMap(new_map);
|
| - if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype;
|
| -
|
| - if (!function->shared()->is_generator()) {
|
| - MaybeObject* maybe_failure =
|
| - JSObject::cast(prototype)->SetLocalPropertyIgnoreAttributesTrampoline(
|
| - constructor_string(), function, DONT_ENUM);
|
| - if (maybe_failure->IsFailure()) return maybe_failure;
|
| - }
|
| -
|
| - return prototype;
|
| -}
|
| -
|
| -
|
| MaybeObject* Heap::AllocateFunction(Map* function_map,
|
| SharedFunctionInfo* shared,
|
| Object* prototype,
|
| @@ -4467,48 +4472,6 @@ MaybeObject* Heap::AllocateArgumentsObject(Object* callee, int length) {
|
| }
|
|
|
|
|
| -MaybeObject* Heap::AllocateInitialMap(JSFunction* fun) {
|
| - ASSERT(!fun->has_initial_map());
|
| -
|
| - // First create a new map with the size and number of in-object properties
|
| - // suggested by the function.
|
| - InstanceType instance_type;
|
| - int instance_size;
|
| - int in_object_properties;
|
| - if (fun->shared()->is_generator()) {
|
| - instance_type = JS_GENERATOR_OBJECT_TYPE;
|
| - instance_size = JSGeneratorObject::kSize;
|
| - in_object_properties = 0;
|
| - } else {
|
| - instance_type = JS_OBJECT_TYPE;
|
| - instance_size = fun->shared()->CalculateInstanceSize();
|
| - in_object_properties = fun->shared()->CalculateInObjectProperties();
|
| - }
|
| - Map* map;
|
| - MaybeObject* maybe_map = AllocateMap(instance_type, instance_size);
|
| - if (!maybe_map->To(&map)) return maybe_map;
|
| -
|
| - // Fetch or allocate prototype.
|
| - Object* prototype;
|
| - if (fun->has_instance_prototype()) {
|
| - prototype = fun->instance_prototype();
|
| - } else {
|
| - MaybeObject* maybe_prototype = AllocateFunctionPrototype(fun);
|
| - if (!maybe_prototype->To(&prototype)) return maybe_prototype;
|
| - }
|
| - map->set_inobject_properties(in_object_properties);
|
| - map->set_unused_property_fields(in_object_properties);
|
| - map->set_prototype(prototype);
|
| - ASSERT(map->has_fast_object_elements());
|
| -
|
| - if (!fun->shared()->is_generator()) {
|
| - fun->shared()->StartInobjectSlackTracking(map);
|
| - }
|
| -
|
| - return map;
|
| -}
|
| -
|
| -
|
| void Heap::InitializeJSObjectFromMap(JSObject* obj,
|
| FixedArray* properties,
|
| Map* map) {
|
| @@ -4615,15 +4578,7 @@ MaybeObject* Heap::AllocateJSObjectFromMapWithAllocationSite(
|
|
|
| MaybeObject* Heap::AllocateJSObject(JSFunction* constructor,
|
| PretenureFlag pretenure) {
|
| - // Allocate the initial map if absent.
|
| - if (!constructor->has_initial_map()) {
|
| - Object* initial_map;
|
| - { MaybeObject* maybe_initial_map = AllocateInitialMap(constructor);
|
| - if (!maybe_initial_map->ToObject(&initial_map)) return maybe_initial_map;
|
| - }
|
| - constructor->set_initial_map(Map::cast(initial_map));
|
| - Map::cast(initial_map)->set_constructor(constructor);
|
| - }
|
| + ASSERT(constructor->has_initial_map());
|
| // Allocate the object based on the constructors initial map.
|
| MaybeObject* result = AllocateJSObjectFromMap(
|
| constructor->initial_map(), pretenure);
|
| @@ -4638,15 +4593,7 @@ MaybeObject* Heap::AllocateJSObject(JSFunction* constructor,
|
|
|
| MaybeObject* Heap::AllocateJSObjectWithAllocationSite(JSFunction* constructor,
|
| Handle<AllocationSite> allocation_site) {
|
| - // Allocate the initial map if absent.
|
| - if (!constructor->has_initial_map()) {
|
| - Object* initial_map;
|
| - { MaybeObject* maybe_initial_map = AllocateInitialMap(constructor);
|
| - if (!maybe_initial_map->ToObject(&initial_map)) return maybe_initial_map;
|
| - }
|
| - constructor->set_initial_map(Map::cast(initial_map));
|
| - Map::cast(initial_map)->set_constructor(constructor);
|
| - }
|
| + ASSERT(constructor->has_initial_map());
|
| // Allocate the object based on the constructors initial map, or the payload
|
| // advice
|
| Map* initial_map = constructor->initial_map();
|
| @@ -4678,23 +4625,6 @@ MaybeObject* Heap::AllocateJSObjectWithAllocationSite(JSFunction* constructor,
|
| }
|
|
|
|
|
| -MaybeObject* Heap::AllocateJSGeneratorObject(JSFunction *function) {
|
| - ASSERT(function->shared()->is_generator());
|
| - Map *map;
|
| - if (function->has_initial_map()) {
|
| - map = function->initial_map();
|
| - } else {
|
| - // Allocate the initial map if absent.
|
| - MaybeObject* maybe_map = AllocateInitialMap(function);
|
| - if (!maybe_map->To(&map)) return maybe_map;
|
| - function->set_initial_map(map);
|
| - map->set_constructor(function);
|
| - }
|
| - ASSERT(map->instance_type() == JS_GENERATOR_OBJECT_TYPE);
|
| - return AllocateJSObjectFromMap(map);
|
| -}
|
| -
|
| -
|
| MaybeObject* Heap::AllocateJSModule(Context* context, ScopeInfo* scope_info) {
|
| // Allocate a fresh map. Modules do not have a prototype.
|
| Map* map;
|
| @@ -4894,7 +4824,8 @@ MaybeObject* Heap::CopyJSObject(JSObject* source, AllocationSite* site) {
|
| { int adjusted_object_size = site != NULL
|
| ? object_size + AllocationMemento::kSize
|
| : object_size;
|
| - MaybeObject* maybe_clone = new_space_.AllocateRaw(adjusted_object_size);
|
| + MaybeObject* maybe_clone =
|
| + AllocateRaw(adjusted_object_size, NEW_SPACE, NEW_SPACE);
|
| if (!maybe_clone->ToObject(&clone)) return maybe_clone;
|
| }
|
| SLOW_ASSERT(InNewSpace(clone));
|
| @@ -5588,12 +5519,22 @@ MaybeObject* Heap::AllocateSymbol() {
|
| Symbol::cast(result)->set_hash_field(
|
| Name::kIsNotArrayIndexMask | (hash << Name::kHashShift));
|
| Symbol::cast(result)->set_name(undefined_value());
|
| + Symbol::cast(result)->set_flags(Smi::FromInt(0));
|
|
|
| - ASSERT(result->IsSymbol());
|
| + ASSERT(!Symbol::cast(result)->is_private());
|
| return result;
|
| }
|
|
|
|
|
| +MaybeObject* Heap::AllocatePrivateSymbol() {
|
| + MaybeObject* maybe = AllocateSymbol();
|
| + Symbol* symbol;
|
| + if (!maybe->To(&symbol)) return maybe;
|
| + symbol->set_is_private(true);
|
| + return symbol;
|
| +}
|
| +
|
| +
|
| MaybeObject* Heap::AllocateNativeContext() {
|
| Object* result;
|
| { MaybeObject* maybe_result =
|
| @@ -5811,12 +5752,7 @@ bool Heap::IdleNotification(int hint) {
|
| size_factor * IncrementalMarking::kAllocatedThreshold;
|
|
|
| if (contexts_disposed_ > 0) {
|
| - if (hint >= kMaxHint) {
|
| - // The embedder is requesting a lot of GC work after context disposal,
|
| - // we age inline caches so that they don't keep objects from
|
| - // the old context alive.
|
| - AgeInlineCaches();
|
| - }
|
| + contexts_disposed_ = 0;
|
| int mark_sweep_time = Min(TimeMarkSweepWouldTakeInMs(), 1000);
|
| if (hint >= mark_sweep_time && !FLAG_expose_gc &&
|
| incremental_marking()->IsStopped()) {
|
| @@ -5825,8 +5761,8 @@ bool Heap::IdleNotification(int hint) {
|
| "idle notification: contexts disposed");
|
| } else {
|
| AdvanceIdleIncrementalMarking(step_size);
|
| - contexts_disposed_ = 0;
|
| }
|
| +
|
| // After context disposal there is likely a lot of garbage remaining, reset
|
| // the idle notification counters in order to trigger more incremental GCs
|
| // on subsequent idle notifications.
|
| @@ -6805,6 +6741,8 @@ void Heap::TearDown() {
|
| }
|
| #endif
|
|
|
| + UpdateMaximumCommitted();
|
| +
|
| if (FLAG_print_cumulative_gc_stat) {
|
| PrintF("\n");
|
| PrintF("gc_count=%d ", gc_count_);
|
| @@ -6819,6 +6757,31 @@ void Heap::TearDown() {
|
| PrintF("\n\n");
|
| }
|
|
|
| + if (FLAG_print_max_heap_committed) {
|
| + PrintF("\n");
|
| + PrintF("maximum_committed_by_heap=%" V8_PTR_PREFIX "d ",
|
| + MaximumCommittedMemory());
|
| + PrintF("maximum_committed_by_new_space=%" V8_PTR_PREFIX "d ",
|
| + new_space_.MaximumCommittedMemory());
|
| + PrintF("maximum_committed_by_old_pointer_space=%" V8_PTR_PREFIX "d ",
|
| + old_data_space_->MaximumCommittedMemory());
|
| + PrintF("maximum_committed_by_old_data_space=%" V8_PTR_PREFIX "d ",
|
| + old_pointer_space_->MaximumCommittedMemory());
|
| + PrintF("maximum_committed_by_old_data_space=%" V8_PTR_PREFIX "d ",
|
| + old_pointer_space_->MaximumCommittedMemory());
|
| + PrintF("maximum_committed_by_code_space=%" V8_PTR_PREFIX "d ",
|
| + code_space_->MaximumCommittedMemory());
|
| + PrintF("maximum_committed_by_map_space=%" V8_PTR_PREFIX "d ",
|
| + map_space_->MaximumCommittedMemory());
|
| + PrintF("maximum_committed_by_cell_space=%" V8_PTR_PREFIX "d ",
|
| + cell_space_->MaximumCommittedMemory());
|
| + PrintF("maximum_committed_by_property_space=%" V8_PTR_PREFIX "d ",
|
| + property_cell_space_->MaximumCommittedMemory());
|
| + PrintF("maximum_committed_by_lo_space=%" V8_PTR_PREFIX "d ",
|
| + lo_space_->MaximumCommittedMemory());
|
| + PrintF("\n\n");
|
| + }
|
| +
|
| TearDownArrayBuffers();
|
|
|
| isolate_->global_handles()->TearDown();
|
| @@ -7937,17 +7900,18 @@ void Heap::CheckpointObjectStats() {
|
| static_cast<int>(object_sizes_last_time_[index]));
|
| FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(ADJUST_LAST_TIME_OBJECT_COUNT)
|
| #undef ADJUST_LAST_TIME_OBJECT_COUNT
|
| -#define ADJUST_LAST_TIME_OBJECT_COUNT(name) \
|
| - index = FIRST_CODE_AGE_SUB_TYPE + Code::k##name##CodeAge; \
|
| - counters->count_of_CODE_AGE_##name()->Increment( \
|
| - static_cast<int>(object_counts_[index])); \
|
| - counters->count_of_CODE_AGE_##name()->Decrement( \
|
| - static_cast<int>(object_counts_last_time_[index])); \
|
| - counters->size_of_CODE_AGE_##name()->Increment( \
|
| - static_cast<int>(object_sizes_[index])); \
|
| - counters->size_of_CODE_AGE_##name()->Decrement( \
|
| +#define ADJUST_LAST_TIME_OBJECT_COUNT(name) \
|
| + index = \
|
| + FIRST_CODE_AGE_SUB_TYPE + Code::k##name##CodeAge - Code::kFirstCodeAge; \
|
| + counters->count_of_CODE_AGE_##name()->Increment( \
|
| + static_cast<int>(object_counts_[index])); \
|
| + counters->count_of_CODE_AGE_##name()->Decrement( \
|
| + static_cast<int>(object_counts_last_time_[index])); \
|
| + counters->size_of_CODE_AGE_##name()->Increment( \
|
| + static_cast<int>(object_sizes_[index])); \
|
| + counters->size_of_CODE_AGE_##name()->Decrement( \
|
| static_cast<int>(object_sizes_last_time_[index]));
|
| - CODE_AGE_LIST_WITH_NO_AGE(ADJUST_LAST_TIME_OBJECT_COUNT)
|
| + CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
|
| #undef ADJUST_LAST_TIME_OBJECT_COUNT
|
|
|
| OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
|
|
|