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 EXTERNAL_PIXEL_ARRAY_TYPE: 175 case EXTERNAL_BYTE_ARRAY_TYPE: 176 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: 177 case EXTERNAL_SHORT_ARRAY_TYPE: 178 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: 179 case EXTERNAL_INT_ARRAY_TYPE: 180 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: 181 case EXTERNAL_FLOAT_ARRAY_TYPE: 182 case EXTERNAL_DOUBLE_ARRAY_TYPE: 183 return GetVisitorIdForSize(kVisitDataObject, 184 kVisitDataObjectGeneric, 185 instance_size); 186 187 #define MAKE_STRUCT_CASE(NAME, Name, name) \ 188 case NAME##_TYPE: 189 STRUCT_LIST(MAKE_STRUCT_CASE) 190 #undef MAKE_STRUCT_CASE 191 if (instance_type == ALLOCATION_SITE_TYPE) { 192 return kVisitAllocationSite; 193 } 194 195 return GetVisitorIdForSize(kVisitStruct, 196 kVisitStructGeneric, 197 instance_size); 198 199 default: 200 UNREACHABLE(); 201 return kVisitorIdCount; 202 } 203 } 204 205 } } // namespace v8::internal 206