OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/ic-inl.h" | 7 #include "src/ic-inl.h" |
8 #include "src/objects-visiting.h" | 8 #include "src/objects-visiting.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
11 namespace internal { | 11 namespace internal { |
12 | 12 |
13 | 13 |
14 static inline bool IsShortcutCandidate(int type) { | 14 static inline bool IsShortcutCandidate(int type) { |
15 return ((type & kShortcutTypeMask) == kShortcutTypeTag); | 15 return ((type & kShortcutTypeMask) == kShortcutTypeTag); |
16 } | 16 } |
17 | 17 |
18 | 18 |
19 StaticVisitorBase::VisitorId StaticVisitorBase::GetVisitorId( | 19 StaticVisitorBase::VisitorId StaticVisitorBase::GetVisitorId( |
20 int instance_type, | 20 int instance_type, int instance_size, bool has_non_tagged_fields) { |
Toon Verwaest
2014/07/29 15:02:09
has_unboxed_fields?
Igor Sheludko
2014/10/30 14:23:44
Done.
| |
21 int instance_size) { | |
22 if (instance_type < FIRST_NONSTRING_TYPE) { | 21 if (instance_type < FIRST_NONSTRING_TYPE) { |
23 switch (instance_type & kStringRepresentationMask) { | 22 switch (instance_type & kStringRepresentationMask) { |
24 case kSeqStringTag: | 23 case kSeqStringTag: |
25 if ((instance_type & kStringEncodingMask) == kOneByteStringTag) { | 24 if ((instance_type & kStringEncodingMask) == kOneByteStringTag) { |
26 return kVisitSeqOneByteString; | 25 return kVisitSeqOneByteString; |
27 } else { | 26 } else { |
28 return kVisitSeqTwoByteString; | 27 return kVisitSeqTwoByteString; |
29 } | 28 } |
30 | 29 |
31 case kConsStringTag: | 30 case kConsStringTag: |
32 if (IsShortcutCandidate(instance_type)) { | 31 if (IsShortcutCandidate(instance_type)) { |
33 return kVisitShortcutCandidate; | 32 return kVisitShortcutCandidate; |
34 } else { | 33 } else { |
35 return kVisitConsString; | 34 return kVisitConsString; |
36 } | 35 } |
37 | 36 |
38 case kSlicedStringTag: | 37 case kSlicedStringTag: |
39 return kVisitSlicedString; | 38 return kVisitSlicedString; |
40 | 39 |
41 case kExternalStringTag: | 40 case kExternalStringTag: |
42 return GetVisitorIdForSize(kVisitDataObject, | 41 return GetVisitorIdForSize(kVisitDataObject, kVisitDataObjectGeneric, |
43 kVisitDataObjectGeneric, | 42 instance_size, has_non_tagged_fields); |
44 instance_size); | |
45 } | 43 } |
46 UNREACHABLE(); | 44 UNREACHABLE(); |
47 } | 45 } |
48 | 46 |
49 switch (instance_type) { | 47 switch (instance_type) { |
50 case BYTE_ARRAY_TYPE: | 48 case BYTE_ARRAY_TYPE: |
51 return kVisitByteArray; | 49 return kVisitByteArray; |
52 | 50 |
53 case FREE_SPACE_TYPE: | 51 case FREE_SPACE_TYPE: |
54 return kVisitFreeSpace; | 52 return kVisitFreeSpace; |
(...skipping 16 matching lines...) Expand all Loading... | |
71 case CODE_TYPE: | 69 case CODE_TYPE: |
72 return kVisitCode; | 70 return kVisitCode; |
73 | 71 |
74 case CELL_TYPE: | 72 case CELL_TYPE: |
75 return kVisitCell; | 73 return kVisitCell; |
76 | 74 |
77 case PROPERTY_CELL_TYPE: | 75 case PROPERTY_CELL_TYPE: |
78 return kVisitPropertyCell; | 76 return kVisitPropertyCell; |
79 | 77 |
80 case JS_SET_TYPE: | 78 case JS_SET_TYPE: |
81 return GetVisitorIdForSize(kVisitStruct, | 79 return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, |
82 kVisitStructGeneric, | 80 JSSet::kSize, has_non_tagged_fields); |
83 JSSet::kSize); | |
84 | 81 |
85 case JS_MAP_TYPE: | 82 case JS_MAP_TYPE: |
86 return GetVisitorIdForSize(kVisitStruct, | 83 return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, |
87 kVisitStructGeneric, | 84 JSMap::kSize, has_non_tagged_fields); |
88 JSMap::kSize); | |
89 | 85 |
90 case JS_WEAK_MAP_TYPE: | 86 case JS_WEAK_MAP_TYPE: |
91 case JS_WEAK_SET_TYPE: | 87 case JS_WEAK_SET_TYPE: |
92 return kVisitJSWeakCollection; | 88 return kVisitJSWeakCollection; |
93 | 89 |
94 case JS_REGEXP_TYPE: | 90 case JS_REGEXP_TYPE: |
95 return kVisitJSRegExp; | 91 return kVisitJSRegExp; |
96 | 92 |
97 case SHARED_FUNCTION_INFO_TYPE: | 93 case SHARED_FUNCTION_INFO_TYPE: |
98 return kVisitSharedFunctionInfo; | 94 return kVisitSharedFunctionInfo; |
99 | 95 |
100 case JS_PROXY_TYPE: | 96 case JS_PROXY_TYPE: |
101 return GetVisitorIdForSize(kVisitStruct, | 97 return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, |
102 kVisitStructGeneric, | 98 JSProxy::kSize, has_non_tagged_fields); |
103 JSProxy::kSize); | |
104 | 99 |
105 case JS_FUNCTION_PROXY_TYPE: | 100 case JS_FUNCTION_PROXY_TYPE: |
106 return GetVisitorIdForSize(kVisitStruct, | 101 return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, |
107 kVisitStructGeneric, | 102 JSFunctionProxy::kSize, has_non_tagged_fields); |
108 JSFunctionProxy::kSize); | |
109 | 103 |
110 case FOREIGN_TYPE: | 104 case FOREIGN_TYPE: |
111 return GetVisitorIdForSize(kVisitDataObject, | 105 return GetVisitorIdForSize(kVisitDataObject, kVisitDataObjectGeneric, |
112 kVisitDataObjectGeneric, | 106 Foreign::kSize, has_non_tagged_fields); |
113 Foreign::kSize); | |
114 | 107 |
115 case SYMBOL_TYPE: | 108 case SYMBOL_TYPE: |
116 return kVisitSymbol; | 109 return kVisitSymbol; |
117 | 110 |
118 case FILLER_TYPE: | 111 case FILLER_TYPE: |
119 return kVisitDataObjectGeneric; | 112 return kVisitDataObjectGeneric; |
120 | 113 |
121 case JS_ARRAY_BUFFER_TYPE: | 114 case JS_ARRAY_BUFFER_TYPE: |
122 return kVisitJSArrayBuffer; | 115 return kVisitJSArrayBuffer; |
123 | 116 |
124 case JS_TYPED_ARRAY_TYPE: | 117 case JS_TYPED_ARRAY_TYPE: |
125 return kVisitJSTypedArray; | 118 return kVisitJSTypedArray; |
126 | 119 |
127 case JS_DATA_VIEW_TYPE: | 120 case JS_DATA_VIEW_TYPE: |
128 return kVisitJSDataView; | 121 return kVisitJSDataView; |
129 | 122 |
130 case JS_OBJECT_TYPE: | 123 case JS_OBJECT_TYPE: |
131 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: | 124 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: |
132 case JS_GENERATOR_OBJECT_TYPE: | 125 case JS_GENERATOR_OBJECT_TYPE: |
133 case JS_MODULE_TYPE: | 126 case JS_MODULE_TYPE: |
134 case JS_VALUE_TYPE: | 127 case JS_VALUE_TYPE: |
135 case JS_DATE_TYPE: | 128 case JS_DATE_TYPE: |
136 case JS_ARRAY_TYPE: | 129 case JS_ARRAY_TYPE: |
137 case JS_GLOBAL_PROXY_TYPE: | 130 case JS_GLOBAL_PROXY_TYPE: |
138 case JS_GLOBAL_OBJECT_TYPE: | 131 case JS_GLOBAL_OBJECT_TYPE: |
139 case JS_BUILTINS_OBJECT_TYPE: | 132 case JS_BUILTINS_OBJECT_TYPE: |
140 case JS_MESSAGE_OBJECT_TYPE: | 133 case JS_MESSAGE_OBJECT_TYPE: |
141 case JS_SET_ITERATOR_TYPE: | 134 case JS_SET_ITERATOR_TYPE: |
142 case JS_MAP_ITERATOR_TYPE: | 135 case JS_MAP_ITERATOR_TYPE: |
143 return GetVisitorIdForSize(kVisitJSObject, | 136 return GetVisitorIdForSize(kVisitJSObject, kVisitJSObjectGeneric, |
144 kVisitJSObjectGeneric, | 137 instance_size, has_non_tagged_fields); |
145 instance_size); | |
146 | 138 |
147 case JS_FUNCTION_TYPE: | 139 case JS_FUNCTION_TYPE: |
148 return kVisitJSFunction; | 140 return kVisitJSFunction; |
149 | 141 |
150 case HEAP_NUMBER_TYPE: | 142 case HEAP_NUMBER_TYPE: |
151 case MUTABLE_HEAP_NUMBER_TYPE: | 143 case MUTABLE_HEAP_NUMBER_TYPE: |
152 #define EXTERNAL_ARRAY_CASE(Type, type, TYPE, ctype, size) \ | 144 #define EXTERNAL_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
153 case EXTERNAL_##TYPE##_ARRAY_TYPE: | 145 case EXTERNAL_##TYPE##_ARRAY_TYPE: |
154 | 146 |
155 TYPED_ARRAYS(EXTERNAL_ARRAY_CASE) | 147 TYPED_ARRAYS(EXTERNAL_ARRAY_CASE) |
156 return GetVisitorIdForSize(kVisitDataObject, | 148 return GetVisitorIdForSize(kVisitDataObject, kVisitDataObjectGeneric, |
157 kVisitDataObjectGeneric, | 149 instance_size, has_non_tagged_fields); |
158 instance_size); | |
159 #undef EXTERNAL_ARRAY_CASE | 150 #undef EXTERNAL_ARRAY_CASE |
160 | 151 |
161 case FIXED_UINT8_ARRAY_TYPE: | 152 case FIXED_UINT8_ARRAY_TYPE: |
162 case FIXED_INT8_ARRAY_TYPE: | 153 case FIXED_INT8_ARRAY_TYPE: |
163 case FIXED_UINT16_ARRAY_TYPE: | 154 case FIXED_UINT16_ARRAY_TYPE: |
164 case FIXED_INT16_ARRAY_TYPE: | 155 case FIXED_INT16_ARRAY_TYPE: |
165 case FIXED_UINT32_ARRAY_TYPE: | 156 case FIXED_UINT32_ARRAY_TYPE: |
166 case FIXED_INT32_ARRAY_TYPE: | 157 case FIXED_INT32_ARRAY_TYPE: |
167 case FIXED_FLOAT32_ARRAY_TYPE: | 158 case FIXED_FLOAT32_ARRAY_TYPE: |
168 case FIXED_UINT8_CLAMPED_ARRAY_TYPE: | 159 case FIXED_UINT8_CLAMPED_ARRAY_TYPE: |
169 return kVisitFixedTypedArray; | 160 return kVisitFixedTypedArray; |
170 | 161 |
171 case FIXED_FLOAT64_ARRAY_TYPE: | 162 case FIXED_FLOAT64_ARRAY_TYPE: |
172 return kVisitFixedFloat64Array; | 163 return kVisitFixedFloat64Array; |
173 | 164 |
174 #define MAKE_STRUCT_CASE(NAME, Name, name) \ | 165 #define MAKE_STRUCT_CASE(NAME, Name, name) \ |
175 case NAME##_TYPE: | 166 case NAME##_TYPE: |
176 STRUCT_LIST(MAKE_STRUCT_CASE) | 167 STRUCT_LIST(MAKE_STRUCT_CASE) |
177 #undef MAKE_STRUCT_CASE | 168 #undef MAKE_STRUCT_CASE |
178 if (instance_type == ALLOCATION_SITE_TYPE) { | 169 if (instance_type == ALLOCATION_SITE_TYPE) { |
179 return kVisitAllocationSite; | 170 return kVisitAllocationSite; |
180 } | 171 } |
181 | 172 |
182 return GetVisitorIdForSize(kVisitStruct, | 173 return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, |
183 kVisitStructGeneric, | 174 instance_size, has_non_tagged_fields); |
184 instance_size); | |
185 | 175 |
186 default: | 176 default: |
187 UNREACHABLE(); | 177 UNREACHABLE(); |
188 return kVisitorIdCount; | 178 return kVisitorIdCount; |
189 } | 179 } |
190 } | 180 } |
191 | 181 |
192 | 182 |
193 // We don't record weak slots during marking or scavenges. Instead we do it | 183 // We don't record weak slots during marking or scavenges. Instead we do it |
194 // once when we complete mark-compact cycle. Note that write barrier has no | 184 // once when we complete mark-compact cycle. Note that write barrier has no |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
451 | 441 |
452 | 442 |
453 template Object* VisitWeakList<JSArrayBuffer>( | 443 template Object* VisitWeakList<JSArrayBuffer>( |
454 Heap* heap, Object* list, WeakObjectRetainer* retainer); | 444 Heap* heap, Object* list, WeakObjectRetainer* retainer); |
455 | 445 |
456 | 446 |
457 template Object* VisitWeakList<AllocationSite>( | 447 template Object* VisitWeakList<AllocationSite>( |
458 Heap* heap, Object* list, WeakObjectRetainer* retainer); | 448 Heap* heap, Object* list, WeakObjectRetainer* retainer); |
459 | 449 |
460 } } // namespace v8::internal | 450 } } // namespace v8::internal |
OLD | NEW |