1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include "objects-visiting.h"
37 static inline bool IsShortcutCandidate(int type) {
38 return ((type & kShortcutTypeMask) == kShortcutTypeTag);
42 StaticVisitorBase::VisitorId StaticVisitorBase::GetVisitorId(
45 if (instance_type < FIRST_NONSTRING_TYPE) {
46 switch (instance_type & kStringRepresentationMask) {
48 if ((instance_type & kStringEncodingMask) == kOneByteStringTag) {
49 return kVisitSeqOneByteString;
51 return kVisitSeqTwoByteString;
55 if (IsShortcutCandidate(instance_type)) {
56 return kVisitShortcutCandidate;
58 return kVisitConsString;
61 case kSlicedStringTag:
62 return kVisitSlicedString;
64 case kExternalStringTag:
65 return GetVisitorIdForSize(kVisitDataObject,
66 kVisitDataObjectGeneric,
72 switch (instance_type) {
74 return kVisitByteArray;
77 return kVisitFreeSpace;
79 case FIXED_ARRAY_TYPE:
80 return kVisitFixedArray;
82 case FIXED_DOUBLE_ARRAY_TYPE:
83 return kVisitFixedDoubleArray;
85 case CONSTANT_POOL_ARRAY_TYPE:
86 return kVisitConstantPoolArray;
100 case PROPERTY_CELL_TYPE:
101 return kVisitPropertyCell;
104 return GetVisitorIdForSize(kVisitStruct,
109 return GetVisitorIdForSize(kVisitStruct,
113 case JS_WEAK_MAP_TYPE:
114 return kVisitJSWeakMap;
116 case JS_WEAK_SET_TYPE:
117 return kVisitJSWeakSet;
120 return kVisitJSRegExp;
122 case SHARED_FUNCTION_INFO_TYPE:
123 return kVisitSharedFunctionInfo;
126 return GetVisitorIdForSize(kVisitStruct,
130 case JS_FUNCTION_PROXY_TYPE:
131 return GetVisitorIdForSize(kVisitStruct,
133 JSFunctionProxy::kSize);
136 return GetVisitorIdForSize(kVisitDataObject,
137 kVisitDataObjectGeneric,
144 return kVisitDataObjectGeneric;
146 case JS_ARRAY_BUFFER_TYPE:
147 return kVisitJSArrayBuffer;
149 case JS_TYPED_ARRAY_TYPE:
150 return kVisitJSTypedArray;
152 case JS_DATA_VIEW_TYPE:
153 return kVisitJSDataView;
156 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
157 case JS_GENERATOR_OBJECT_TYPE:
162 case JS_GLOBAL_PROXY_TYPE:
163 case JS_GLOBAL_OBJECT_TYPE:
164 case JS_BUILTINS_OBJECT_TYPE:
165 case JS_MESSAGE_OBJECT_TYPE:
166 return GetVisitorIdForSize(kVisitJSObject,
167 kVisitJSObjectGeneric,
170 case JS_FUNCTION_TYPE:
171 return kVisitJSFunction;
173 case HEAP_NUMBER_TYPE:
176 #define EXTERNAL_ARRAY_CASE(Type, type, TYPE, ctype, size) \
177 case EXTERNAL_##TYPE##_ARRAY_TYPE:
179 TYPED_ARRAYS(EXTERNAL_ARRAY_CASE)
180 return GetVisitorIdForSize(kVisitDataObject,
181 kVisitDataObjectGeneric,
183 #undef EXTERNAL_ARRAY_CASE
185 case FIXED_UINT8_ARRAY_TYPE:
186 case FIXED_INT8_ARRAY_TYPE:
187 case FIXED_UINT16_ARRAY_TYPE:
188 case FIXED_INT16_ARRAY_TYPE:
189 case FIXED_UINT32_ARRAY_TYPE:
190 case FIXED_INT32_ARRAY_TYPE:
191 case FIXED_FLOAT32_ARRAY_TYPE:
192 case FIXED_INT32x4_ARRAY_TYPE:
193 case FIXED_FLOAT32x4_ARRAY_TYPE:
194 case FIXED_UINT8_CLAMPED_ARRAY_TYPE:
195 return kVisitFixedTypedArray;
197 case FIXED_FLOAT64_ARRAY_TYPE:
198 return kVisitFixedFloat64Array;
200 #define MAKE_STRUCT_CASE(NAME, Name, name) \
202 STRUCT_LIST(MAKE_STRUCT_CASE)
203 #undef MAKE_STRUCT_CASE
204 if (instance_type == ALLOCATION_SITE_TYPE) {
205 return kVisitAllocationSite;
208 return GetVisitorIdForSize(kVisitStruct,
214 return kVisitorIdCount;
218 } } // namespace v8::internal