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 33namespace v8 { 34namespace internal { 35 36 37static inline bool IsShortcutCandidate(int type) { 38 return ((type & kShortcutTypeMask) == kShortcutTypeTag); 39} 40 41 42StaticVisitorBase::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