diff --git a/src/heap.cc b/src/heap.cc index 64489a1cce..1f11f5aac2 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -2799,6 +2799,7 @@ MaybeObject* Heap::CreateCode(const CodeDesc& desc, code->set_check_type(RECEIVER_MAP_CHECK); } code->set_deoptimization_data(empty_fixed_array()); + code->set_next_code_flushing_candidate(undefined_value()); // Allow self references to created code object by patching the handle to // point to the newly allocated Code object. if (!self_reference.is_null()) { diff --git a/src/mark-compact.cc b/src/mark-compact.cc index 68a506226d..b56adb6384 100644 --- a/src/mark-compact.cc +++ b/src/mark-compact.cc @@ -1,4 +1,4 @@ -// Copyright 2006-2008 the V8 project authors. All rights reserved. +// Copyright 2011 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -305,13 +305,11 @@ class CodeFlusher { *GetNextCandidateField(candidate) = next_candidate; } - STATIC_ASSERT(kPointerSize <= Code::kHeaderSize - Code::kHeaderPaddingStart); - static SharedFunctionInfo** GetNextCandidateField( SharedFunctionInfo* candidate) { Code* code = candidate->unchecked_code(); return reinterpret_cast( - code->address() + Code::kHeaderPaddingStart); + code->address() + Code::kNextCodeFlushingCandidateOffset); } static SharedFunctionInfo* GetNextCandidate(SharedFunctionInfo* candidate) { diff --git a/src/objects-inl.h b/src/objects-inl.h index 9a38584cba..a49aaec24e 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -3548,6 +3548,8 @@ JSMessageObject* JSMessageObject::cast(Object* obj) { INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset) ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset) ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset) +ACCESSORS(Code, next_code_flushing_candidate, + Object, kNextCodeFlushingCandidateOffset) byte* Code::instruction_start() { diff --git a/src/objects.h b/src/objects.h index be4652bed5..fca694aa97 100644 --- a/src/objects.h +++ b/src/objects.h @@ -3317,6 +3317,12 @@ class Code: public HeapObject { // [deoptimization_data]: Array containing data for deopt. DECL_ACCESSORS(deoptimization_data, FixedArray) + // [code_flushing_candidate]: Field only used during garbage + // collection to hold code flushing candidates. The contents of this + // field does not have to be traced during garbage collection since + // it is only used by the garbage collector itself. + DECL_ACCESSORS(next_code_flushing_candidate, Object) + // Unchecked accessors to be used during GC. inline ByteArray* unchecked_relocation_info(); inline FixedArray* unchecked_deoptimization_data(); @@ -3537,9 +3543,12 @@ class Code: public HeapObject { static const int kRelocationInfoOffset = kInstructionSizeOffset + kIntSize; static const int kDeoptimizationDataOffset = kRelocationInfoOffset + kPointerSize; - static const int kFlagsOffset = kDeoptimizationDataOffset + kPointerSize; - static const int kKindSpecificFlagsOffset = kFlagsOffset + kIntSize; + static const int kNextCodeFlushingCandidateOffset = + kDeoptimizationDataOffset + kPointerSize; + static const int kFlagsOffset = + kNextCodeFlushingCandidateOffset + kPointerSize; + static const int kKindSpecificFlagsOffset = kFlagsOffset + kIntSize; static const int kKindSpecificFlagsSize = 2 * kIntSize; static const int kHeaderPaddingStart = kKindSpecificFlagsOffset +