Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Side by Side Diff: src/objects.h

Issue 259173003: Kiss goodbye to MaybeObject. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: rebase + addressed comments Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/mark-compact.cc ('k') | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_OBJECTS_H_ 5 #ifndef V8_OBJECTS_H_
6 #define V8_OBJECTS_H_ 6 #define V8_OBJECTS_H_
7 7
8 #include "allocation.h" 8 #include "allocation.h"
9 #include "assert-scope.h" 9 #include "assert-scope.h"
10 #include "builtins.h" 10 #include "builtins.h"
(...skipping 11 matching lines...) Expand all
22 #include "mips/constants-mips.h" 22 #include "mips/constants-mips.h"
23 #endif 23 #endif
24 #include "v8checks.h" 24 #include "v8checks.h"
25 #include "zone.h" 25 #include "zone.h"
26 26
27 27
28 // 28 //
29 // Most object types in the V8 JavaScript are described in this file. 29 // Most object types in the V8 JavaScript are described in this file.
30 // 30 //
31 // Inheritance hierarchy: 31 // Inheritance hierarchy:
32 // - MaybeObject (an object or a failure) 32 // - Object
33 // - Failure (immediate for marking failed operation) 33 // - Smi (immediate small integer)
34 // - Object 34 // - HeapObject (superclass for everything allocated in the heap)
35 // - Smi (immediate small integer) 35 // - JSReceiver (suitable for property access)
36 // - HeapObject (superclass for everything allocated in the heap) 36 // - JSObject
37 // - JSReceiver (suitable for property access) 37 // - JSArray
38 // - JSObject 38 // - JSArrayBuffer
39 // - JSArray 39 // - JSArrayBufferView
40 // - JSArrayBuffer 40 // - JSTypedArray
41 // - JSArrayBufferView 41 // - JSDataView
42 // - JSTypedArray 42 // - JSSet
43 // - JSDataView 43 // - JSMap
44 // - JSSet 44 // - JSSetIterator
45 // - JSMap 45 // - JSMapIterator
46 // - JSSetIterator 46 // - JSWeakCollection
47 // - JSMapIterator 47 // - JSWeakMap
48 // - JSWeakCollection 48 // - JSWeakSet
49 // - JSWeakMap 49 // - JSRegExp
50 // - JSWeakSet 50 // - JSFunction
51 // - JSRegExp 51 // - JSGeneratorObject
52 // - JSFunction 52 // - JSModule
53 // - JSGeneratorObject 53 // - GlobalObject
54 // - JSModule 54 // - JSGlobalObject
55 // - GlobalObject 55 // - JSBuiltinsObject
56 // - JSGlobalObject 56 // - JSGlobalProxy
57 // - JSBuiltinsObject 57 // - JSValue
58 // - JSGlobalProxy 58 // - JSDate
59 // - JSValue 59 // - JSMessageObject
60 // - JSDate 60 // - JSProxy
61 // - JSMessageObject 61 // - JSFunctionProxy
62 // - JSProxy 62 // - FixedArrayBase
63 // - JSFunctionProxy 63 // - ByteArray
64 // - FixedArrayBase 64 // - FixedArray
65 // - ByteArray 65 // - DescriptorArray
66 // - FixedArray 66 // - HashTable
67 // - DescriptorArray 67 // - Dictionary
68 // - HashTable 68 // - StringTable
69 // - Dictionary 69 // - CompilationCacheTable
70 // - StringTable 70 // - CodeCacheHashTable
71 // - CompilationCacheTable 71 // - MapCache
72 // - CodeCacheHashTable 72 // - OrderedHashTable
73 // - MapCache 73 // - OrderedHashSet
74 // - OrderedHashTable 74 // - OrderedHashMap
75 // - OrderedHashSet 75 // - Context
76 // - OrderedHashMap 76 // - JSFunctionResultCache
77 // - Context 77 // - ScopeInfo
78 // - JSFunctionResultCache 78 // - TransitionArray
79 // - ScopeInfo 79 // - FixedDoubleArray
80 // - TransitionArray 80 // - ExternalArray
81 // - FixedDoubleArray 81 // - ExternalUint8ClampedArray
82 // - ExternalArray 82 // - ExternalInt8Array
83 // - ExternalUint8ClampedArray 83 // - ExternalUint8Array
84 // - ExternalInt8Array 84 // - ExternalInt16Array
85 // - ExternalUint8Array 85 // - ExternalUint16Array
86 // - ExternalInt16Array 86 // - ExternalInt32Array
87 // - ExternalUint16Array 87 // - ExternalUint32Array
88 // - ExternalInt32Array 88 // - ExternalFloat32Array
89 // - ExternalUint32Array 89 // - Name
90 // - ExternalFloat32Array 90 // - String
91 // - Name 91 // - SeqString
92 // - String 92 // - SeqOneByteString
93 // - SeqString 93 // - SeqTwoByteString
94 // - SeqOneByteString 94 // - SlicedString
95 // - SeqTwoByteString 95 // - ConsString
96 // - SlicedString 96 // - ExternalString
97 // - ConsString 97 // - ExternalAsciiString
98 // - ExternalString 98 // - ExternalTwoByteString
99 // - ExternalAsciiString 99 // - InternalizedString
100 // - ExternalTwoByteString 100 // - SeqInternalizedString
101 // - InternalizedString 101 // - SeqOneByteInternalizedString
102 // - SeqInternalizedString 102 // - SeqTwoByteInternalizedString
103 // - SeqOneByteInternalizedString 103 // - ConsInternalizedString
104 // - SeqTwoByteInternalizedString 104 // - ExternalInternalizedString
105 // - ConsInternalizedString 105 // - ExternalAsciiInternalizedString
106 // - ExternalInternalizedString 106 // - ExternalTwoByteInternalizedString
107 // - ExternalAsciiInternalizedString 107 // - Symbol
108 // - ExternalTwoByteInternalizedString 108 // - HeapNumber
109 // - Symbol 109 // - Cell
110 // - HeapNumber 110 // - PropertyCell
111 // - Cell 111 // - Code
112 // - PropertyCell 112 // - Map
113 // - Code 113 // - Oddball
114 // - Map 114 // - Foreign
115 // - Oddball 115 // - SharedFunctionInfo
116 // - Foreign 116 // - Struct
117 // - SharedFunctionInfo 117 // - Box
118 // - Struct 118 // - DeclaredAccessorDescriptor
119 // - Box 119 // - AccessorInfo
120 // - DeclaredAccessorDescriptor 120 // - DeclaredAccessorInfo
121 // - AccessorInfo 121 // - ExecutableAccessorInfo
122 // - DeclaredAccessorInfo 122 // - AccessorPair
123 // - ExecutableAccessorInfo 123 // - AccessCheckInfo
124 // - AccessorPair 124 // - InterceptorInfo
125 // - AccessCheckInfo 125 // - CallHandlerInfo
126 // - InterceptorInfo 126 // - TemplateInfo
127 // - CallHandlerInfo 127 // - FunctionTemplateInfo
128 // - TemplateInfo 128 // - ObjectTemplateInfo
129 // - FunctionTemplateInfo 129 // - Script
130 // - ObjectTemplateInfo 130 // - SignatureInfo
131 // - Script 131 // - TypeSwitchInfo
132 // - SignatureInfo 132 // - DebugInfo
133 // - TypeSwitchInfo 133 // - BreakPointInfo
134 // - DebugInfo 134 // - CodeCache
135 // - BreakPointInfo
136 // - CodeCache
137 // 135 //
138 // Formats of Object*: 136 // Formats of Object*:
139 // Smi: [31 bit signed int] 0 137 // Smi: [31 bit signed int] 0
140 // HeapObject: [32 bit direct pointer] (4 byte aligned) | 01 138 // HeapObject: [32 bit direct pointer] (4 byte aligned) | 01
141 // Failure: [30 bit signed int] 11
142 139
143 namespace v8 { 140 namespace v8 {
144 namespace internal { 141 namespace internal {
145 142
146 enum KeyedAccessStoreMode { 143 enum KeyedAccessStoreMode {
147 STANDARD_STORE, 144 STANDARD_STORE,
148 STORE_TRANSITION_SMI_TO_OBJECT, 145 STORE_TRANSITION_SMI_TO_OBJECT,
149 STORE_TRANSITION_SMI_TO_DOUBLE, 146 STORE_TRANSITION_SMI_TO_DOUBLE,
150 STORE_TRANSITION_DOUBLE_TO_OBJECT, 147 STORE_TRANSITION_DOUBLE_TO_OBJECT,
151 STORE_TRANSITION_HOLEY_SMI_TO_OBJECT, 148 STORE_TRANSITION_HOLEY_SMI_TO_OBJECT,
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after
854 inline type* name(); \ 851 inline type* name(); \
855 inline void set_##name(type* value, \ 852 inline void set_##name(type* value, \
856 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); \ 853 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); \
857 854
858 class AccessorPair; 855 class AccessorPair;
859 class AllocationSite; 856 class AllocationSite;
860 class AllocationSiteCreationContext; 857 class AllocationSiteCreationContext;
861 class AllocationSiteUsageContext; 858 class AllocationSiteUsageContext;
862 class DictionaryElementsAccessor; 859 class DictionaryElementsAccessor;
863 class ElementsAccessor; 860 class ElementsAccessor;
864 class Failure;
865 class FixedArrayBase; 861 class FixedArrayBase;
866 class GlobalObject; 862 class GlobalObject;
867 class ObjectVisitor; 863 class ObjectVisitor;
868 class StringStream; 864 class StringStream;
869 // We cannot just say "class HeapType;" if it is created from a template... =8-? 865 // We cannot just say "class HeapType;" if it is created from a template... =8-?
870 template<class> class TypeImpl; 866 template<class> class TypeImpl;
871 struct HeapTypeConfig; 867 struct HeapTypeConfig;
872 typedef TypeImpl<HeapTypeConfig> HeapType; 868 typedef TypeImpl<HeapTypeConfig> HeapType;
873 869
874 870
875 // A template-ized version of the IsXXX functions. 871 // A template-ized version of the IsXXX functions.
876 template <class C> inline bool Is(Object* obj); 872 template <class C> inline bool Is(Object* obj);
877 873
878 #ifdef VERIFY_HEAP 874 #ifdef VERIFY_HEAP
879 #define DECLARE_VERIFIER(Name) void Name##Verify(); 875 #define DECLARE_VERIFIER(Name) void Name##Verify();
880 #else 876 #else
881 #define DECLARE_VERIFIER(Name) 877 #define DECLARE_VERIFIER(Name)
882 #endif 878 #endif
883 879
884 #ifdef OBJECT_PRINT 880 #ifdef OBJECT_PRINT
885 #define DECLARE_PRINTER(Name) void Name##Print(FILE* out = stdout); 881 #define DECLARE_PRINTER(Name) void Name##Print(FILE* out = stdout);
886 #else 882 #else
887 #define DECLARE_PRINTER(Name) 883 #define DECLARE_PRINTER(Name)
888 #endif 884 #endif
889 885
890 class MaybeObject BASE_EMBEDDED {
891 public:
892 inline bool IsFailure();
893 inline bool IsRetryAfterGC();
894 inline bool ToObject(Object** obj) {
895 if (IsFailure()) return false;
896 *obj = reinterpret_cast<Object*>(this);
897 return true;
898 }
899 inline Object* ToObjectUnchecked() {
900 // TODO(jkummerow): Turn this back into an ASSERT when we can be certain
901 // that it never fires in Release mode in the wild.
902 CHECK(!IsFailure());
903 return reinterpret_cast<Object*>(this);
904 }
905 inline Object* ToObjectChecked() {
906 CHECK(!IsFailure());
907 return reinterpret_cast<Object*>(this);
908 }
909
910 template<typename T>
911 inline bool To(T** obj) {
912 if (IsFailure()) return false;
913 *obj = T::cast(reinterpret_cast<Object*>(this));
914 return true;
915 }
916
917 #ifdef OBJECT_PRINT
918 // Prints this object with details.
919 void Print();
920 void Print(FILE* out);
921 void PrintLn();
922 void PrintLn(FILE* out);
923 #endif
924 #ifdef VERIFY_HEAP
925 // Verifies the object.
926 void Verify();
927 #endif
928 };
929
930 886
931 #define OBJECT_TYPE_LIST(V) \ 887 #define OBJECT_TYPE_LIST(V) \
932 V(Smi) \ 888 V(Smi) \
933 V(HeapObject) \ 889 V(HeapObject) \
934 V(Number) \ 890 V(Number) \
935 891
936 #define HEAP_OBJECT_TYPE_LIST(V) \ 892 #define HEAP_OBJECT_TYPE_LIST(V) \
937 V(HeapNumber) \ 893 V(HeapNumber) \
938 V(Name) \ 894 V(Name) \
939 V(UniqueName) \ 895 V(UniqueName) \
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after
1376 #undef ERROR_MESSAGES_CONSTANTS 1332 #undef ERROR_MESSAGES_CONSTANTS
1377 1333
1378 1334
1379 const char* GetBailoutReason(BailoutReason reason); 1335 const char* GetBailoutReason(BailoutReason reason);
1380 1336
1381 1337
1382 // Object is the abstract superclass for all classes in the 1338 // Object is the abstract superclass for all classes in the
1383 // object hierarchy. 1339 // object hierarchy.
1384 // Object does not use any virtual functions to avoid the 1340 // Object does not use any virtual functions to avoid the
1385 // allocation of the C++ vtable. 1341 // allocation of the C++ vtable.
1386 // Since Smi and Failure are subclasses of Object no 1342 // Since both Smi and HeapObject are subclasses of Object no
1387 // data members can be present in Object. 1343 // data members can be present in Object.
1388 class Object : public MaybeObject { 1344 class Object {
1389 public: 1345 public:
1390 // Type testing. 1346 // Type testing.
1391 bool IsObject() { return true; } 1347 bool IsObject() { return true; }
1392 1348
1393 #define IS_TYPE_FUNCTION_DECL(type_) inline bool Is##type_(); 1349 #define IS_TYPE_FUNCTION_DECL(type_) inline bool Is##type_();
1394 OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) 1350 OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL)
1395 HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) 1351 HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL)
1396 #undef IS_TYPE_FUNCTION_DECL 1352 #undef IS_TYPE_FUNCTION_DECL
1397 1353
1398 inline bool IsFixedArrayBase(); 1354 inline bool IsFixedArrayBase();
(...skipping 12 matching lines...) Expand all
1411 1367
1412 // Oddball testing. 1368 // Oddball testing.
1413 INLINE(bool IsUndefined()); 1369 INLINE(bool IsUndefined());
1414 INLINE(bool IsNull()); 1370 INLINE(bool IsNull());
1415 INLINE(bool IsTheHole()); 1371 INLINE(bool IsTheHole());
1416 INLINE(bool IsException()); 1372 INLINE(bool IsException());
1417 INLINE(bool IsUninitialized()); 1373 INLINE(bool IsUninitialized());
1418 INLINE(bool IsTrue()); 1374 INLINE(bool IsTrue());
1419 INLINE(bool IsFalse()); 1375 INLINE(bool IsFalse());
1420 inline bool IsArgumentsMarker(); 1376 inline bool IsArgumentsMarker();
1421 inline bool NonFailureIsHeapObject();
1422 1377
1423 // Filler objects (fillers and free space objects). 1378 // Filler objects (fillers and free space objects).
1424 inline bool IsFiller(); 1379 inline bool IsFiller();
1425 1380
1426 // Extract the number. 1381 // Extract the number.
1427 inline double Number(); 1382 inline double Number();
1428 inline bool IsNaN(); 1383 inline bool IsNaN();
1429 bool ToInt32(int32_t* value); 1384 bool ToInt32(int32_t* value);
1430 bool ToUint32(uint32_t* value); 1385 bool ToUint32(uint32_t* value);
1431 1386
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1576 1531
1577 // Prints this object without details to a message accumulator. 1532 // Prints this object without details to a message accumulator.
1578 void ShortPrint(StringStream* accumulator); 1533 void ShortPrint(StringStream* accumulator);
1579 1534
1580 // Casting: This cast is only needed to satisfy macros in objects-inl.h. 1535 // Casting: This cast is only needed to satisfy macros in objects-inl.h.
1581 static Object* cast(Object* value) { return value; } 1536 static Object* cast(Object* value) { return value; }
1582 1537
1583 // Layout description. 1538 // Layout description.
1584 static const int kHeaderSize = 0; // Object does not take up any space. 1539 static const int kHeaderSize = 0; // Object does not take up any space.
1585 1540
1541 #ifdef OBJECT_PRINT
1542 // Prints this object with details.
1543 void Print();
1544 void Print(FILE* out);
1545 void PrintLn();
1546 void PrintLn(FILE* out);
1547 #endif
1548
1586 private: 1549 private:
1587 DISALLOW_IMPLICIT_CONSTRUCTORS(Object); 1550 DISALLOW_IMPLICIT_CONSTRUCTORS(Object);
1588 }; 1551 };
1589 1552
1590 1553
1591 // Smi represents integer Numbers that can be stored in 31 bits. 1554 // Smi represents integer Numbers that can be stored in 31 bits.
1592 // Smis are immediate which means they are NOT allocated in the heap. 1555 // Smis are immediate which means they are NOT allocated in the heap.
1593 // The this pointer has the following format: [31 bit signed int] 0 1556 // The this pointer has the following format: [31 bit signed int] 0
1594 // For long smis it has the following format: 1557 // For long smis it has the following format:
1595 // [32 bit signed int] [31 bits zero padding] 0 1558 // [32 bit signed int] [31 bits zero padding] 0
(...skipping 22 matching lines...) Expand all
1618 1581
1619 static const int kMinValue = 1582 static const int kMinValue =
1620 (static_cast<unsigned int>(-1)) << (kSmiValueSize - 1); 1583 (static_cast<unsigned int>(-1)) << (kSmiValueSize - 1);
1621 static const int kMaxValue = -(kMinValue + 1); 1584 static const int kMaxValue = -(kMinValue + 1);
1622 1585
1623 private: 1586 private:
1624 DISALLOW_IMPLICIT_CONSTRUCTORS(Smi); 1587 DISALLOW_IMPLICIT_CONSTRUCTORS(Smi);
1625 }; 1588 };
1626 1589
1627 1590
1628 // Failure is mainly used for reporting a situation requiring a GC.
1629 // Failure objects are transient and cannot occur as part of the object graph.
1630 //
1631 // Failures are a single word, encoded as follows:
1632 // +-------------------------+---+--+--+
1633 // |.........unused..........|sss|tt|11|
1634 // +-------------------------+---+--+--+
1635 // 7 6 4 32 10
1636 //
1637 //
1638 // The low two bits, 0-1, are the failure tag, 11. The next two bits,
1639 // 2-3, are a failure type tag 'tt' with possible values:
1640 // 00 RETRY_AFTER_GC
1641 //
1642 // The next three bits, 4-6, are an allocation space tag 'sss'. The
1643 // allocation space tag is 000 for all failure types except
1644 // RETRY_AFTER_GC. For RETRY_AFTER_GC, the possible values are the
1645 // allocation spaces (the encoding is found in globals.h).
1646
1647 // Failure type tag info.
1648 const int kFailureTypeTagSize = 2;
1649 const int kFailureTypeTagMask = (1 << kFailureTypeTagSize) - 1;
1650
1651 class Failure: public MaybeObject {
1652 public:
1653 enum Type {
1654 RETRY_AFTER_GC = 0
1655 };
1656
1657 inline Type type() const;
1658
1659 // Returns the space that needs to be collected for RetryAfterGC failures.
1660 inline AllocationSpace allocation_space() const;
1661
1662 static inline Failure* RetryAfterGC(AllocationSpace space);
1663 static inline Failure* RetryAfterGC(); // NEW_SPACE
1664 // Casting.
1665 static inline Failure* cast(MaybeObject* object);
1666
1667 // Dispatched behavior.
1668 void FailurePrint(FILE* out = stdout);
1669 void FailurePrint(StringStream* accumulator);
1670
1671 DECLARE_VERIFIER(Failure)
1672
1673 private:
1674 inline intptr_t value() const;
1675 static inline Failure* Construct(Type type, intptr_t value = 0);
1676
1677 DISALLOW_IMPLICIT_CONSTRUCTORS(Failure);
1678 };
1679
1680
1681 // Heap objects typically have a map pointer in their first word. However, 1591 // Heap objects typically have a map pointer in their first word. However,
1682 // during GC other data (e.g. mark bits, forwarding addresses) is sometimes 1592 // during GC other data (e.g. mark bits, forwarding addresses) is sometimes
1683 // encoded in the first word. The class MapWord is an abstraction of the 1593 // encoded in the first word. The class MapWord is an abstraction of the
1684 // value in a heap object's first word. 1594 // value in a heap object's first word.
1685 class MapWord BASE_EMBEDDED { 1595 class MapWord BASE_EMBEDDED {
1686 public: 1596 public:
1687 // Normal state: the map word contains a map pointer. 1597 // Normal state: the map word contains a map pointer.
1688 1598
1689 // Create a map word from a map pointer. 1599 // Create a map word from a map pointer.
1690 static inline MapWord FromMap(Map* map); 1600 static inline MapWord FromMap(Map* map);
(...skipping 9482 matching lines...) Expand 10 before | Expand all | Expand 10 after
11173 } else { 11083 } else {
11174 value &= ~(1 << bit_position); 11084 value &= ~(1 << bit_position);
11175 } 11085 }
11176 return value; 11086 return value;
11177 } 11087 }
11178 }; 11088 };
11179 11089
11180 } } // namespace v8::internal 11090 } } // namespace v8::internal
11181 11091
11182 #endif // V8_OBJECTS_H_ 11092 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/mark-compact.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698