• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
IsShortcutCandidate(int type)37 static inline bool IsShortcutCandidate(int type) {
38   return ((type & kShortcutTypeMask) == kShortcutTypeTag);
39 }
40 
41 
GetVisitorId(int instance_type,int instance_size)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) == kAsciiStringTag) {
49           return kVisitSeqAsciiString;
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 ODDBALL_TYPE:
86       return kVisitOddball;
87 
88     case MAP_TYPE:
89       return kVisitMap;
90 
91     case CODE_TYPE:
92       return kVisitCode;
93 
94     case JS_GLOBAL_PROPERTY_CELL_TYPE:
95       return kVisitPropertyCell;
96 
97     case JS_SET_TYPE:
98       return GetVisitorIdForSize(kVisitStruct,
99                                  kVisitStructGeneric,
100                                  JSSet::kSize);
101 
102     case JS_MAP_TYPE:
103       return GetVisitorIdForSize(kVisitStruct,
104                                  kVisitStructGeneric,
105                                  JSMap::kSize);
106 
107     case JS_WEAK_MAP_TYPE:
108       return kVisitJSWeakMap;
109 
110     case JS_REGEXP_TYPE:
111       return kVisitJSRegExp;
112 
113     case SHARED_FUNCTION_INFO_TYPE:
114       return kVisitSharedFunctionInfo;
115 
116     case JS_PROXY_TYPE:
117       return GetVisitorIdForSize(kVisitStruct,
118                                  kVisitStructGeneric,
119                                  JSProxy::kSize);
120 
121     case JS_FUNCTION_PROXY_TYPE:
122       return GetVisitorIdForSize(kVisitStruct,
123                                  kVisitStructGeneric,
124                                  JSFunctionProxy::kSize);
125 
126     case FOREIGN_TYPE:
127       return GetVisitorIdForSize(kVisitDataObject,
128                                  kVisitDataObjectGeneric,
129                                  Foreign::kSize);
130 
131     case FILLER_TYPE:
132       return kVisitDataObjectGeneric;
133 
134     case JS_OBJECT_TYPE:
135     case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
136     case JS_VALUE_TYPE:
137     case JS_DATE_TYPE:
138     case JS_ARRAY_TYPE:
139     case JS_GLOBAL_PROXY_TYPE:
140     case JS_GLOBAL_OBJECT_TYPE:
141     case JS_BUILTINS_OBJECT_TYPE:
142     case JS_MESSAGE_OBJECT_TYPE:
143       return GetVisitorIdForSize(kVisitJSObject,
144                                  kVisitJSObjectGeneric,
145                                  instance_size);
146 
147     case JS_FUNCTION_TYPE:
148       return kVisitJSFunction;
149 
150     case HEAP_NUMBER_TYPE:
151     case EXTERNAL_PIXEL_ARRAY_TYPE:
152     case EXTERNAL_BYTE_ARRAY_TYPE:
153     case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
154     case EXTERNAL_SHORT_ARRAY_TYPE:
155     case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
156     case EXTERNAL_INT_ARRAY_TYPE:
157     case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
158     case EXTERNAL_FLOAT_ARRAY_TYPE:
159     case EXTERNAL_DOUBLE_ARRAY_TYPE:
160       return GetVisitorIdForSize(kVisitDataObject,
161                                  kVisitDataObjectGeneric,
162                                  instance_size);
163 
164 #define MAKE_STRUCT_CASE(NAME, Name, name) \
165         case NAME##_TYPE:
166       STRUCT_LIST(MAKE_STRUCT_CASE)
167 #undef MAKE_STRUCT_CASE
168           return GetVisitorIdForSize(kVisitStruct,
169                                      kVisitStructGeneric,
170                                      instance_size);
171 
172     default:
173       UNREACHABLE();
174       return kVisitorIdCount;
175   }
176 }
177 
178 } }  // namespace v8::internal
179