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