| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index c2220860b779f7f9ae710adc273046f1e7aabf82..1b298fceb7c1626706e69016795eff3a28cd6b0e 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -184,6 +184,18 @@ enum DescriptorFlag {
|
| OWN_DESCRIPTORS
|
| };
|
|
|
| +// The GC maintains a bit of information, the MarkingParity, which toggles
|
| +// from odd to even and back every time marking is completed. Incremental
|
| +// marking can visit an object twice during a marking phase, so algorithms that
|
| +// that piggy-back on marking can use the parity to ensure that they only
|
| +// perform an operation on an object once per marking phase: they record the
|
| +// MarkingParity when they visit an object, and only re-visit the object when it
|
| +// is marked again and the MarkingParity changes.
|
| +enum MarkingParity {
|
| + NO_MARKING_PARITY,
|
| + ODD_MARKING_PARITY,
|
| + EVEN_MARKING_PARITY
|
| +};
|
|
|
| // Instance size sentinel for objects of variable size.
|
| const int kVariableSizeSentinel = 0;
|
| @@ -4501,6 +4513,23 @@ class Code: public HeapObject {
|
| void ClearInlineCaches();
|
| void ClearTypeFeedbackCells(Heap* heap);
|
|
|
| +#define DECLARE_CODE_AGE_ENUM(X) k##X##CodeAge,
|
| + enum Age {
|
| + kNoAge = 0,
|
| + CODE_AGE_LIST(DECLARE_CODE_AGE_ENUM)
|
| + kAfterLastCodeAge,
|
| + kLastCodeAge = kAfterLastCodeAge - 1,
|
| + kCodeAgeCount = kAfterLastCodeAge - 1
|
| + };
|
| +#undef DECLARE_CODE_AGE_ENUM
|
| +
|
| + // Code aging
|
| + static void MakeCodeAgeSequenceYoung(byte* sequence);
|
| + void MakeYoung();
|
| + void MakeOlder(MarkingParity);
|
| + static bool IsYoungSequence(byte* sequence);
|
| + bool IsOld();
|
| +
|
| // Max loop nesting marker used to postpose OSR. We don't take loop
|
| // nesting that is deeper than 5 levels into account.
|
| static const int kMaxLoopNestingMarker = 6;
|
| @@ -4629,6 +4658,21 @@ class Code: public HeapObject {
|
| TypeField::kMask | CacheHolderField::kMask;
|
|
|
| private:
|
| + friend class RelocIterator;
|
| +
|
| + // Code aging
|
| + byte* FindCodeAgeSequence();
|
| + static void GetCodeAgeAndParity(Code* code, Age* age,
|
| + MarkingParity* parity);
|
| + static void GetCodeAgeAndParity(byte* sequence, Age* age,
|
| + MarkingParity* parity);
|
| + static Code* GetCodeAgeStub(Age age, MarkingParity parity);
|
| +
|
| + // Code aging -- platform-specific
|
| + byte* FindPlatformCodeAgeSequence();
|
| + static void PatchPlatformCodeAge(byte* sequence, Age age,
|
| + MarkingParity parity);
|
| +
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(Code);
|
| };
|
|
|
| @@ -5609,14 +5653,6 @@ class SharedFunctionInfo: public HeapObject {
|
| // iteration by the debugger).
|
| DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation_without_context)
|
|
|
| - // Indicates how many full GCs this function has survived with assigned
|
| - // code object. Used to determine when it is relatively safe to flush
|
| - // this code object and replace it with lazy compilation stub.
|
| - // Age is reset when GC notices that the code object is referenced
|
| - // from the stack or compilation cache.
|
| - inline int code_age();
|
| - inline void set_code_age(int age);
|
| -
|
| // Indicates whether optimizations have been disabled for this
|
| // shared function info. If a function is repeatedly optimized or if
|
| // we cannot optimize the function we disable optimization to avoid
|
| @@ -5887,16 +5923,12 @@ class SharedFunctionInfo: public HeapObject {
|
| static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1);
|
|
|
| // Bit positions in compiler_hints.
|
| - static const int kCodeAgeSize = 3;
|
| - static const int kCodeAgeMask = (1 << kCodeAgeSize) - 1;
|
| -
|
| enum CompilerHints {
|
| kHasOnlySimpleThisPropertyAssignments,
|
| kAllowLazyCompilation,
|
| kAllowLazyCompilationWithoutContext,
|
| kLiveObjectsMayExist,
|
| - kCodeAgeShift,
|
| - kOptimizationDisabled = kCodeAgeShift + kCodeAgeSize,
|
| + kOptimizationDisabled,
|
| kStrictModeFunction,
|
| kExtendedModeFunction,
|
| kUsesArguments,
|
| @@ -8918,6 +8950,10 @@ class ObjectVisitor BASE_EMBEDDED {
|
| // Visits a debug call target in the instruction stream.
|
| virtual void VisitDebugTarget(RelocInfo* rinfo);
|
|
|
| + // Visits the byte sequence in a function's prologue that contains information
|
| + // about the code's age.
|
| + virtual void VisitCodeAgeSequence(RelocInfo* rinfo);
|
| +
|
| // Handy shorthand for visiting a single pointer.
|
| virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); }
|
|
|
|
|