13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/objects.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/bootstrapper.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/disasm.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/disassembler.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/macro-assembler.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ostreams.h"
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/jsregexp.h"
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP
189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Object::ObjectVerify() {
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsSmi()) {
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Smi::cast(this)->SmiVerify();
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HeapObject::cast(this)->HeapObjectVerify();
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(!IsConstructor() || IsCallable());
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Object::VerifyPointer(Object* p) {
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (p->IsHeapObject()) {
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    HeapObject::VerifyHeapPointer(p);
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(p->IsSmi());
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Smi::SmiVerify() {
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsSmi());
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(!IsCallable());
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(!IsConstructor());
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::HeapObjectVerify() {
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InstanceType instance_type = map()->instance_type();
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (instance_type < FIRST_NONSTRING_TYPE) {
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    String::cast(this)->StringVerify();
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return;
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (instance_type) {
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case SYMBOL_TYPE:
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Symbol::cast(this)->SymbolVerify();
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case MAP_TYPE:
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Map::cast(this)->MapVerify();
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case HEAP_NUMBER_TYPE:
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case MUTABLE_HEAP_NUMBER_TYPE:
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      HeapNumber::cast(this)->HeapNumberVerify();
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case SIMD128_VALUE_TYPE:
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Simd128Value::cast(this)->Simd128ValueVerify();
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case FIXED_ARRAY_TYPE:
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      FixedArray::cast(this)->FixedArrayVerify();
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    case FIXED_DOUBLE_ARRAY_TYPE:
713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      FixedDoubleArray::cast(this)->FixedDoubleArrayVerify();
723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      break;
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case BYTE_ARRAY_TYPE:
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      ByteArray::cast(this)->ByteArrayVerify();
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case BYTECODE_ARRAY_TYPE:
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      BytecodeArray::cast(this)->BytecodeArrayVerify();
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case TRANSITION_ARRAY_TYPE:
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      TransitionArray::cast(this)->TransitionArrayVerify();
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case FREE_SPACE_TYPE:
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      FreeSpace::cast(this)->FreeSpaceVerify();
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      break;
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define VERIFY_TYPED_ARRAY(Type, type, TYPE, ctype, size)                      \
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FIXED_##TYPE##_ARRAY_TYPE:                                            \
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Fixed##Type##Array::cast(this)->FixedTypedArrayVerify();                 \
89257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      break;
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TYPED_ARRAYS(VERIFY_TYPED_ARRAY)
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef VERIFY_TYPED_ARRAY
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case CODE_TYPE:
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Code::cast(this)->CodeVerify();
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case ODDBALL_TYPE:
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Oddball::cast(this)->OddballVerify();
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_OBJECT_TYPE:
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case JS_PROMISE_TYPE:
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSObject::cast(this)->JSObjectVerify();
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_GENERATOR_OBJECT_TYPE:
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSGeneratorObject::cast(this)->JSGeneratorObjectVerify();
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_MODULE_TYPE:
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSModule::cast(this)->JSModuleVerify();
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_VALUE_TYPE:
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSValue::cast(this)->JSValueVerify();
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case JS_DATE_TYPE:
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      JSDate::cast(this)->JSDateVerify();
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      break;
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case JS_BOUND_FUNCTION_TYPE:
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSBoundFunction::cast(this)->JSBoundFunctionVerify();
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_FUNCTION_TYPE:
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSFunction::cast(this)->JSFunctionVerify();
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_GLOBAL_PROXY_TYPE:
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSGlobalProxy::cast(this)->JSGlobalProxyVerify();
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_GLOBAL_OBJECT_TYPE:
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSGlobalObject::cast(this)->JSGlobalObjectVerify();
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case CELL_TYPE:
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cell::cast(this)->CellVerify();
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case PROPERTY_CELL_TYPE:
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      PropertyCell::cast(this)->PropertyCellVerify();
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case WEAK_CELL_TYPE:
136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      WeakCell::cast(this)->WeakCellVerify();
137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_ARRAY_TYPE:
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSArray::cast(this)->JSArrayVerify();
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case JS_SET_TYPE:
1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      JSSet::cast(this)->JSSetVerify();
1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      break;
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case JS_MAP_TYPE:
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      JSMap::cast(this)->JSMapVerify();
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      break;
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_SET_ITERATOR_TYPE:
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSSetIterator::cast(this)->JSSetIteratorVerify();
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_MAP_ITERATOR_TYPE:
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSMapIterator::cast(this)->JSMapIteratorVerify();
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case JS_ITERATOR_RESULT_TYPE:
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSIteratorResult::cast(this)->JSIteratorResultVerify();
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
15669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case JS_WEAK_MAP_TYPE:
15769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      JSWeakMap::cast(this)->JSWeakMapVerify();
15869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      break;
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_WEAK_SET_TYPE:
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSWeakSet::cast(this)->JSWeakSetVerify();
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_REGEXP_TYPE:
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSRegExp::cast(this)->JSRegExpVerify();
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case FILLER_TYPE:
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    case JS_PROXY_TYPE:
168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      JSProxy::cast(this)->JSProxyVerify();
169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      break;
170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    case FOREIGN_TYPE:
171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      Foreign::cast(this)->ForeignVerify();
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case SHARED_FUNCTION_INFO_TYPE:
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      SharedFunctionInfo::cast(this)->SharedFunctionInfoVerify();
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case JS_MESSAGE_OBJECT_TYPE:
1771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      JSMessageObject::cast(this)->JSMessageObjectVerify();
1781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      break;
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_ARRAY_BUFFER_TYPE:
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSArrayBuffer::cast(this)->JSArrayBufferVerify();
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_TYPED_ARRAY_TYPE:
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSTypedArray::cast(this)->JSTypedArrayVerify();
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_DATA_VIEW_TYPE:
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSDataView::cast(this)->JSDataViewVerify();
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_CASE(NAME, Name, name) \
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  case NAME##_TYPE:                        \
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Name::cast(this)->Name##Verify();      \
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    break;
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    STRUCT_LIST(MAKE_STRUCT_CASE)
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_CASE
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      UNREACHABLE();
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::VerifyHeapPointer(Object* p) {
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(p->IsHeapObject());
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HeapObject* ho = HeapObject::cast(p);
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(ho->GetHeap()->Contains(ho));
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Symbol::SymbolVerify() {
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsSymbol());
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(HasHashCode());
213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_GT(Hash(), 0u);
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(name()->IsUndefined() || name()->IsString());
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HeapNumber::HeapNumberVerify() {
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsHeapNumber() || IsMutableHeapNumber());
2203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
2213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Simd128Value::Simd128ValueVerify() { CHECK(IsSimd128Value()); }
224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ByteArray::ByteArrayVerify() {
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsByteArray());
2283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
2293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BytecodeArray::BytecodeArrayVerify() {
232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // TODO(oth): Walk bytecodes and immediate values to validate sanity.
233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(IsBytecodeArray());
234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(constant_pool()->IsFixedArray());
235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyHeapPointer(constant_pool());
2363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
2373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid FreeSpace::FreeSpaceVerify() {
240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(IsFreeSpace());
241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits>
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid FixedTypedArray<Traits>::FixedTypedArrayVerify() {
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsHeapObject() &&
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HeapObject::cast(this)->map()->instance_type() ==
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Traits::kInstanceType);
249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (base_pointer() == this) {
250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(external_pointer() ==
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          ExternalReference::fixed_typed_array_base_data_offset().address());
252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(base_pointer() == nullptr);
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
2563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSObject::ElementsAreSafeToExamine() {
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If a GC was caused while constructing this object, the elements
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // pointer may point to a one pointer filler map.
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<Map*>(elements()) !=
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      GetHeap()->one_pointer_filler_map();
263257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
264257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
265257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::JSObjectVerify() {
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyHeapPointer(properties());
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyHeapPointer(elements());
2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (HasSloppyArgumentsElements()) {
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this->elements()->IsFixedArray());
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_GE(this->elements()->length(), 2);
2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (HasFastProperties()) {
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int actual_unused_property_fields = map()->GetInObjectProperties() +
277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                        properties()->length() -
278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                        map()->NextFreePropertyIndex();
279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (map()->unused_property_fields() != actual_unused_property_fields) {
280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // This could actually happen in the middle of StoreTransitionStub
281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // when the new extended backing store is already set into the object and
282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // the allocation of the MutableHeapNumber triggers GC (in this case map
283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // is not updated yet).
284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      CHECK_EQ(map()->unused_property_fields(),
285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier               actual_unused_property_fields - JSObject::kFieldsAdded);
286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DescriptorArray* descriptors = map()->instance_descriptors();
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < map()->NumberOfOwnDescriptors(); i++) {
289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (descriptors->GetDetails(i).type() == DATA) {
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Representation r = descriptors->GetDetails(i).representation();
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FieldIndex index = FieldIndex::ForDescriptor(map(), i);
292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        if (IsUnboxedDoubleField(index)) {
293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          DCHECK(r.IsDouble());
294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          continue;
295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Object* value = RawFastPropertyAt(index);
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (r.IsDouble()) DCHECK(value->IsMutableHeapNumber());
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (value->IsUninitialized()) continue;
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (r.IsSmi()) DCHECK(value->IsSmi());
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (r.IsHeapObject()) DCHECK(value->IsHeapObject());
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HeapType* field_type = descriptors->GetFieldType(i);
302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        bool type_is_none = field_type->Is(HeapType::None());
303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        bool type_is_any = HeapType::Any()->Is(field_type);
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (r.IsNone()) {
305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          CHECK(type_is_none);
306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        } else if (!type_is_any && !(type_is_none && r.IsHeapObject())) {
307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          // If allocation folding is off then GC could happen during inner
308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          // object literal creation and we will end up having and undefined
309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          // value that does not match the field type.
310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          CHECK(!field_type->NowStable() || field_type->NowContains(value) ||
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                (!FLAG_use_allocation_folding && value->IsUndefined()));
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If a GC was caused while constructing this object, the elements
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // pointer may point to a one pointer filler map.
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (ElementsAreSafeToExamine()) {
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ((map()->has_fast_smi_or_object_elements() ||
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              (elements() == GetHeap()->empty_fixed_array())),
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             (elements()->map() == GetHeap()->fixed_array_map() ||
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              elements()->map() == GetHeap()->fixed_cow_array_map()));
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(map()->has_fast_object_elements() == HasFastObjectElements());
325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::MapVerify() {
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap* heap = GetHeap();
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(!heap->InNewSpace(this));
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE);
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(instance_size() == kVariableSizeSentinel ||
334791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block         (kPointerSize <= instance_size() &&
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          instance_size() < heap->Capacity()));
336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(GetBackPointer()->IsUndefined() ||
337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        !Map::cast(GetBackPointer())->is_stable());
338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyHeapPointer(prototype());
339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyHeapPointer(instance_descriptors());
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SLOW_DCHECK(instance_descriptors()->IsSortedNoDuplicates());
341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SLOW_DCHECK(TransitionArray::IsSortedNoDuplicates(this));
342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SLOW_DCHECK(TransitionArray::IsConsistentWithBackPointers(this));
343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // TODO(ishell): turn it back to SLOW_DCHECK.
344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(!FLAG_unbox_double_fields ||
345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        layout_descriptor()->IsConsistentWithMap(this));
346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::DictionaryMapVerify() {
35080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  MapVerify();
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(is_dictionary_map());
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(instance_descriptors()->IsEmpty());
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, unused_property_fields());
354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(Heap::GetStaticVisitorIdForMap(this), visitor_id());
35580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
35680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
35780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::VerifyOmittedMapChecks() {
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!FLAG_omit_map_checks_for_leaf_maps) return;
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!is_stable() ||
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      is_deprecated() ||
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      is_dictionary_map()) {
363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(dependent_code()->IsEmpty(DependentCode::kPrototypeCheckGroup));
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3686ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid CodeCache::CodeCacheVerify() {
3696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  VerifyHeapPointer(default_cache());
3706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  VerifyHeapPointer(normal_type_cache());
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(default_cache()->IsFixedArray());
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(normal_type_cache()->IsUndefined()
3736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block         || normal_type_cache()->IsCodeCacheHashTable());
3746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid PolymorphicCodeCache::PolymorphicCodeCacheVerify() {
3783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  VerifyHeapPointer(cache());
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(cache()->IsUndefined() || cache()->IsPolymorphicCodeCacheHashTable());
3803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
3813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid TypeFeedbackInfo::TypeFeedbackInfoVerify() {
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kStorage1Offset);
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kStorage2Offset);
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kStorage3Offset);
3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid AliasedArgumentsEntry::AliasedArgumentsEntryVerify() {
3913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VerifySmiField(kAliasedContextSlot);
3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::FixedArrayVerify() {
396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < length(); i++) {
397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Object* e = get(i);
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    VerifyPointer(e);
399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid FixedDoubleArray::FixedDoubleArrayVerify() {
4043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (int i = 0; i < length(); i++) {
4053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (!is_the_hole(i)) {
406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      uint64_t value = get_representation(i);
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      uint64_t unexpected =
408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          bit_cast<uint64_t>(std::numeric_limits<double>::quiet_NaN()) &
409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          V8_UINT64_C(0x7FF8000000000000);
410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // Create implementation specific sNaN by inverting relevant bit.
411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      unexpected ^= V8_UINT64_C(0x0008000000000000);
412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK((value & V8_UINT64_C(0x7FF8000000000000)) != unexpected ||
413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            (value & V8_UINT64_C(0x0007FFFFFFFFFFFF)) == V8_UINT64_C(0));
4143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
4153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
4163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
4173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid TransitionArray::TransitionArrayVerify() {
420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; i < length(); i++) {
421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Object* e = get(i);
422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    VerifyPointer(e);
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_LE(LengthFor(number_of_transitions()), length());
425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(next_link()->IsUndefined() || next_link()->IsSmi() ||
426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        next_link()->IsTransitionArray());
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSGeneratorObject::JSGeneratorObjectVerify() {
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // In an expression like "new g()", there can be a point where a generator
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // object is allocated but its fields are all undefined, as it hasn't yet been
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // initialized by the generator.  Hence these weak checks.
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kFunctionOffset);
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kContextOffset);
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kReceiverOffset);
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kOperandStackOffset);
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kContinuationOffset);
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSModule::JSModuleVerify() {
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kContextOffset);
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kScopeInfoOffset);
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(context()->IsUndefined() ||
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Context::cast(context())->IsModuleContext());
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSValue::JSValueVerify() {
451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* v = value();
452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (v->IsHeapObject()) {
453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    VerifyHeapPointer(v);
454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSDate::JSDateVerify() {
4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (value()->IsHeapObject()) {
4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    VerifyHeapPointer(value());
4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(value()->IsUndefined() || value()->IsSmi() || value()->IsHeapNumber());
4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(year()->IsUndefined() || year()->IsSmi() || year()->IsNaN());
4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(month()->IsUndefined() || month()->IsSmi() || month()->IsNaN());
4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(day()->IsUndefined() || day()->IsSmi() || day()->IsNaN());
4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(weekday()->IsUndefined() || weekday()->IsSmi() || weekday()->IsNaN());
4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(hour()->IsUndefined() || hour()->IsSmi() || hour()->IsNaN());
4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(min()->IsUndefined() || min()->IsSmi() || min()->IsNaN());
4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(sec()->IsUndefined() || sec()->IsSmi() || sec()->IsNaN());
4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(cache_stamp()->IsUndefined() ||
4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        cache_stamp()->IsSmi() ||
4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        cache_stamp()->IsNaN());
4733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (month()->IsSmi()) {
4753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int month = Smi::cast(this->month())->value();
4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(0 <= month && month <= 11);
4773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (day()->IsSmi()) {
4793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int day = Smi::cast(this->day())->value();
4803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(1 <= day && day <= 31);
4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (hour()->IsSmi()) {
4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int hour = Smi::cast(this->hour())->value();
4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(0 <= hour && hour <= 23);
4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (min()->IsSmi()) {
4873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int min = Smi::cast(this->min())->value();
4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(0 <= min && min <= 59);
4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (sec()->IsSmi()) {
4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int sec = Smi::cast(this->sec())->value();
4923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(0 <= sec && sec <= 59);
4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (weekday()->IsSmi()) {
4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int weekday = Smi::cast(this->weekday())->value();
4963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(0 <= weekday && weekday <= 6);
4973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (cache_stamp()->IsSmi()) {
4993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(Smi::cast(cache_stamp())->value() <=
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Smi::cast(GetIsolate()->date_cache()->stamp())->value());
5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid JSMessageObject::JSMessageObjectVerify() {
5061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  CHECK(IsJSMessageObject());
5071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  VerifyObjectField(kStartPositionOffset);
5081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  VerifyObjectField(kEndPositionOffset);
5091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  VerifyObjectField(kArgumentsOffset);
5101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  VerifyObjectField(kScriptOffset);
5111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  VerifyObjectField(kStackFramesOffset);
5121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
5131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid String::StringVerify() {
516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsString());
517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(length() >= 0 && length() <= Smi::kMaxValue);
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsInternalizedString()) {
519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!GetHeap()->InNewSpace(this));
520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
52169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (IsConsString()) {
52269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    ConsString::cast(this)->ConsStringVerify();
52369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  } else if (IsSlicedString()) {
52469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SlicedString::cast(this)->SlicedStringVerify();
52569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
52669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
52769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
52869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
52969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid ConsString::ConsStringVerify() {
53069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(this->first()->IsString());
53169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(this->second() == GetHeap()->empty_string() ||
53269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        this->second()->IsString());
5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(this->length() >= ConsString::kMinLength);
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(this->length() == this->first()->length() + this->second()->length());
53569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (this->IsFlat()) {
53669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // A flat cons can only be created by String::SlowTryFlatten.
53769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Afterwards, the first part may be externalized.
53869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    CHECK(this->first()->IsSeqString() || this->first()->IsExternalString());
53969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
54069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
54169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
54269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
54369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid SlicedString::SlicedStringVerify() {
54469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(!this->parent()->IsConsString());
54569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(!this->parent()->IsSlicedString());
54669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(this->length() >= SlicedString::kMinLength);
547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSBoundFunction::JSBoundFunctionVerify() {
551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(IsJSBoundFunction());
552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObjectVerify();
553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyObjectField(kBoundThisOffset);
554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyObjectField(kBoundTargetFunctionOffset);
555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyObjectField(kBoundArgumentsOffset);
556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyObjectField(kCreationContextOffset);
557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(bound_target_function()->IsCallable());
558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(creation_context()->IsNativeContext());
559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(IsCallable());
560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(IsConstructor(), bound_target_function()->IsConstructor());
561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::JSFunctionVerify() {
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsJSFunction());
566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kPrototypeOrInitialMapOffset);
567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  VerifyObjectField(kNextFunctionLinkOffset);
5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(code()->IsCode());
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(next_function_link() == NULL ||
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        next_function_link()->IsUndefined() ||
571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        next_function_link()->IsJSFunction());
572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(map()->is_callable());
573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::SharedFunctionInfoVerify() {
577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsSharedFunctionInfo());
578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kNameOffset);
579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kCodeOffset);
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kOptimizedCodeMapOffset);
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kFeedbackVectorOffset);
5823bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  VerifyObjectField(kScopeInfoOffset);
583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kInstanceClassNameOffset);
584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(function_data()->IsUndefined() || IsApiFunction() ||
585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        HasBuiltinFunctionId() || HasBytecodeArray());
5866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  VerifyObjectField(kFunctionDataOffset);
587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kScriptOffset);
588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kDebugInfoOffset);
589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSGlobalProxy::JSGlobalProxyVerify() {
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsJSGlobalProxy());
594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSObjectVerify();
595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(JSGlobalProxy::kNativeContextOffset);
596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Make sure that this object has no properties, elements.
597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0, properties()->length());
5987f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  CHECK_EQ(0, FixedArray::cast(elements())->length());
599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSGlobalObject::JSGlobalObjectVerify() {
603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsJSGlobalObject());
604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Do not check the dummy global object for the builtins.
605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (GlobalDictionary::cast(properties())->NumberOfElements() == 0 &&
606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      elements()->length() == 0) {
607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return;
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSObjectVerify();
610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Oddball::OddballVerify() {
614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsOddball());
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap* heap = GetHeap();
616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyHeapPointer(to_string());
617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* number = to_number();
618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (number->IsHeapObject()) {
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(number == heap->nan_value());
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(number->IsSmi());
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int value = Smi::cast(number)->value();
623592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    // Hidden oddballs have negative smis.
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const int kLeastHiddenOddballNumber = -5;
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_LE(value, 1);
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(value >= kLeastHiddenOddballNumber);
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (map() == heap->undefined_map()) {
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->undefined_value());
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->the_hole_map()) {
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->the_hole_value());
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->null_map()) {
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->null_value());
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->boolean_map()) {
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->true_value() ||
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          this == heap->false_value());
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->uninitialized_map()) {
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->uninitialized_value());
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->no_interceptor_result_sentinel_map()) {
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->no_interceptor_result_sentinel());
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->arguments_marker_map()) {
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->arguments_marker());
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->termination_exception_map()) {
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->termination_exception());
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->exception_map()) {
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->exception());
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    UNREACHABLE();
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Cell::CellVerify() {
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsCell());
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kValueOffset);
656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PropertyCell::PropertyCellVerify() {
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsPropertyCell());
661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kValueOffset);
662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid WeakCell::WeakCellVerify() {
666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CHECK(IsWeakCell());
667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  VerifyObjectField(kValueOffset);
668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  VerifyObjectField(kNextOffset);
669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Code::CodeVerify() {
673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()),
6740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                  kCodeAlignment));
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  relocation_info()->ObjectVerify();
676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Address last_gc_pc = NULL;
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = GetIsolate();
678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (RelocIterator it(this); !it.done(); it.next()) {
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    it.rinfo()->Verify(isolate);
680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Ensure that GC will not iterate twice over the same pointer.
681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) {
682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      CHECK(it.rinfo()->pc() != last_gc_pc);
683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      last_gc_pc = it.rinfo()->pc();
684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(raw_type_feedback_info() == Smi::FromInt(0) ||
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        raw_type_feedback_info()->IsSmi() == IsCodeStubOrIC());
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::VerifyEmbeddedObjectsDependency() {
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!CanContainWeakObjects()) return;
693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WeakCell* cell = CachedWeakCell();
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DisallowHeapAllocation no_gc;
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = GetIsolate();
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int mode_mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (RelocIterator it(this, mode_mask); !it.done(); it.next()) {
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Object* obj = it.rinfo()->target_object();
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IsWeakObject(obj)) {
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (obj->IsMap()) {
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Map* map = Map::cast(obj);
703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        CHECK(map->dependent_code()->Contains(DependentCode::kWeakCodeGroup,
704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                              cell));
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (obj->IsJSObject()) {
706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        WeakHashTable* table =
707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            GetIsolate()->heap()->weak_object_to_code_table();
708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Handle<HeapObject> key_obj(HeapObject::cast(obj), isolate);
709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        CHECK(DependentCode::cast(table->Lookup(key_obj))
710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  ->Contains(DependentCode::kWeakCodeGroup, cell));
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSArray::JSArrayVerify() {
718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSObjectVerify();
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(length()->IsNumber() || length()->IsUndefined());
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If a GC was caused while constructing this array, the elements
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // pointer may point to a one pointer filler map.
722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (ElementsAreSafeToExamine()) {
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(elements()->IsUndefined() ||
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          elements()->IsFixedArray() ||
725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          elements()->IsFixedDoubleArray());
726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSSet::JSSetVerify() {
7313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(IsJSSet());
7323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  JSObjectVerify();
7333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VerifyHeapPointer(table());
734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsOrderedHashTable() || table()->IsUndefined());
735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(arv): Verify OrderedHashTable too.
7363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSMap::JSMapVerify() {
7403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(IsJSMap());
7413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  JSObjectVerify();
7423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VerifyHeapPointer(table());
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsOrderedHashTable() || table()->IsUndefined());
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(arv): Verify OrderedHashTable too.
745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSSetIterator::JSSetIteratorVerify() {
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSSetIterator());
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObjectVerify();
751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyHeapPointer(table());
752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsOrderedHashTable() || table()->IsUndefined());
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(index()->IsSmi() || index()->IsUndefined());
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(kind()->IsSmi() || kind()->IsUndefined());
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSMapIterator::JSMapIteratorVerify() {
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSMapIterator());
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObjectVerify();
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyHeapPointer(table());
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsOrderedHashTable() || table()->IsUndefined());
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(index()->IsSmi() || index()->IsUndefined());
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(kind()->IsSmi() || kind()->IsUndefined());
7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSIteratorResult::JSIteratorResultVerify() {
769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(IsJSIteratorResult());
770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObjectVerify();
771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyPointer(done());
772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyPointer(value());
773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
77669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid JSWeakMap::JSWeakMapVerify() {
77769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(IsJSWeakMap());
77869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  JSObjectVerify();
77969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  VerifyHeapPointer(table());
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsHashTable() || table()->IsUndefined());
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSWeakSet::JSWeakSetVerify() {
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSWeakSet());
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObjectVerify();
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyHeapPointer(table());
788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsHashTable() || table()->IsUndefined());
78969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
79069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
79169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSRegExp::JSRegExpVerify() {
793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSObjectVerify();
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(data()->IsUndefined() || data()->IsFixedArray());
795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (TypeTag()) {
796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JSRegExp::ATOM: {
797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      FixedArray* arr = FixedArray::cast(data());
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(arr->get(JSRegExp::kAtomPatternIndex)->IsString());
799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JSRegExp::IRREGEXP: {
802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      bool is_native = RegExpImpl::UsesNativeRegExp();
803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      FixedArray* arr = FixedArray::cast(data());
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Object* one_byte_data = arr->get(JSRegExp::kIrregexpLatin1CodeIndex);
806257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      // Smi : Not compiled yet (-1) or code prepared for flushing.
807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // JSObject: Compilation error.
808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Code/ByteArray: Compiled code.
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          one_byte_data->IsSmi() ||
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (is_native ? one_byte_data->IsCode() : one_byte_data->IsByteArray()));
812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Object* uc16_data = arr->get(JSRegExp::kIrregexpUC16CodeIndex);
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(uc16_data->IsSmi() ||
814257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch             (is_native ? uc16_data->IsCode() : uc16_data->IsByteArray()));
815257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Object* one_byte_saved =
817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          arr->get(JSRegExp::kIrregexpLatin1CodeSavedIndex);
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(one_byte_saved->IsSmi() || one_byte_saved->IsString() ||
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            one_byte_saved->IsCode());
820257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      Object* uc16_saved = arr->get(JSRegExp::kIrregexpUC16CodeSavedIndex);
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(uc16_saved->IsSmi() || uc16_saved->IsString() ||
822257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch             uc16_saved->IsCode());
823257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(arr->get(JSRegExp::kIrregexpCaptureCountIndex)->IsSmi());
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(arr->get(JSRegExp::kIrregexpMaxRegisterCountIndex)->IsSmi());
826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(JSRegExp::NOT_COMPILED, TypeTag());
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(data()->IsUndefined());
831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
836257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid JSProxy::JSProxyVerify() {
8373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(IsJSProxy());
838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyPointer(target());
839257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  VerifyPointer(handler());
840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(target()->IsCallable(), map()->is_callable());
841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(target()->IsConstructor(), map()->is_constructor());
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(hash()->IsSmi() || hash()->IsUndefined());
843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(map()->prototype()->IsNull());
844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // There should be no properties on a Proxy.
845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(0, map()->NumberOfOwnDescriptors());
846589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
847589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
848589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSArrayBuffer::JSArrayBufferVerify() {
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSArrayBuffer());
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObjectVerify();
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(byte_length());
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(byte_length()->IsSmi() || byte_length()->IsHeapNumber()
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        || byte_length()->IsUndefined());
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSArrayBufferView::JSArrayBufferViewVerify() {
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSArrayBufferView());
860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObjectVerify();
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(buffer());
862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(buffer()->IsJSArrayBuffer() || buffer()->IsUndefined()
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        || buffer() == Smi::FromInt(0));
864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyPointer(raw_byte_offset());
866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(raw_byte_offset()->IsSmi() || raw_byte_offset()->IsHeapNumber() ||
867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        raw_byte_offset()->IsUndefined());
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyPointer(raw_byte_length());
870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(raw_byte_length()->IsSmi() || raw_byte_length()->IsHeapNumber() ||
871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        raw_byte_length()->IsUndefined());
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSTypedArray::JSTypedArrayVerify() {
876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSTypedArray());
877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSArrayBufferViewVerify();
878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyPointer(raw_length());
879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(raw_length()->IsSmi() || raw_length()->IsHeapNumber() ||
880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        raw_length()->IsUndefined());
881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(elements());
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSDataView::JSDataViewVerify() {
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSDataView());
888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSArrayBufferViewVerify();
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
892257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Foreign::ForeignVerify() {
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsForeign());
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Box::BoxVerify() {
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsBox());
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->ObjectVerify();
900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid PrototypeInfo::PrototypeInfoVerify() {
904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(IsPrototypeInfo());
905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (prototype_users()->IsWeakFixedArray()) {
906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WeakFixedArray::cast(prototype_users())->FixedArrayVerify();
907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(prototype_users()->IsSmi());
909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(validity_cell()->IsCell() || validity_cell()->IsSmi());
911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::AccessorInfoVerify() {
915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(name());
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(expected_receiver_type());
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid SloppyBlockWithEvalContextExtension::
921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SloppyBlockWithEvalContextExtensionVerify() {
922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(IsSloppyBlockWithEvalContextExtension());
923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyObjectField(kScopeInfoOffset);
924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyObjectField(kExtensionOffset);
925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ExecutableAccessorInfo::ExecutableAccessorInfoVerify() {
929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsExecutableAccessorInfo());
930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AccessorInfoVerify();
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(getter());
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(setter());
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(data());
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
9373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid AccessorPair::AccessorPairVerify() {
9383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(IsAccessorPair());
9393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VerifyPointer(getter());
9403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VerifyPointer(setter());
9413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessCheckInfo::AccessCheckInfoVerify() {
945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsAccessCheckInfo());
946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(named_callback());
947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(indexed_callback());
948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  VerifyPointer(callback());
949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(data());
950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid InterceptorInfo::InterceptorInfoVerify() {
954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsInterceptorInfo());
955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(getter());
956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(setter());
957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(query());
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(deleter());
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(enumerator());
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(data());
961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  VerifySmiField(kFlagsOffset);
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid CallHandlerInfo::CallHandlerInfoVerify() {
966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsCallHandlerInfo());
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(callback());
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(data());
969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid TemplateInfo::TemplateInfoVerify() {
973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(tag());
974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(property_list());
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(property_accessors());
976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FunctionTemplateInfo::FunctionTemplateInfoVerify() {
980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsFunctionTemplateInfo());
981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  TemplateInfoVerify();
982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(serial_number());
983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(call_code());
984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(prototype_template());
985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(parent_template());
986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(named_property_handler());
987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(indexed_property_handler());
988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(instance_template());
989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(signature());
990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(access_check_info());
991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ObjectTemplateInfo::ObjectTemplateInfoVerify() {
995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsObjectTemplateInfo());
996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  TemplateInfoVerify();
997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(constructor());
998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(internal_field_count());
999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid AllocationSite::AllocationSiteVerify() {
1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsAllocationSite());
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid AllocationMemento::AllocationMementoVerify() {
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsAllocationMemento());
1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyHeapPointer(allocation_site());
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(!IsValid() || GetAllocationSite()->IsAllocationSite());
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Script::ScriptVerify() {
1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsScript());
1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(source());
1017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(name());
1018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(wrapper());
1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(line_ends());
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid NormalizedMapCache::NormalizedMapCacheVerify() {
1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FixedArray::cast(this)->FixedArrayVerify();
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_enable_slow_asserts) {
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < length(); i++) {
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Object* e = FixedArray::get(i);
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (e->IsMap()) {
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Map::cast(e)->DictionaryMapVerify();
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK(e->IsUndefined());
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DebugInfo::DebugInfoVerify() {
1039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsDebugInfo());
1040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(shared());
1041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(code());
1042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(break_points());
1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid BreakPointInfo::BreakPointInfoVerify() {
1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsBreakPointInfo());
1048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(break_point_objects());
1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // VERIFY_HEAP
1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::IncrementSpillStatistics(SpillInformation* info) {
1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  info->number_of_objects_++;
1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Named properties
1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (HasFastProperties()) {
1058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    info->number_of_objects_with_fast_properties_++;
1059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    info->number_of_fast_used_fields_   += map()->NextFreePropertyIndex();
1060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    info->number_of_fast_unused_fields_ += map()->unused_property_fields();
1061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (IsJSGlobalObject()) {
1062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    GlobalDictionary* dict = global_dictionary();
1063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    info->number_of_slow_used_properties_ += dict->NumberOfElements();
1064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    info->number_of_slow_unused_properties_ +=
1065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        dict->Capacity() - dict->NumberOfElements();
1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    NameDictionary* dict = property_dictionary();
1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    info->number_of_slow_used_properties_ += dict->NumberOfElements();
1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    info->number_of_slow_unused_properties_ +=
1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        dict->Capacity() - dict->NumberOfElements();
1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Indexed properties
1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (GetElementsKind()) {
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FAST_HOLEY_SMI_ELEMENTS:
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FAST_SMI_ELEMENTS:
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FAST_HOLEY_DOUBLE_ELEMENTS:
1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FAST_DOUBLE_ELEMENTS:
1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FAST_HOLEY_ELEMENTS:
1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case FAST_ELEMENTS: {
1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_objects_with_fast_elements_++;
1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int holes = 0;
1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      FixedArray* e = FixedArray::cast(elements());
1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int len = e->length();
1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Heap* heap = GetHeap();
1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      for (int i = 0; i < len; i++) {
108644f0eee88ff00398ff7f715fab053374d808c90dSteve Block        if (e->get(i) == heap->the_hole_value()) holes++;
1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_fast_used_elements_   += len - holes;
1089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_fast_unused_elements_ += holes;
1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size)                       \
1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case TYPE##_ELEMENTS:
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TYPED_ARRAYS(TYPED_ARRAY_CASE)
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef TYPED_ARRAY_CASE
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    { info->number_of_objects_with_fast_elements_++;
1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FixedArrayBase* e = FixedArrayBase::cast(elements());
1100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_fast_used_elements_ += e->length();
1101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case DICTIONARY_ELEMENTS: {
1104c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch      SeededNumberDictionary* dict = element_dictionary();
1105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_slow_used_elements_ += dict->NumberOfElements();
1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_slow_unused_elements_ +=
1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          dict->Capacity() - dict->NumberOfElements();
1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FAST_SLOPPY_ARGUMENTS_ELEMENTS:
1111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case SLOW_SLOPPY_ARGUMENTS_ELEMENTS:
1112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::SpillInformation::Clear() {
1118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_objects_ = 0;
1119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_objects_with_fast_properties_ = 0;
1120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_objects_with_fast_elements_ = 0;
1121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_fast_used_fields_ = 0;
1122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_fast_unused_fields_ = 0;
1123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_slow_used_properties_ = 0;
1124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_slow_unused_properties_ = 0;
1125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_fast_used_elements_ = 0;
1126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_fast_unused_elements_ = 0;
1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_slow_used_elements_ = 0;
1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_slow_unused_elements_ = 0;
1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::SpillInformation::Print() {
1133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("\n  JSObject Spill Statistics (#%d):\n", number_of_objects_);
1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("    - fast properties (#%d): %d (used) %d (unused)\n",
1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_objects_with_fast_properties_,
1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_fast_used_fields_, number_of_fast_unused_fields_);
1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("    - slow properties (#%d): %d (used) %d (unused)\n",
1140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_objects_ - number_of_objects_with_fast_properties_,
1141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_slow_used_properties_, number_of_slow_unused_properties_);
1142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("    - fast elements (#%d): %d (used) %d (unused)\n",
1144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_objects_with_fast_elements_,
1145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_fast_used_elements_, number_of_fast_unused_elements_);
1146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("    - slow elements (#%d): %d (used) %d (unused)\n",
1148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_objects_ - number_of_objects_with_fast_elements_,
1149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_slow_used_elements_, number_of_slow_unused_elements_);
1150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("\n");
1152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool DescriptorArray::IsSortedNoDuplicates(int valid_entries) {
1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (valid_entries == -1) valid_entries = number_of_descriptors();
1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Name* current_key = NULL;
1158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t current = 0;
1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < number_of_descriptors(); i++) {
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Name* key = GetSortedKey(i);
1161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (key == current_key) {
1162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Print();
1163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return false;
1164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    current_key = key;
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint32_t hash = GetSortedKey(i)->Hash();
1167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (hash < current) {
1168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Print();
1169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return false;
1170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    current = hash;
1172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TransitionArray::IsSortedNoDuplicates(int valid_entries) {
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(valid_entries == -1);
1179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Name* prev_key = NULL;
1180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyKind prev_kind = kData;
1181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PropertyAttributes prev_attributes = NONE;
1182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  uint32_t prev_hash = 0;
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < number_of_transitions(); i++) {
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Name* key = GetSortedKey(i);
1185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    uint32_t hash = key->Hash();
1186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PropertyKind kind = kData;
1187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    PropertyAttributes attributes = NONE;
1188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (!IsSpecialTransition(key)) {
1189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Map* target = GetTarget(i);
1190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      PropertyDetails details = GetTargetDetails(key, target);
1191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      kind = details.kind();
1192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      attributes = details.attributes();
1193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    } else {
1194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // Duplicate entries are not allowed for non-property transitions.
1195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      CHECK_NE(prev_key, key);
11966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }
1197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int cmp = CompareKeys(prev_key, prev_hash, prev_kind, prev_attributes, key,
1199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                          hash, kind, attributes);
1200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (cmp >= 0) {
1201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Print();
1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
12036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }
1204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    prev_key = key;
1205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    prev_hash = hash;
1206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    prev_attributes = attributes;
1207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    prev_kind = kind;
12086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
12106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
12116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
12126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool TransitionArray::IsSortedNoDuplicates(Map* map) {
1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* raw_transitions = map->raw_transitions();
1216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (IsFullTransitionArray(raw_transitions)) {
1217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return TransitionArray::cast(raw_transitions)->IsSortedNoDuplicates();
1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Simple and non-existent transitions are always sorted.
1220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return true;
1221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic bool CheckOneBackPointer(Map* current_map, Object* target) {
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return !target->IsMap() || Map::cast(target)->GetBackPointer() == current_map;
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool TransitionArray::IsConsistentWithBackPointers(Map* map) {
1231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* transitions = map->raw_transitions();
1232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; i < TransitionArray::NumberOfTransitions(transitions); ++i) {
1233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map* target = TransitionArray::GetTarget(transitions, i);
1234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!CheckOneBackPointer(map, target)) return false;
123580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
123780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
123880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
123980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
1240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Estimates if there is a path from the object to a context.
1241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// This function is not precise, and can return false even if
1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// there is a path to a context.
1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool CanLeak(Object* obj, Heap* heap, bool skip_weak_cell) {
1244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!obj->IsHeapObject()) return false;
1245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (obj->IsWeakCell()) {
1246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (skip_weak_cell) return false;
1247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return CanLeak(WeakCell::cast(obj)->value(), heap, skip_weak_cell);
1248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (obj->IsCell()) {
1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return CanLeak(Cell::cast(obj)->value(), heap, skip_weak_cell);
1251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (obj->IsPropertyCell()) {
1253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return CanLeak(PropertyCell::cast(obj)->value(), heap, skip_weak_cell);
1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (obj->IsContext()) return true;
1256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (obj->IsMap()) {
1257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Map* map = Map::cast(obj);
1258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int i = 0; i < Heap::kStrongRootListLength; i++) {
1259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Heap::RootListIndex root_index = static_cast<Heap::RootListIndex>(i);
1260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (map == heap->root(root_index)) return false;
1261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return true;
1263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CanLeak(HeapObject::cast(obj)->map(), heap, skip_weak_cell);
1265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Code::VerifyEmbeddedObjects(VerifyMode mode) {
1269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (kind() == OPTIMIZED_FUNCTION) return;
1270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Heap* heap = GetIsolate()->heap();
1271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
1272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch             RelocInfo::ModeMask(RelocInfo::CELL);
1273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool skip_weak_cell = (mode == kNoContextSpecificPointers) ? false : true;
1274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (RelocIterator it(this, mask); !it.done(); it.next()) {
1275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Object* target = it.rinfo()->rmode() == RelocInfo::CELL
1276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         ? it.rinfo()->target_cell()
1277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         : it.rinfo()->target_object();
1278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!CanLeak(target, heap, skip_weak_cell));
1279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Verify that the debugger can redirect old code to the new code.
1284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Code::VerifyRecompiledCode(Code* old_code, Code* new_code) {
1285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (old_code->kind() != FUNCTION) return;
1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (new_code->kind() != FUNCTION) return;
1287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate* isolate = old_code->GetIsolate();
1288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Do not verify during bootstrapping. We may replace code using %SetCode.
1289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (isolate->bootstrapper()->IsActive()) return;
1290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int mask = RelocInfo::kCodeTargetMask;
1292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RelocIterator old_it(old_code, mask);
1293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RelocIterator new_it(new_code, mask);
1294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Code* stack_check = isolate->builtins()->builtin(Builtins::kStackCheck);
1295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (!old_it.done()) {
1297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RelocInfo* rinfo = old_it.rinfo();
1298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
1299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!target->is_handler() && !target->is_inline_cache_stub());
1300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (target == stack_check) break;
1301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    old_it.next();
1302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (!new_it.done()) {
1305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RelocInfo* rinfo = new_it.rinfo();
1306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
1307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK(!target->is_handler() && !target->is_inline_cache_stub());
1308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (target == stack_check) break;
1309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    new_it.next();
1310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Either both are done because there is no stack check.
1313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Or we are past the prologue for both.
1314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(new_it.done(), old_it.done());
1315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // After the prologue, each call in the old code has a corresponding call
1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // in the new code.
1318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (!old_it.done() && !new_it.done()) {
1319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Code* old_target =
1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Code::GetCodeFromTargetAddress(old_it.rinfo()->target_address());
1321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Code* new_target =
1322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Code::GetCodeFromTargetAddress(new_it.rinfo()->target_address());
1323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CHECK_EQ(old_target->kind(), new_target->kind());
1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Check call target for equality unless it's an IC or an interrupt check.
1325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // In both cases they may be patched to be something else.
1326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!old_target->is_handler() && !old_target->is_inline_cache_stub() &&
1327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        new_target != isolate->builtins()->builtin(Builtins::kInterruptCheck)) {
1328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK_EQ(old_target, new_target);
1329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    old_it.next();
1331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    new_it.next();
1332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Both are done at the same time.
1335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_EQ(new_it.done(), old_it.done());
1336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // DEBUG
1340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
1342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
1343