13fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 2756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// Redistribution and use in source and binary forms, with or without 3756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// modification, are permitted provided that the following conditions are 4756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// met: 5756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// 6756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// * Redistributions of source code must retain the above copyright 7756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// notice, this list of conditions and the following disclaimer. 8756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// * Redistributions in binary form must reproduce the above 9756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// copyright notice, this list of conditions and the following 10756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// disclaimer in the documentation and/or other materials provided 11756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// with the distribution. 12756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// * Neither the name of Google Inc. nor the names of its 13756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// contributors may be used to endorse or promote products derived 14756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// from this software without specific prior written permission. 15756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// 16756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 28756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#include "v8.h" 29756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 30756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#include "ic-inl.h" 31756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#include "objects-visiting.h" 32756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 33756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricknamespace v8 { 34756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricknamespace internal { 35756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 36756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 37756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickstatic inline bool IsShortcutCandidate(int type) { 38756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return ((type & kShortcutTypeMask) == kShortcutTypeTag); 39756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 40756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 41756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 42756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickStaticVisitorBase::VisitorId StaticVisitorBase::GetVisitorId( 43756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick int instance_type, 44756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick int instance_size) { 45756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick if (instance_type < FIRST_NONSTRING_TYPE) { 46756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick switch (instance_type & kStringRepresentationMask) { 47756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case kSeqStringTag: 48756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick if ((instance_type & kStringEncodingMask) == kAsciiStringTag) { 49756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitSeqAsciiString; 50756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } else { 51756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitSeqTwoByteString; 52756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } 53756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 54756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case kConsStringTag: 55756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick if (IsShortcutCandidate(instance_type)) { 56756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitShortcutCandidate; 57756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } else { 58756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitConsString; 59756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } 60756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 6169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch case kSlicedStringTag: 6269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return kVisitSlicedString; 6369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 64756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case kExternalStringTag: 65756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return GetVisitorIdForSize(kVisitDataObject, 66756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kVisitDataObjectGeneric, 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instance_size); 68756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } 69756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick UNREACHABLE(); 70756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } 71756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 72756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick switch (instance_type) { 73756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case BYTE_ARRAY_TYPE: 74756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitByteArray; 75756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case FREE_SPACE_TYPE: 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return kVisitFreeSpace; 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 79756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case FIXED_ARRAY_TYPE: 80756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitFixedArray; 81756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case FIXED_DOUBLE_ARRAY_TYPE: 833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return kVisitFixedDoubleArray; 843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 85756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case ODDBALL_TYPE: 86756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitOddball; 87756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 88756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case MAP_TYPE: 89756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitMap; 90756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 91756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case CODE_TYPE: 92756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitCode; 93756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 94756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case JS_GLOBAL_PROPERTY_CELL_TYPE: 95756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitPropertyCell; 96756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case JS_SET_TYPE: 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetVisitorIdForSize(kVisitStruct, 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kVisitStructGeneric, 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JSSet::kSize); 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case JS_MAP_TYPE: 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetVisitorIdForSize(kVisitStruct, 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kVisitStructGeneric, 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JSMap::kSize); 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch case JS_WEAK_MAP_TYPE: 10869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return kVisitJSWeakMap; 10969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case JS_REGEXP_TYPE: 111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return kVisitJSRegExp; 112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 113756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case SHARED_FUNCTION_INFO_TYPE: 114756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitSharedFunctionInfo; 115756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case JS_PROXY_TYPE: 117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return GetVisitorIdForSize(kVisitStruct, 118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kVisitStructGeneric, 119257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch JSProxy::kSize); 120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 121589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch case JS_FUNCTION_PROXY_TYPE: 122589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return GetVisitorIdForSize(kVisitStruct, 123589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch kVisitStructGeneric, 124589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch JSFunctionProxy::kSize); 125589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 126257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case FOREIGN_TYPE: 127756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return GetVisitorIdForSize(kVisitDataObject, 128756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kVisitDataObjectGeneric, 129257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Foreign::kSize); 130756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 131756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case FILLER_TYPE: 132756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitDataObjectGeneric; 133756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 134756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case JS_OBJECT_TYPE: 135756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case JS_CONTEXT_EXTENSION_OBJECT_TYPE: 136756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case JS_VALUE_TYPE: 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case JS_DATE_TYPE: 138756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case JS_ARRAY_TYPE: 139756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case JS_GLOBAL_PROXY_TYPE: 140756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case JS_GLOBAL_OBJECT_TYPE: 141756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case JS_BUILTINS_OBJECT_TYPE: 1421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case JS_MESSAGE_OBJECT_TYPE: 143756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return GetVisitorIdForSize(kVisitJSObject, 144756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kVisitJSObjectGeneric, 145756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick instance_size); 146756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 147756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case JS_FUNCTION_TYPE: 148756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitJSFunction; 149756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 150756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case HEAP_NUMBER_TYPE: 15144f0eee88ff00398ff7f715fab053374d808c90dSteve Block case EXTERNAL_PIXEL_ARRAY_TYPE: 152756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case EXTERNAL_BYTE_ARRAY_TYPE: 153756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: 154756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case EXTERNAL_SHORT_ARRAY_TYPE: 155756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: 156756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case EXTERNAL_INT_ARRAY_TYPE: 157756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: 158756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case EXTERNAL_FLOAT_ARRAY_TYPE: 159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch case EXTERNAL_DOUBLE_ARRAY_TYPE: 160756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return GetVisitorIdForSize(kVisitDataObject, 161756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kVisitDataObjectGeneric, 162756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick instance_size); 163756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 164756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#define MAKE_STRUCT_CASE(NAME, Name, name) \ 165756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick case NAME##_TYPE: 166756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick STRUCT_LIST(MAKE_STRUCT_CASE) 167756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#undef MAKE_STRUCT_CASE 168756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return GetVisitorIdForSize(kVisitStruct, 169756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kVisitStructGeneric, 170756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick instance_size); 171756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 172756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick default: 173756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick UNREACHABLE(); 174756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return kVisitorIdCount; 175756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } 176756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 177756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 178756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} } // namespace v8::internal 179