Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / v8 / src / objects-visiting.cc
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
4 // met:
5 //
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.
15 //
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.
27
28 #include "v8.h"
29
30 #include "ic-inl.h"
31 #include "objects-visiting.h"
32
33 namespace v8 {
34 namespace internal {
35
36
37 static inline bool IsShortcutCandidate(int type) {
38   return ((type & kShortcutTypeMask) == kShortcutTypeTag);
39 }
40
41
42 StaticVisitorBase::VisitorId StaticVisitorBase::GetVisitorId(
43     int instance_type,
44     int instance_size) {
45   if (instance_type < FIRST_NONSTRING_TYPE) {
46     switch (instance_type & kStringRepresentationMask) {
47       case kSeqStringTag:
48         if ((instance_type & kStringEncodingMask) == kOneByteStringTag) {
49           return kVisitSeqOneByteString;
50         } else {
51           return kVisitSeqTwoByteString;
52         }
53
54       case kConsStringTag:
55         if (IsShortcutCandidate(instance_type)) {
56           return kVisitShortcutCandidate;
57         } else {
58           return kVisitConsString;
59         }
60
61       case kSlicedStringTag:
62         return kVisitSlicedString;
63
64       case kExternalStringTag:
65         return GetVisitorIdForSize(kVisitDataObject,
66                                    kVisitDataObjectGeneric,
67                                    instance_size);
68     }
69     UNREACHABLE();
70   }
71
72   switch (instance_type) {
73     case BYTE_ARRAY_TYPE:
74       return kVisitByteArray;
75
76     case FREE_SPACE_TYPE:
77       return kVisitFreeSpace;
78
79     case FIXED_ARRAY_TYPE:
80       return kVisitFixedArray;
81
82     case FIXED_DOUBLE_ARRAY_TYPE:
83       return kVisitFixedDoubleArray;
84
85     case CONSTANT_POOL_ARRAY_TYPE:
86       return kVisitConstantPoolArray;
87
88     case ODDBALL_TYPE:
89       return kVisitOddball;
90
91     case MAP_TYPE:
92       return kVisitMap;
93
94     case CODE_TYPE:
95       return kVisitCode;
96
97     case CELL_TYPE:
98       return kVisitCell;
99
100     case PROPERTY_CELL_TYPE:
101       return kVisitPropertyCell;
102
103     case JS_SET_TYPE:
104       return GetVisitorIdForSize(kVisitStruct,
105                                  kVisitStructGeneric,
106                                  JSSet::kSize);
107
108     case JS_MAP_TYPE:
109       return GetVisitorIdForSize(kVisitStruct,
110                                  kVisitStructGeneric,
111                                  JSMap::kSize);
112
113     case JS_WEAK_MAP_TYPE:
114       return kVisitJSWeakMap;
115
116     case JS_WEAK_SET_TYPE:
117       return kVisitJSWeakSet;
118
119     case JS_REGEXP_TYPE:
120       return kVisitJSRegExp;
121
122     case SHARED_FUNCTION_INFO_TYPE:
123       return kVisitSharedFunctionInfo;
124
125     case JS_PROXY_TYPE:
126       return GetVisitorIdForSize(kVisitStruct,
127                                  kVisitStructGeneric,
128                                  JSProxy::kSize);
129
130     case JS_FUNCTION_PROXY_TYPE:
131       return GetVisitorIdForSize(kVisitStruct,
132                                  kVisitStructGeneric,
133                                  JSFunctionProxy::kSize);
134
135     case FOREIGN_TYPE:
136       return GetVisitorIdForSize(kVisitDataObject,
137                                  kVisitDataObjectGeneric,
138                                  Foreign::kSize);
139
140     case SYMBOL_TYPE:
141       return kVisitSymbol;
142
143     case FILLER_TYPE:
144       return kVisitDataObjectGeneric;
145
146     case JS_ARRAY_BUFFER_TYPE:
147       return kVisitJSArrayBuffer;
148
149     case JS_TYPED_ARRAY_TYPE:
150       return kVisitJSTypedArray;
151
152     case JS_DATA_VIEW_TYPE:
153       return kVisitJSDataView;
154
155     case JS_OBJECT_TYPE:
156     case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
157     case JS_GENERATOR_OBJECT_TYPE:
158     case JS_MODULE_TYPE:
159     case JS_VALUE_TYPE:
160     case JS_DATE_TYPE:
161     case JS_ARRAY_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,
168                                  instance_size);
169
170     case JS_FUNCTION_TYPE:
171       return kVisitJSFunction;
172
173     case HEAP_NUMBER_TYPE:
174     case FLOAT32x4_TYPE:
175     case INT32x4_TYPE:
176 #define EXTERNAL_ARRAY_CASE(Type, type, TYPE, ctype, size)                     \
177     case EXTERNAL_##TYPE##_ARRAY_TYPE:
178
179     TYPED_ARRAYS(EXTERNAL_ARRAY_CASE)
180       return GetVisitorIdForSize(kVisitDataObject,
181                                  kVisitDataObjectGeneric,
182                                  instance_size);
183 #undef EXTERNAL_ARRAY_CASE
184
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;
196
197     case FIXED_FLOAT64_ARRAY_TYPE:
198       return kVisitFixedFloat64Array;
199
200 #define MAKE_STRUCT_CASE(NAME, Name, name) \
201         case NAME##_TYPE:
202       STRUCT_LIST(MAKE_STRUCT_CASE)
203 #undef MAKE_STRUCT_CASE
204           if (instance_type == ALLOCATION_SITE_TYPE) {
205             return kVisitAllocationSite;
206           }
207
208           return GetVisitorIdForSize(kVisitStruct,
209                                      kVisitStructGeneric,
210                                      instance_size);
211
212     default:
213       UNREACHABLE();
214       return kVisitorIdCount;
215   }
216 }
217
218 } }  // namespace v8::internal