| Index: src/v8globals.h
|
| diff --git a/src/v8globals.h b/src/v8globals.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2815771a29e5189c1b95413e55bf510a73e081fd
|
| --- /dev/null
|
| +++ b/src/v8globals.h
|
| @@ -0,0 +1,464 @@
|
| +// Copyright 2010 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:
|
| +//
|
| +// * Redistributions of source code must retain the above copyright
|
| +// notice, this list of conditions and the following disclaimer.
|
| +// * Redistributions in binary form must reproduce the above
|
| +// copyright notice, this list of conditions and the following
|
| +// disclaimer in the documentation and/or other materials provided
|
| +// with the distribution.
|
| +// * Neither the name of Google Inc. nor the names of its
|
| +// contributors may be used to endorse or promote products derived
|
| +// from this software without specific prior written permission.
|
| +//
|
| +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| +#ifndef V8_V8GLOBALS_H_
|
| +#define V8_V8GLOBALS_H_
|
| +
|
| +#include "globals.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +
|
| +// This file contains constants and global declarations related to the
|
| +// V8 system.
|
| +
|
| +// 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 maps.
|
| +#if V8_HOST_ARCH_64_BIT
|
| +const intptr_t kMapAlignmentBits = kObjectAlignmentBits;
|
| +#else
|
| +const intptr_t kMapAlignmentBits = kObjectAlignmentBits + 3;
|
| +#endif
|
| +const intptr_t kMapAlignment = (1 << kMapAlignmentBits);
|
| +const intptr_t kMapAlignmentMask = kMapAlignment - 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.
|
| +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 heap object pointer.
|
| +#ifdef V8_HOST_ARCH_64_BIT
|
| +const Address kZapValue =
|
| + reinterpret_cast<Address>(V8_UINT64_C(0xdeadbeedbeadbeed));
|
| +const Address kHandleZapValue =
|
| + reinterpret_cast<Address>(V8_UINT64_C(0x1baddead0baddead));
|
| +const Address kFromSpaceZapValue =
|
| + reinterpret_cast<Address>(V8_UINT64_C(0x1beefdad0beefdad));
|
| +const uint64_t kDebugZapValue = 0xbadbaddbbadbaddb;
|
| +#else
|
| +const Address kZapValue = reinterpret_cast<Address>(0xdeadbeed);
|
| +const Address kHandleZapValue = reinterpret_cast<Address>(0xbaddead);
|
| +const Address kFromSpaceZapValue = reinterpret_cast<Address>(0xbeefdad);
|
| +const uint32_t kDebugZapValue = 0xbadbaddb;
|
| +#endif
|
| +
|
| +
|
| +// Number of bits to represent the page size for paged spaces. The value of 13
|
| +// gives 8K bytes per page.
|
| +const int kPageSizeBits = 13;
|
| +
|
| +// 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.
|
| +const int kProcessorCacheLineSize = 64;
|
| +
|
| +// Constants relevant to double precision floating point numbers.
|
| +
|
| +// Quiet NaNs have bits 51 to 62 set, possibly the sign bit, and no
|
| +// other bits set.
|
| +const uint64_t kQuietNaNMask = static_cast<uint64_t>(0xfff) << 51;
|
| +// 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
|
| +// (sorted alphabetically)
|
| +
|
| +class AccessorInfo;
|
| +class Allocation;
|
| +class Arguments;
|
| +class Assembler;
|
| +class AssertNoAllocation;
|
| +class BreakableStatement;
|
| +class Code;
|
| +class CodeGenerator;
|
| +class CodeStub;
|
| +class Context;
|
| +class Debug;
|
| +class Debugger;
|
| +class DebugInfo;
|
| +class Descriptor;
|
| +class DescriptorArray;
|
| +class Expression;
|
| +class ExternalReference;
|
| +class FixedArray;
|
| +class FunctionEntry;
|
| +class FunctionLiteral;
|
| +class FunctionTemplateInfo;
|
| +class NumberDictionary;
|
| +class StringDictionary;
|
| +template <typename T> class Handle;
|
| +class Heap;
|
| +class HeapObject;
|
| +class IC;
|
| +class InterceptorInfo;
|
| +class IterationStatement;
|
| +class JSArray;
|
| +class JSFunction;
|
| +class JSObject;
|
| +class LargeObjectSpace;
|
| +class LookupResult;
|
| +class MacroAssembler;
|
| +class Map;
|
| +class MapSpace;
|
| +class MarkCompactCollector;
|
| +class NewSpace;
|
| +class NodeVisitor;
|
| +class Object;
|
| +class MaybeObject;
|
| +class OldSpace;
|
| +class Property;
|
| +class Proxy;
|
| +class RegExpNode;
|
| +struct RegExpCompileData;
|
| +class RegExpTree;
|
| +class RegExpCompiler;
|
| +class RegExpVisitor;
|
| +class Scope;
|
| +template<class Allocator = FreeStoreAllocationPolicy> class ScopeInfo;
|
| +class SerializedScopeInfo;
|
| +class Script;
|
| +class Slot;
|
| +class Smi;
|
| +template <typename Config, class Allocator = FreeStoreAllocationPolicy>
|
| + class SplayTree;
|
| +class Statement;
|
| +class String;
|
| +class Struct;
|
| +class SwitchStatement;
|
| +class AstVisitor;
|
| +class Variable;
|
| +class VariableProxy;
|
| +class RelocInfo;
|
| +class Deserializer;
|
| +class MessageLocation;
|
| +class ObjectGroup;
|
| +class TickSample;
|
| +class VirtualMemory;
|
| +class Mutex;
|
| +
|
| +typedef bool (*WeakSlotCallback)(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.
|
| + LO_SPACE, // Promoted large objects.
|
| +
|
| + FIRST_SPACE = NEW_SPACE,
|
| + LAST_SPACE = LO_SPACE,
|
| + FIRST_PAGED_SPACE = OLD_POINTER_SPACE,
|
| + LAST_PAGED_SPACE = 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 GarbageCollector { SCAVENGER, MARK_COMPACTOR };
|
| +
|
| +enum Executability { NOT_EXECUTABLE, EXECUTABLE };
|
| +
|
| +enum VisitMode { VISIT_ALL, VISIT_ALL_IN_SCAVENGE, 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 on object slots, used for iterating heap object slots in
|
| +// HeapObjects, global pointers to heap objects, etc. The callback allows the
|
| +// callback function to change the value of the slot.
|
| +typedef void (*ObjectSlotCallback)(HeapObject** pointer);
|
| +
|
| +
|
| +// 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.
|
| + MEGAMORPHIC,
|
| + // Special states for debug break or step in prepare stubs.
|
| + DEBUG_BREAK,
|
| + DEBUG_PREPARE_STEP_IN
|
| +};
|
| +
|
| +
|
| +enum InLoopFlag {
|
| + NOT_IN_LOOP,
|
| + IN_LOOP
|
| +};
|
| +
|
| +
|
| +enum CallFunctionFlags {
|
| + NO_CALL_FUNCTION_FLAGS = 0,
|
| + RECEIVER_MIGHT_BE_VALUE = 1 << 0 // Receiver might not be a JSObject.
|
| +};
|
| +
|
| +
|
| +enum InlineCacheHolderFlag {
|
| + OWN_MAP, // For fast properties objects.
|
| + PROTOTYPE_MAP // For slow properties objects (except GlobalObjects).
|
| +};
|
| +
|
| +
|
| +// Type of properties.
|
| +// Order of properties is significant.
|
| +// Must fit in the BitField PropertyDetails::TypeField.
|
| +// A copy of this is in mirror-debugger.js.
|
| +enum PropertyType {
|
| + NORMAL = 0, // only in slow mode
|
| + FIELD = 1, // only in fast mode
|
| + CONSTANT_FUNCTION = 2, // only in fast mode
|
| + CALLBACKS = 3,
|
| + INTERCEPTOR = 4, // only in lookup results, not in descriptors.
|
| + MAP_TRANSITION = 5, // only in fast mode
|
| + CONSTANT_TRANSITION = 6, // only in fast mode
|
| + NULL_DESCRIPTOR = 7, // only in fast mode
|
| + // All properties before MAP_TRANSITION are real.
|
| + FIRST_PHANTOM_PROPERTY_TYPE = MAP_TRANSITION,
|
| + // There are no IC stubs for NULL_DESCRIPTORS. Therefore,
|
| + // NULL_DESCRIPTOR can be used as the type flag for IC stubs for
|
| + // nonexistent properties.
|
| + NONEXISTENT = NULL_DESCRIPTOR
|
| +};
|
| +
|
| +
|
| +// Whether to remove map transitions and constant transitions from a
|
| +// DescriptorArray.
|
| +enum TransitionFlag {
|
| + REMOVE_TRANSITIONS,
|
| + KEEP_TRANSITIONS
|
| +};
|
| +
|
| +
|
| +// Union used for fast testing of specific double values.
|
| +union DoubleRepresentation {
|
| + double value;
|
| + int64_t bits;
|
| + DoubleRepresentation(double x) { value = x; }
|
| +};
|
| +
|
| +
|
| +// 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 {
|
| + MaybeObject* (*getter)(Object* object, void* data);
|
| + MaybeObject* (*setter)(JSObject* object, Object* value, void* data);
|
| + void* data;
|
| +};
|
| +
|
| +
|
| +// Logging and profiling.
|
| +// A StateTag represents a possible state of the VM. When compiled with
|
| +// ENABLE_VMSTATE_TRACKING, 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.
|
| +
|
| +#define STATE_TAG_LIST(V) \
|
| + V(JS) \
|
| + V(GC) \
|
| + V(COMPILER) \
|
| + V(OTHER) \
|
| + V(EXTERNAL)
|
| +
|
| +enum StateTag {
|
| +#define DEF_STATE_TAG(name) name,
|
| + STATE_TAG_LIST(DEF_STATE_TAG)
|
| +#undef DEF_STATE_TAG
|
| + // Pseudo-types.
|
| + state_tag_count
|
| +};
|
| +
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// 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)
|
| +
|
| +// MAP_POINTER_ALIGN returns the value aligned as a map pointer.
|
| +#define MAP_POINTER_ALIGN(value) \
|
| + (((value) + kMapAlignmentMask) & ~kMapAlignmentMask)
|
| +
|
| +// 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::NewEvent(name, result, size); \
|
| + return result; \
|
| + } \
|
| + void operator delete(void* object) { \
|
| + Logger::DeleteEvent(name, object); \
|
| + ::operator delete(object); \
|
| + }
|
| +#else
|
| +#define TRACK_MEMORY(name)
|
| +#endif
|
| +
|
| +
|
| +// Feature flags bit positions. They are mostly based on the CPUID spec.
|
| +// (We assign CPUID itself to one of the currently reserved bits --
|
| +// feel free to change this if needed.)
|
| +// On X86/X64, values below 32 are bits in EDX, values above 32 are bits in ECX.
|
| +enum CpuFeature { SSE4_1 = 32 + 19, // x86
|
| + SSE3 = 32 + 0, // x86
|
| + SSE2 = 26, // x86
|
| + CMOV = 15, // x86
|
| + RDTSC = 4, // x86
|
| + CPUID = 10, // x86
|
| + VFP3 = 1, // ARM
|
| + ARMv7 = 2, // ARM
|
| + SAHF = 0}; // x86
|
| +
|
| +} } // namespace v8::internal
|
| +
|
| +#endif // V8_V8GLOBALS_H_
|
|
|