v8  3.14.5(node0.10.28)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
objects-visiting.cc
Go to the documentation of this file.
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 
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:
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 
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 
95  return kVisitPropertyCell;
96 
97  case JS_SET_TYPE:
99  kVisitStructGeneric,
100  JSSet::kSize);
101 
102  case JS_MAP_TYPE:
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 
114  return kVisitSharedFunctionInfo;
115 
116  case JS_PROXY_TYPE:
118  kVisitStructGeneric,
120 
123  kVisitStructGeneric,
125 
126  case FOREIGN_TYPE:
128  kVisitDataObjectGeneric,
130 
131  case FILLER_TYPE:
132  return kVisitDataObjectGeneric;
133 
134  case JS_OBJECT_TYPE:
136  case JS_MODULE_TYPE:
137  case JS_VALUE_TYPE:
138  case JS_DATE_TYPE:
139  case JS_ARRAY_TYPE:
145  kVisitJSObjectGeneric,
146  instance_size);
147 
148  case JS_FUNCTION_TYPE:
149  return kVisitJSFunction;
150 
151  case HEAP_NUMBER_TYPE:
162  kVisitDataObjectGeneric,
163  instance_size);
164 
165 #define MAKE_STRUCT_CASE(NAME, Name, name) \
166  case NAME##_TYPE:
168 #undef MAKE_STRUCT_CASE
170  kVisitStructGeneric,
171  instance_size);
172 
173  default:
174  UNREACHABLE();
175  return kVisitorIdCount;
176  }
177 }
178 
179 } } // namespace v8::internal
const uint32_t kShortcutTypeTag
Definition: objects.h:515
static VisitorId GetVisitorIdForSize(VisitorId base, VisitorId generic, int object_size)
static const int kSize
Definition: objects.h:8113
const uint32_t kStringRepresentationMask
Definition: objects.h:474
static const int kSize
Definition: objects.h:8209
static const int kSize
Definition: objects.h:8152
#define MAKE_STRUCT_CASE(NAME, Name, name)
#define UNREACHABLE()
Definition: checks.h:50
const uint32_t kShortcutTypeMask
Definition: objects.h:511
static const int kSize
Definition: objects.h:8184
#define STRUCT_LIST(V)
Definition: objects.h:448
static VisitorId GetVisitorId(int instance_type, int instance_size)
const uint32_t kAsciiStringTag
Definition: objects.h:470
static const int kSize
Definition: objects.h:8274
const uint32_t kStringEncodingMask
Definition: objects.h:468