v8globals.h revision 1e0659c275bb392c045087af4f6b0d7565cb3d77
18a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Copyright 2010 the V8 project authors. All rights reserved.
28a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Redistribution and use in source and binary forms, with or without
38a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// modification, are permitted provided that the following conditions are
48a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// met:
58a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//
68a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Redistributions of source code must retain the above copyright
78a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       notice, this list of conditions and the following disclaimer.
88a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Redistributions in binary form must reproduce the above
98a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       copyright notice, this list of conditions and the following
108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       disclaimer in the documentation and/or other materials provided
118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       with the distribution.
128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Neither the name of Google Inc. nor the names of its
138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       contributors may be used to endorse or promote products derived
148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       from this software without specific prior written permission.
158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//
168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#ifndef V8_V8GLOBALS_H_
298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define V8_V8GLOBALS_H_
308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "globals.h"
328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace v8 {
348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace internal {
358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// This file contains constants and global declarations related to the
378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// V8 system.
388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Mask for the sign bit in a smi.
408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kSmiSignMask = kIntptrSignBit;
418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kObjectAlignmentBits = kPointerSizeLog2;
438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kObjectAlignment = 1 << kObjectAlignmentBits;
448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kObjectAlignmentMask = kObjectAlignment - 1;
458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Desired alignment for pointers.
478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kPointerAlignment = (1 << kPointerSizeLog2);
488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kPointerAlignmentMask = kPointerAlignment - 1;
498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Desired alignment for maps.
518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#if V8_HOST_ARCH_64_BIT
528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignmentBits = kObjectAlignmentBits;
538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#else
548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignmentBits = kObjectAlignmentBits + 3;
558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif
568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignment = (1 << kMapAlignmentBits);
578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignmentMask = kMapAlignment - 1;
588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Desired alignment for generated code is 32 bytes (to improve cache line
608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// utilization).
618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kCodeAlignmentBits = 5;
628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kCodeAlignment = 1 << kCodeAlignmentBits;
638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kCodeAlignmentMask = kCodeAlignment - 1;
648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Tag information for Failure.
668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kFailureTag = 3;
678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kFailureTagSize = 2;
688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kFailureTagMask = (1 << kFailureTagSize) - 1;
698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Zap-value: The value used for zapping dead objects.
721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Should be a recognizable hex value tagged as a failure.
738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#ifdef V8_HOST_ARCH_64_BIT
748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst Address kZapValue =
751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    reinterpret_cast<Address>(V8_UINT64_C(0xdeadbeedbeadbeef));
768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst Address kHandleZapValue =
771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    reinterpret_cast<Address>(V8_UINT64_C(0x1baddead0baddeaf));
788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst Address kFromSpaceZapValue =
791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    reinterpret_cast<Address>(V8_UINT64_C(0x1beefdad0beefdaf));
80b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst uint64_t kDebugZapValue = V8_UINT64_C(0xbadbaddbbadbaddb);
811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst uint64_t kSlotsZapValue = V8_UINT64_C(0xbeefdeadbeefdeef);
828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#else
831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst Address kZapValue = reinterpret_cast<Address>(0xdeadbeef);
841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst Address kHandleZapValue = reinterpret_cast<Address>(0xbaddeaf);
851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst Address kFromSpaceZapValue = reinterpret_cast<Address>(0xbeefdaf);
861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst uint32_t kSlotsZapValue = 0xbeefdeef;
878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst uint32_t kDebugZapValue = 0xbadbaddb;
888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif
898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Number of bits to represent the page size for paged spaces. The value of 13
928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// gives 8K bytes per page.
938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kPageSizeBits = 13;
948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// On Intel architecture, cache line size is 64 bytes.
968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// On ARM it may be less (32 bytes), but as far this constant is
978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// used for aligning data, it doesn't hurt to align on a greater value.
988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kProcessorCacheLineSize = 64;
998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Constants relevant to double precision floating point numbers.
1018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Quiet NaNs have bits 51 to 62 set, possibly the sign bit, and no
1038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// other bits set.
1048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst uint64_t kQuietNaNMask = static_cast<uint64_t>(0xfff) << 51;
1058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// If looking only at the top 32 bits, the QNaN mask is bits 19 to 30.
1068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst uint32_t kQuietNaNHighBitsMask = 0xfff << (51 - 32);
1078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// -----------------------------------------------------------------------------
1108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Forward declarations for frequently used classes
1118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (sorted alphabetically)
1128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass AccessorInfo;
1148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Allocation;
1158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Arguments;
1168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Assembler;
1178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass AssertNoAllocation;
1188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass BreakableStatement;
1198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Code;
1208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass CodeGenerator;
1218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass CodeStub;
1228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Context;
1238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Debug;
1248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Debugger;
1258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass DebugInfo;
1268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Descriptor;
1278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass DescriptorArray;
1288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Expression;
1298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass ExternalReference;
1308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FixedArray;
1318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FunctionEntry;
1328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FunctionLiteral;
1338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FunctionTemplateInfo;
1348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass NumberDictionary;
1358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass StringDictionary;
1368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtemplate <typename T> class Handle;
1378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Heap;
1388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass HeapObject;
1398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass IC;
1408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass InterceptorInfo;
1418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass IterationStatement;
1428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass JSArray;
1438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass JSFunction;
1448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass JSObject;
1458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass LargeObjectSpace;
1468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass LookupResult;
1478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MacroAssembler;
1488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Map;
1498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MapSpace;
1508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MarkCompactCollector;
1518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass NewSpace;
1528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass NodeVisitor;
1538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Object;
1548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MaybeObject;
1558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass OldSpace;
1568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Property;
1578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Proxy;
1588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RegExpNode;
1598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangstruct RegExpCompileData;
1608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RegExpTree;
1618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RegExpCompiler;
1628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RegExpVisitor;
1638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Scope;
1648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtemplate<class Allocator = FreeStoreAllocationPolicy> class ScopeInfo;
1658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass SerializedScopeInfo;
1668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Script;
1678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Slot;
1688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Smi;
1698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtemplate <typename Config, class Allocator = FreeStoreAllocationPolicy>
1708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    class SplayTree;
1718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Statement;
1728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass String;
1738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Struct;
1748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass SwitchStatement;
1758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass AstVisitor;
1768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Variable;
1778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass VariableProxy;
1788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RelocInfo;
1798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Deserializer;
1808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MessageLocation;
1818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass ObjectGroup;
1828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass TickSample;
1838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass VirtualMemory;
1848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Mutex;
1858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef bool (*WeakSlotCallback)(Object** pointer);
1878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// -----------------------------------------------------------------------------
1898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Miscellaneous
1908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// NOTE: SpaceIterator depends on AllocationSpace enumeration values being
1928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// consecutive.
1938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum AllocationSpace {
1948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  NEW_SPACE,            // Semispaces collected with copying collector.
1958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  OLD_POINTER_SPACE,    // May contain pointers to new space.
1968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  OLD_DATA_SPACE,       // Must not have pointers to new space.
1978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CODE_SPACE,           // No pointers to new space, marked executable.
1988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MAP_SPACE,            // Only and all map objects.
1998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CELL_SPACE,           // Only and all cell objects.
2008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  LO_SPACE,             // Promoted large objects.
2018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  FIRST_SPACE = NEW_SPACE,
2038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  LAST_SPACE = LO_SPACE,
2048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  FIRST_PAGED_SPACE = OLD_POINTER_SPACE,
2058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  LAST_PAGED_SPACE = CELL_SPACE
2068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
2078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kSpaceTagSize = 3;
2088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kSpaceTagMask = (1 << kSpaceTagSize) - 1;
2098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A flag that indicates whether objects should be pretenured when
2128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// allocated (allocated directly into the old generation) or not
2138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (allocated in the young generation if the object size and type
2148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// allows).
2158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum PretenureFlag { NOT_TENURED, TENURED };
2168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum GarbageCollector { SCAVENGER, MARK_COMPACTOR };
2188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum Executability { NOT_EXECUTABLE, EXECUTABLE };
2208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum VisitMode { VISIT_ALL, VISIT_ALL_IN_SCAVENGE, VISIT_ONLY_STRONG };
2228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Flag indicating whether code is built into the VM (one of the natives files).
2248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum NativesFlag { NOT_NATIVES_CODE, NATIVES_CODE };
2258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A CodeDesc describes a buffer holding instructions and relocation
2288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// information. The instructions start at the beginning of the buffer
2298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// and grow forward, the relocation information starts at the end of
2308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// the buffer and grows backward.
2318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//
2328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  |<--------------- buffer_size ---------------->|
2338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  |<-- instr_size -->|        |<-- reloc_size -->|
2348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  +==================+========+==================+
2358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  |   instructions   |  free  |    reloc info    |
2368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  +==================+========+==================+
2378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  ^
2388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  |
2398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  buffer
2408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangstruct CodeDesc {
2428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  byte* buffer;
2438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int buffer_size;
2448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int instr_size;
2458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int reloc_size;
2468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Assembler* origin;
2478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
2488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function on object slots, used for iterating heap object slots in
2518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// HeapObjects, global pointers to heap objects, etc. The callback allows the
2528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// callback function to change the value of the slot.
2538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef void (*ObjectSlotCallback)(HeapObject** pointer);
2548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function used for iterating objects in heap spaces,
2578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// for example, scanning heap objects.
2588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef int (*HeapObjectCallback)(HeapObject* obj);
2598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function used for checking constraints when copying/relocating
2628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// objects. Returns true if an object can be copied/relocated from its
2638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// old_addr to a new_addr.
2648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef bool (*ConstraintCallback)(Address new_addr, Address old_addr);
2658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function on inline caches, used for iterating over inline caches
2688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// in compiled code.
2698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef void (*InlineCacheCallback)(Code* code, Address ic);
2708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// State for inline cache call sites. Aliased as IC::State.
2738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum InlineCacheState {
2748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Has never been executed.
2758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  UNINITIALIZED,
2768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Has been executed but monomorhic state has been delayed.
2778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  PREMONOMORPHIC,
2788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Has been executed and only one receiver type has been seen.
2798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MONOMORPHIC,
2808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Like MONOMORPHIC but check failed due to prototype.
2818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MONOMORPHIC_PROTOTYPE_FAILURE,
2828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Multiple receiver types have been seen.
2838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MEGAMORPHIC,
2848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Special states for debug break or step in prepare stubs.
2858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DEBUG_BREAK,
2868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DEBUG_PREPARE_STEP_IN
2878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
2888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochenum CheckType {
291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  RECEIVER_MAP_CHECK,
292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  STRING_CHECK,
293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  NUMBER_CHECK,
294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  BOOLEAN_CHECK
295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum InLoopFlag {
2998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  NOT_IN_LOOP,
3008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  IN_LOOP
3018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum CallFunctionFlags {
3058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  NO_CALL_FUNCTION_FLAGS = 0,
3068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  RECEIVER_MIGHT_BE_VALUE = 1 << 0  // Receiver might not be a JSObject.
3078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum InlineCacheHolderFlag {
3118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  OWN_MAP,  // For fast properties objects.
3128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  PROTOTYPE_MAP  // For slow properties objects (except GlobalObjects).
3138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Type of properties.
3178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Order of properties is significant.
3188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Must fit in the BitField PropertyDetails::TypeField.
3198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A copy of this is in mirror-debugger.js.
3208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum PropertyType {
3218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  NORMAL              = 0,  // only in slow mode
3228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  FIELD               = 1,  // only in fast mode
3238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CONSTANT_FUNCTION   = 2,  // only in fast mode
3248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CALLBACKS           = 3,
3258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  INTERCEPTOR         = 4,  // only in lookup results, not in descriptors.
3268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MAP_TRANSITION      = 5,  // only in fast mode
3278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CONSTANT_TRANSITION = 6,  // only in fast mode
3288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  NULL_DESCRIPTOR     = 7,  // only in fast mode
3298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // All properties before MAP_TRANSITION are real.
3308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  FIRST_PHANTOM_PROPERTY_TYPE = MAP_TRANSITION,
3318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // There are no IC stubs for NULL_DESCRIPTORS. Therefore,
3328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // NULL_DESCRIPTOR can be used as the type flag for IC stubs for
3338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // nonexistent properties.
3348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  NONEXISTENT = NULL_DESCRIPTOR
3358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Whether to remove map transitions and constant transitions from a
3398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// DescriptorArray.
3408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum TransitionFlag {
3418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  REMOVE_TRANSITIONS,
3428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  KEEP_TRANSITIONS
3438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Union used for fast testing of specific double values.
3478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangunion DoubleRepresentation {
3488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double  value;
3498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int64_t bits;
3508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleRepresentation(double x) { value = x; }
3518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Union used for customized checking of the IEEE double types
3558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// inlined within v8 runtime, rather than going to the underlying
3568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// platform headers and libraries
3578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangunion IeeeDoubleLittleEndianArchType {
3588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double d;
3598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  struct {
3608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int man_low  :32;
3618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int man_high :20;
3628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int exp      :11;
3638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int sign     :1;
3648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  } bits;
3658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangunion IeeeDoubleBigEndianArchType {
3698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double d;
3708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  struct {
3718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int sign     :1;
3728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int exp      :11;
3738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int man_high :20;
3748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int man_low  :32;
3758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  } bits;
3768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// AccessorCallback
3808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangstruct AccessorDescriptor {
3818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MaybeObject* (*getter)(Object* object, void* data);
3828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MaybeObject* (*setter)(JSObject* object, Object* value, void* data);
3838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  void* data;
3848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Logging and profiling.
3888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A StateTag represents a possible state of the VM.  When compiled with
3898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ENABLE_VMSTATE_TRACKING, the logger maintains a stack of these.
3908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Creating a VMState object enters a state by pushing on the stack, and
3918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// destroying a VMState object leaves a state by popping the current state
3928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// from the stack.
3938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define STATE_TAG_LIST(V) \
3958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  V(JS)                   \
3968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  V(GC)                   \
3978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  V(COMPILER)             \
3988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  V(OTHER)                \
3998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  V(EXTERNAL)
4008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum StateTag {
4028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define DEF_STATE_TAG(name) name,
4038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  STATE_TAG_LIST(DEF_STATE_TAG)
4048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#undef DEF_STATE_TAG
4058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Pseudo-types.
4068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  state_tag_count
4078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
4088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// -----------------------------------------------------------------------------
4118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Macros
4128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Testers for test.
4148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define HAS_SMI_TAG(value) \
4168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  ((reinterpret_cast<intptr_t>(value) & kSmiTagMask) == kSmiTag)
4178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define HAS_FAILURE_TAG(value) \
4198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  ((reinterpret_cast<intptr_t>(value) & kFailureTagMask) == kFailureTag)
4208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OBJECT_POINTER_ALIGN returns the value aligned as a HeapObject pointer
4228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define OBJECT_POINTER_ALIGN(value)                             \
4238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  (((value) + kObjectAlignmentMask) & ~kObjectAlignmentMask)
4248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// POINTER_SIZE_ALIGN returns the value aligned as a pointer.
4268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define POINTER_SIZE_ALIGN(value)                               \
4278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  (((value) + kPointerAlignmentMask) & ~kPointerAlignmentMask)
4288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// MAP_POINTER_ALIGN returns the value aligned as a map pointer.
4308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define MAP_POINTER_ALIGN(value)                                \
4318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  (((value) + kMapAlignmentMask) & ~kMapAlignmentMask)
4328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// CODE_POINTER_ALIGN returns the value aligned as a generated code segment.
4348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define CODE_POINTER_ALIGN(value)                               \
4358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  (((value) + kCodeAlignmentMask) & ~kCodeAlignmentMask)
4368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Support for tracking C++ memory allocation.  Insert TRACK_MEMORY("Fisk")
4388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// inside a C++ class and new and delete will be overloaded so logging is
4398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// performed.
4408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// This file (globals.h) is included before log.h, so we use direct calls to
4418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// the Logger rather than the LOG macro.
4428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#ifdef DEBUG
4438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define TRACK_MEMORY(name) \
4448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  void* operator new(size_t size) { \
4458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    void* result = ::operator new(size); \
4468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    Logger::NewEvent(name, result, size); \
4478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    return result; \
4488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  } \
4498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  void operator delete(void* object) { \
4508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    Logger::DeleteEvent(name, object); \
4518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    ::operator delete(object); \
4528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
4538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#else
4548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define TRACK_MEMORY(name)
4558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif
4568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Feature flags bit positions. They are mostly based on the CPUID spec.
4598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (We assign CPUID itself to one of the currently reserved bits --
4608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// feel free to change this if needed.)
4618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// On X86/X64, values below 32 are bits in EDX, values above 32 are bits in ECX.
4628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum CpuFeature { SSE4_1 = 32 + 19,  // x86
4638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  SSE3 = 32 + 0,     // x86
4648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  SSE2 = 26,   // x86
4658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  CMOV = 15,   // x86
4668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  RDTSC = 4,   // x86
4678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  CPUID = 10,  // x86
4688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  VFP3 = 1,    // ARM
4698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  ARMv7 = 2,   // ARM
4708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  SAHF = 0};   // x86
4718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// The Strict Mode (ECMA-262 5th edition, 4.2.2).
4731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockenum StrictModeFlag {
4741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  kNonStrictMode,
4751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  kStrictMode
4761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
4771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang} }  // namespace v8::internal
4798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif  // V8_V8GLOBALS_H_
481