| Index: src/globals.h
|
| diff --git a/src/globals.h b/src/globals.h
|
| index da4f9908dbea3d484b4ab531f5472f771320bbe8..a350b60d832842056f495a08a0af9988f96f3d62 100644
|
| --- a/src/globals.h
|
| +++ b/src/globals.h
|
| @@ -8,7 +8,6 @@
|
| #include "../include/v8stdint.h"
|
|
|
| #include "base/macros.h"
|
| -#include "checks.h"
|
|
|
| // Unfortunately, the INFINITY macro cannot be used with the '-pedantic'
|
| // warning flag and certain versions of GCC due to a bug:
|
| @@ -336,546 +335,6 @@ template <typename T, class P = FreeStoreAllocationPolicy> class List;
|
| enum StrictMode { SLOPPY, STRICT };
|
|
|
|
|
| -// Mask for the sign bit in a smi.
|
| -const intptr_t kSmiSignMask = kIntptrSignBit;
|
| -
|
| -const int kObjectAlignmentBits = kPointerSizeLog2;
|
| -const intptr_t kObjectAlignment = 1 << kObjectAlignmentBits;
|
| -const intptr_t kObjectAlignmentMask = kObjectAlignment - 1;
|
| -
|
| -// Desired alignment for pointers.
|
| -const intptr_t kPointerAlignment = (1 << kPointerSizeLog2);
|
| -const intptr_t kPointerAlignmentMask = kPointerAlignment - 1;
|
| -
|
| -// Desired alignment for double values.
|
| -const intptr_t kDoubleAlignment = 8;
|
| -const intptr_t kDoubleAlignmentMask = kDoubleAlignment - 1;
|
| -
|
| -// Desired alignment for generated code is 32 bytes (to improve cache line
|
| -// utilization).
|
| -const int kCodeAlignmentBits = 5;
|
| -const intptr_t kCodeAlignment = 1 << kCodeAlignmentBits;
|
| -const intptr_t kCodeAlignmentMask = kCodeAlignment - 1;
|
| -
|
| -// Tag information for Failure.
|
| -// TODO(yangguo): remove this from space owner calculation.
|
| -const int kFailureTag = 3;
|
| -const int kFailureTagSize = 2;
|
| -const intptr_t kFailureTagMask = (1 << kFailureTagSize) - 1;
|
| -
|
| -
|
| -// Zap-value: The value used for zapping dead objects.
|
| -// Should be a recognizable hex value tagged as a failure.
|
| -#ifdef V8_HOST_ARCH_64_BIT
|
| -const Address kZapValue =
|
| - reinterpret_cast<Address>(V8_UINT64_C(0xdeadbeedbeadbeef));
|
| -const Address kHandleZapValue =
|
| - reinterpret_cast<Address>(V8_UINT64_C(0x1baddead0baddeaf));
|
| -const Address kGlobalHandleZapValue =
|
| - reinterpret_cast<Address>(V8_UINT64_C(0x1baffed00baffedf));
|
| -const Address kFromSpaceZapValue =
|
| - reinterpret_cast<Address>(V8_UINT64_C(0x1beefdad0beefdaf));
|
| -const uint64_t kDebugZapValue = V8_UINT64_C(0xbadbaddbbadbaddb);
|
| -const uint64_t kSlotsZapValue = V8_UINT64_C(0xbeefdeadbeefdeef);
|
| -const uint64_t kFreeListZapValue = 0xfeed1eaffeed1eaf;
|
| -#else
|
| -const Address kZapValue = reinterpret_cast<Address>(0xdeadbeef);
|
| -const Address kHandleZapValue = reinterpret_cast<Address>(0xbaddeaf);
|
| -const Address kGlobalHandleZapValue = reinterpret_cast<Address>(0xbaffedf);
|
| -const Address kFromSpaceZapValue = reinterpret_cast<Address>(0xbeefdaf);
|
| -const uint32_t kSlotsZapValue = 0xbeefdeef;
|
| -const uint32_t kDebugZapValue = 0xbadbaddb;
|
| -const uint32_t kFreeListZapValue = 0xfeed1eaf;
|
| -#endif
|
| -
|
| -const int kCodeZapValue = 0xbadc0de;
|
| -
|
| -// Number of bits to represent the page size for paged spaces. The value of 20
|
| -// gives 1Mb bytes per page.
|
| -const int kPageSizeBits = 20;
|
| -
|
| -// On Intel architecture, cache line size is 64 bytes.
|
| -// On ARM it may be less (32 bytes), but as far this constant is
|
| -// used for aligning data, it doesn't hurt to align on a greater value.
|
| -#define PROCESSOR_CACHE_LINE_SIZE 64
|
| -
|
| -// Constants relevant to double precision floating point numbers.
|
| -// If looking only at the top 32 bits, the QNaN mask is bits 19 to 30.
|
| -const uint32_t kQuietNaNHighBitsMask = 0xfff << (51 - 32);
|
| -
|
| -
|
| -// -----------------------------------------------------------------------------
|
| -// Forward declarations for frequently used classes
|
| -
|
| -class AccessorInfo;
|
| -class Allocation;
|
| -class Arguments;
|
| -class Assembler;
|
| -class Code;
|
| -class CodeGenerator;
|
| -class CodeStub;
|
| -class Context;
|
| -class Debug;
|
| -class Debugger;
|
| -class DebugInfo;
|
| -class Descriptor;
|
| -class DescriptorArray;
|
| -class TransitionArray;
|
| -class ExternalReference;
|
| -class FixedArray;
|
| -class FunctionTemplateInfo;
|
| -class MemoryChunk;
|
| -class SeededNumberDictionary;
|
| -class UnseededNumberDictionary;
|
| -class NameDictionary;
|
| -template <typename T> class MaybeHandle;
|
| -template <typename T> class Handle;
|
| -class Heap;
|
| -class HeapObject;
|
| -class IC;
|
| -class InterceptorInfo;
|
| -class Isolate;
|
| -class JSReceiver;
|
| -class JSArray;
|
| -class JSFunction;
|
| -class JSObject;
|
| -class LargeObjectSpace;
|
| -class LookupResult;
|
| -class MacroAssembler;
|
| -class Map;
|
| -class MapSpace;
|
| -class MarkCompactCollector;
|
| -class NewSpace;
|
| -class Object;
|
| -class OldSpace;
|
| -class Foreign;
|
| -class Scope;
|
| -class ScopeInfo;
|
| -class Script;
|
| -class Smi;
|
| -template <typename Config, class Allocator = FreeStoreAllocationPolicy>
|
| - class SplayTree;
|
| -class String;
|
| -class Name;
|
| -class Struct;
|
| -class Variable;
|
| -class RelocInfo;
|
| -class Deserializer;
|
| -class MessageLocation;
|
| -class VirtualMemory;
|
| -class Mutex;
|
| -class RecursiveMutex;
|
| -
|
| -typedef bool (*WeakSlotCallback)(Object** pointer);
|
| -
|
| -typedef bool (*WeakSlotCallbackWithHeap)(Heap* heap, Object** pointer);
|
| -
|
| -// -----------------------------------------------------------------------------
|
| -// Miscellaneous
|
| -
|
| -// NOTE: SpaceIterator depends on AllocationSpace enumeration values being
|
| -// consecutive.
|
| -enum AllocationSpace {
|
| - NEW_SPACE, // Semispaces collected with copying collector.
|
| - OLD_POINTER_SPACE, // May contain pointers to new space.
|
| - OLD_DATA_SPACE, // Must not have pointers to new space.
|
| - CODE_SPACE, // No pointers to new space, marked executable.
|
| - MAP_SPACE, // Only and all map objects.
|
| - CELL_SPACE, // Only and all cell objects.
|
| - PROPERTY_CELL_SPACE, // Only and all global property cell objects.
|
| - LO_SPACE, // Promoted large objects.
|
| - INVALID_SPACE, // Only used in AllocationResult to signal success.
|
| -
|
| - FIRST_SPACE = NEW_SPACE,
|
| - LAST_SPACE = LO_SPACE,
|
| - FIRST_PAGED_SPACE = OLD_POINTER_SPACE,
|
| - LAST_PAGED_SPACE = PROPERTY_CELL_SPACE
|
| -};
|
| -const int kSpaceTagSize = 3;
|
| -const int kSpaceTagMask = (1 << kSpaceTagSize) - 1;
|
| -
|
| -
|
| -// A flag that indicates whether objects should be pretenured when
|
| -// allocated (allocated directly into the old generation) or not
|
| -// (allocated in the young generation if the object size and type
|
| -// allows).
|
| -enum PretenureFlag { NOT_TENURED, TENURED };
|
| -
|
| -enum MinimumCapacity {
|
| - USE_DEFAULT_MINIMUM_CAPACITY,
|
| - USE_CUSTOM_MINIMUM_CAPACITY
|
| -};
|
| -
|
| -enum GarbageCollector { SCAVENGER, MARK_COMPACTOR };
|
| -
|
| -enum Executability { NOT_EXECUTABLE, EXECUTABLE };
|
| -
|
| -enum VisitMode {
|
| - VISIT_ALL,
|
| - VISIT_ALL_IN_SCAVENGE,
|
| - VISIT_ALL_IN_SWEEP_NEWSPACE,
|
| - VISIT_ONLY_STRONG
|
| -};
|
| -
|
| -// Flag indicating whether code is built into the VM (one of the natives files).
|
| -enum NativesFlag { NOT_NATIVES_CODE, NATIVES_CODE };
|
| -
|
| -
|
| -// A CodeDesc describes a buffer holding instructions and relocation
|
| -// information. The instructions start at the beginning of the buffer
|
| -// and grow forward, the relocation information starts at the end of
|
| -// the buffer and grows backward.
|
| -//
|
| -// |<--------------- buffer_size ---------------->|
|
| -// |<-- instr_size -->| |<-- reloc_size -->|
|
| -// +==================+========+==================+
|
| -// | instructions | free | reloc info |
|
| -// +==================+========+==================+
|
| -// ^
|
| -// |
|
| -// buffer
|
| -
|
| -struct CodeDesc {
|
| - byte* buffer;
|
| - int buffer_size;
|
| - int instr_size;
|
| - int reloc_size;
|
| - Assembler* origin;
|
| -};
|
| -
|
| -
|
| -// Callback function used for iterating objects in heap spaces,
|
| -// for example, scanning heap objects.
|
| -typedef int (*HeapObjectCallback)(HeapObject* obj);
|
| -
|
| -
|
| -// Callback function used for checking constraints when copying/relocating
|
| -// objects. Returns true if an object can be copied/relocated from its
|
| -// old_addr to a new_addr.
|
| -typedef bool (*ConstraintCallback)(Address new_addr, Address old_addr);
|
| -
|
| -
|
| -// Callback function on inline caches, used for iterating over inline caches
|
| -// in compiled code.
|
| -typedef void (*InlineCacheCallback)(Code* code, Address ic);
|
| -
|
| -
|
| -// State for inline cache call sites. Aliased as IC::State.
|
| -enum InlineCacheState {
|
| - // Has never been executed.
|
| - UNINITIALIZED,
|
| - // Has been executed but monomorhic state has been delayed.
|
| - PREMONOMORPHIC,
|
| - // Has been executed and only one receiver type has been seen.
|
| - MONOMORPHIC,
|
| - // Like MONOMORPHIC but check failed due to prototype.
|
| - MONOMORPHIC_PROTOTYPE_FAILURE,
|
| - // Multiple receiver types have been seen.
|
| - POLYMORPHIC,
|
| - // Many receiver types have been seen.
|
| - MEGAMORPHIC,
|
| - // A generic handler is installed and no extra typefeedback is recorded.
|
| - GENERIC,
|
| - // Special state for debug break or step in prepare stubs.
|
| - DEBUG_STUB
|
| -};
|
| -
|
| -
|
| -enum CallFunctionFlags {
|
| - NO_CALL_FUNCTION_FLAGS,
|
| - CALL_AS_METHOD,
|
| - // Always wrap the receiver and call to the JSFunction. Only use this flag
|
| - // both the receiver type and the target method are statically known.
|
| - WRAP_AND_CALL
|
| -};
|
| -
|
| -
|
| -enum CallConstructorFlags {
|
| - NO_CALL_CONSTRUCTOR_FLAGS,
|
| - // The call target is cached in the instruction stream.
|
| - RECORD_CONSTRUCTOR_TARGET
|
| -};
|
| -
|
| -
|
| -enum InlineCacheHolderFlag {
|
| - OWN_MAP, // For fast properties objects.
|
| - PROTOTYPE_MAP // For slow properties objects (except GlobalObjects).
|
| -};
|
| -
|
| -
|
| -// The Store Buffer (GC).
|
| -typedef enum {
|
| - kStoreBufferFullEvent,
|
| - kStoreBufferStartScanningPagesEvent,
|
| - kStoreBufferScanningPageEvent
|
| -} StoreBufferEvent;
|
| -
|
| -
|
| -typedef void (*StoreBufferCallback)(Heap* heap,
|
| - MemoryChunk* page,
|
| - StoreBufferEvent event);
|
| -
|
| -
|
| -// Union used for fast testing of specific double values.
|
| -union DoubleRepresentation {
|
| - double value;
|
| - int64_t bits;
|
| - DoubleRepresentation(double x) { value = x; }
|
| - bool operator==(const DoubleRepresentation& other) const {
|
| - return bits == other.bits;
|
| - }
|
| -};
|
| -
|
| -
|
| -// Union used for customized checking of the IEEE double types
|
| -// inlined within v8 runtime, rather than going to the underlying
|
| -// platform headers and libraries
|
| -union IeeeDoubleLittleEndianArchType {
|
| - double d;
|
| - struct {
|
| - unsigned int man_low :32;
|
| - unsigned int man_high :20;
|
| - unsigned int exp :11;
|
| - unsigned int sign :1;
|
| - } bits;
|
| -};
|
| -
|
| -
|
| -union IeeeDoubleBigEndianArchType {
|
| - double d;
|
| - struct {
|
| - unsigned int sign :1;
|
| - unsigned int exp :11;
|
| - unsigned int man_high :20;
|
| - unsigned int man_low :32;
|
| - } bits;
|
| -};
|
| -
|
| -
|
| -// AccessorCallback
|
| -struct AccessorDescriptor {
|
| - Object* (*getter)(Isolate* isolate, Object* object, void* data);
|
| - Object* (*setter)(
|
| - Isolate* isolate, JSObject* object, Object* value, void* data);
|
| - void* data;
|
| -};
|
| -
|
| -
|
| -// Logging and profiling. A StateTag represents a possible state of
|
| -// the VM. The logger maintains a stack of these. Creating a VMState
|
| -// object enters a state by pushing on the stack, and destroying a
|
| -// VMState object leaves a state by popping the current state from the
|
| -// stack.
|
| -
|
| -enum StateTag {
|
| - JS,
|
| - GC,
|
| - COMPILER,
|
| - OTHER,
|
| - EXTERNAL,
|
| - IDLE
|
| -};
|
| -
|
| -
|
| -// -----------------------------------------------------------------------------
|
| -// Macros
|
| -
|
| -// Testers for test.
|
| -
|
| -#define HAS_SMI_TAG(value) \
|
| - ((reinterpret_cast<intptr_t>(value) & kSmiTagMask) == kSmiTag)
|
| -
|
| -#define HAS_FAILURE_TAG(value) \
|
| - ((reinterpret_cast<intptr_t>(value) & kFailureTagMask) == kFailureTag)
|
| -
|
| -// OBJECT_POINTER_ALIGN returns the value aligned as a HeapObject pointer
|
| -#define OBJECT_POINTER_ALIGN(value) \
|
| - (((value) + kObjectAlignmentMask) & ~kObjectAlignmentMask)
|
| -
|
| -// POINTER_SIZE_ALIGN returns the value aligned as a pointer.
|
| -#define POINTER_SIZE_ALIGN(value) \
|
| - (((value) + kPointerAlignmentMask) & ~kPointerAlignmentMask)
|
| -
|
| -// CODE_POINTER_ALIGN returns the value aligned as a generated code segment.
|
| -#define CODE_POINTER_ALIGN(value) \
|
| - (((value) + kCodeAlignmentMask) & ~kCodeAlignmentMask)
|
| -
|
| -// Support for tracking C++ memory allocation. Insert TRACK_MEMORY("Fisk")
|
| -// inside a C++ class and new and delete will be overloaded so logging is
|
| -// performed.
|
| -// This file (globals.h) is included before log.h, so we use direct calls to
|
| -// the Logger rather than the LOG macro.
|
| -#ifdef DEBUG
|
| -#define TRACK_MEMORY(name) \
|
| - void* operator new(size_t size) { \
|
| - void* result = ::operator new(size); \
|
| - Logger::NewEventStatic(name, result, size); \
|
| - return result; \
|
| - } \
|
| - void operator delete(void* object) { \
|
| - Logger::DeleteEventStatic(name, object); \
|
| - ::operator delete(object); \
|
| - }
|
| -#else
|
| -#define TRACK_MEMORY(name)
|
| -#endif
|
| -
|
| -
|
| -// CPU feature flags.
|
| -enum CpuFeature {
|
| - // x86
|
| - SSE4_1,
|
| - SSE3,
|
| - SAHF,
|
| - // ARM
|
| - VFP3,
|
| - ARMv7,
|
| - SUDIV,
|
| - UNALIGNED_ACCESSES,
|
| - MOVW_MOVT_IMMEDIATE_LOADS,
|
| - VFP32DREGS,
|
| - NEON,
|
| - // MIPS
|
| - FPU,
|
| - // ARM64
|
| - ALWAYS_ALIGN_CSP,
|
| - NUMBER_OF_CPU_FEATURES
|
| -};
|
| -
|
| -
|
| -// Used to specify if a macro instruction must perform a smi check on tagged
|
| -// values.
|
| -enum SmiCheckType {
|
| - DONT_DO_SMI_CHECK,
|
| - DO_SMI_CHECK
|
| -};
|
| -
|
| -
|
| -enum ScopeType {
|
| - EVAL_SCOPE, // The top-level scope for an eval source.
|
| - FUNCTION_SCOPE, // The top-level scope for a function.
|
| - MODULE_SCOPE, // The scope introduced by a module literal
|
| - GLOBAL_SCOPE, // The top-level scope for a program or a top-level eval.
|
| - CATCH_SCOPE, // The scope introduced by catch.
|
| - BLOCK_SCOPE, // The scope introduced by a new block.
|
| - WITH_SCOPE // The scope introduced by with.
|
| -};
|
| -
|
| -
|
| -const uint32_t kHoleNanUpper32 = 0x7FFFFFFF;
|
| -const uint32_t kHoleNanLower32 = 0xFFFFFFFF;
|
| -const uint32_t kNaNOrInfinityLowerBoundUpper32 = 0x7FF00000;
|
| -
|
| -const uint64_t kHoleNanInt64 =
|
| - (static_cast<uint64_t>(kHoleNanUpper32) << 32) | kHoleNanLower32;
|
| -const uint64_t kLastNonNaNInt64 =
|
| - (static_cast<uint64_t>(kNaNOrInfinityLowerBoundUpper32) << 32);
|
| -
|
| -
|
| -// The order of this enum has to be kept in sync with the predicates below.
|
| -enum VariableMode {
|
| - // User declared variables:
|
| - VAR, // declared via 'var', and 'function' declarations
|
| -
|
| - CONST_LEGACY, // declared via legacy 'const' declarations
|
| -
|
| - LET, // declared via 'let' declarations (first lexical)
|
| -
|
| - CONST, // declared via 'const' declarations
|
| -
|
| - MODULE, // declared via 'module' declaration (last lexical)
|
| -
|
| - // Variables introduced by the compiler:
|
| - INTERNAL, // like VAR, but not user-visible (may or may not
|
| - // be in a context)
|
| -
|
| - TEMPORARY, // temporary variables (not user-visible), stack-allocated
|
| - // unless the scope as a whole has forced context allocation
|
| -
|
| - DYNAMIC, // always require dynamic lookup (we don't know
|
| - // the declaration)
|
| -
|
| - DYNAMIC_GLOBAL, // requires dynamic lookup, but we know that the
|
| - // variable is global unless it has been shadowed
|
| - // by an eval-introduced variable
|
| -
|
| - DYNAMIC_LOCAL // requires dynamic lookup, but we know that the
|
| - // variable is local and where it is unless it
|
| - // has been shadowed by an eval-introduced
|
| - // variable
|
| -};
|
| -
|
| -
|
| -inline bool IsDynamicVariableMode(VariableMode mode) {
|
| - return mode >= DYNAMIC && mode <= DYNAMIC_LOCAL;
|
| -}
|
| -
|
| -
|
| -inline bool IsDeclaredVariableMode(VariableMode mode) {
|
| - return mode >= VAR && mode <= MODULE;
|
| -}
|
| -
|
| -
|
| -inline bool IsLexicalVariableMode(VariableMode mode) {
|
| - return mode >= LET && mode <= MODULE;
|
| -}
|
| -
|
| -
|
| -inline bool IsImmutableVariableMode(VariableMode mode) {
|
| - return (mode >= CONST && mode <= MODULE) || mode == CONST_LEGACY;
|
| -}
|
| -
|
| -
|
| -// ES6 Draft Rev3 10.2 specifies declarative environment records with mutable
|
| -// and immutable bindings that can be in two states: initialized and
|
| -// uninitialized. In ES5 only immutable bindings have these two states. When
|
| -// accessing a binding, it needs to be checked for initialization. However in
|
| -// the following cases the binding is initialized immediately after creation
|
| -// so the initialization check can always be skipped:
|
| -// 1. Var declared local variables.
|
| -// var foo;
|
| -// 2. A local variable introduced by a function declaration.
|
| -// function foo() {}
|
| -// 3. Parameters
|
| -// function x(foo) {}
|
| -// 4. Catch bound variables.
|
| -// try {} catch (foo) {}
|
| -// 6. Function variables of named function expressions.
|
| -// var x = function foo() {}
|
| -// 7. Implicit binding of 'this'.
|
| -// 8. Implicit binding of 'arguments' in functions.
|
| -//
|
| -// ES5 specified object environment records which are introduced by ES elements
|
| -// such as Program and WithStatement that associate identifier bindings with the
|
| -// properties of some object. In the specification only mutable bindings exist
|
| -// (which may be non-writable) and have no distinct initialization step. However
|
| -// V8 allows const declarations in global code with distinct creation and
|
| -// initialization steps which are represented by non-writable properties in the
|
| -// global object. As a result also these bindings need to be checked for
|
| -// initialization.
|
| -//
|
| -// The following enum specifies a flag that indicates if the binding needs a
|
| -// distinct initialization step (kNeedsInitialization) or if the binding is
|
| -// immediately initialized upon creation (kCreatedInitialized).
|
| -enum InitializationFlag {
|
| - kNeedsInitialization,
|
| - kCreatedInitialized
|
| -};
|
| -
|
| -
|
| -enum ClearExceptionFlag {
|
| - KEEP_EXCEPTION,
|
| - CLEAR_EXCEPTION
|
| -};
|
| -
|
| -
|
| -enum MinusZeroMode {
|
| - TREAT_MINUS_ZERO_AS_ZERO,
|
| - FAIL_ON_MINUS_ZERO
|
| -};
|
| -
|
| } } // namespace v8::internal
|
|
|
| -namespace i = v8::internal;
|
| -
|
| #endif // V8_GLOBALS_H_
|
|
|