objects-debug.cc revision 958fae7ec3f466955f8e5b50fa5b8d38b9e91675
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
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/disasm.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/disassembler.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/heap/objects-visiting.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/jsregexp.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/macro-assembler.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ostreams.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  }
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Object::VerifyPointer(Object* p) {
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (p->IsHeapObject()) {
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    HeapObject::VerifyHeapPointer(p);
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(p->IsSmi());
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Smi::SmiVerify() {
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsSmi());
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::HeapObjectVerify() {
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InstanceType instance_type = map()->instance_type();
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (instance_type < FIRST_NONSTRING_TYPE) {
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    String::cast(this)->StringVerify();
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return;
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // TODO(yangguo): Use this check once crbug/436911 has been fixed.
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  //  DCHECK(!NeedsToEnsureDoubleAlignment() ||
52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  //         IsAligned(OffsetFrom(address()), kDoubleAlignment));
53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (instance_type) {
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case SYMBOL_TYPE:
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Symbol::cast(this)->SymbolVerify();
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case MAP_TYPE:
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Map::cast(this)->MapVerify();
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case HEAP_NUMBER_TYPE:
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case MUTABLE_HEAP_NUMBER_TYPE:
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      HeapNumber::cast(this)->HeapNumberVerify();
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case FIXED_ARRAY_TYPE:
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      FixedArray::cast(this)->FixedArrayVerify();
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    case FIXED_DOUBLE_ARRAY_TYPE:
693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      FixedDoubleArray::cast(this)->FixedDoubleArrayVerify();
703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      break;
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case CONSTANT_POOL_ARRAY_TYPE:
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ConstantPoolArray::cast(this)->ConstantPoolArrayVerify();
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case BYTE_ARRAY_TYPE:
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      ByteArray::cast(this)->ByteArrayVerify();
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case FREE_SPACE_TYPE:
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      FreeSpace::cast(this)->FreeSpaceVerify();
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      break;
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define VERIFY_TYPED_ARRAY(Type, type, TYPE, ctype, size)                      \
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case EXTERNAL_##TYPE##_ARRAY_TYPE:                                         \
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      External##Type##Array::cast(this)->External##Type##ArrayVerify();        \
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;                                                                   \
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FIXED_##TYPE##_ARRAY_TYPE:                                            \
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Fixed##Type##Array::cast(this)->FixedTypedArrayVerify();                 \
87257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      break;
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TYPED_ARRAYS(VERIFY_TYPED_ARRAY)
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef VERIFY_TYPED_ARRAY
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case CODE_TYPE:
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Code::cast(this)->CodeVerify();
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case ODDBALL_TYPE:
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Oddball::cast(this)->OddballVerify();
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_OBJECT_TYPE:
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSObject::cast(this)->JSObjectVerify();
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_GENERATOR_OBJECT_TYPE:
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSGeneratorObject::cast(this)->JSGeneratorObjectVerify();
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_MODULE_TYPE:
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSModule::cast(this)->JSModuleVerify();
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_VALUE_TYPE:
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSValue::cast(this)->JSValueVerify();
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case JS_DATE_TYPE:
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      JSDate::cast(this)->JSDateVerify();
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      break;
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_FUNCTION_TYPE:
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSFunction::cast(this)->JSFunctionVerify();
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_GLOBAL_PROXY_TYPE:
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSGlobalProxy::cast(this)->JSGlobalProxyVerify();
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_GLOBAL_OBJECT_TYPE:
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSGlobalObject::cast(this)->JSGlobalObjectVerify();
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_BUILTINS_OBJECT_TYPE:
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSBuiltinsObject::cast(this)->JSBuiltinsObjectVerify();
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case CELL_TYPE:
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cell::cast(this)->CellVerify();
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case PROPERTY_CELL_TYPE:
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      PropertyCell::cast(this)->PropertyCellVerify();
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case WEAK_CELL_TYPE:
133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      WeakCell::cast(this)->WeakCellVerify();
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_ARRAY_TYPE:
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSArray::cast(this)->JSArrayVerify();
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case JS_SET_TYPE:
1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      JSSet::cast(this)->JSSetVerify();
1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      break;
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case JS_MAP_TYPE:
1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      JSMap::cast(this)->JSMapVerify();
1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      break;
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_SET_ITERATOR_TYPE:
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSSetIterator::cast(this)->JSSetIteratorVerify();
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_MAP_ITERATOR_TYPE:
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSMapIterator::cast(this)->JSMapIteratorVerify();
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
15069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case JS_WEAK_MAP_TYPE:
15169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      JSWeakMap::cast(this)->JSWeakMapVerify();
15269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      break;
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_WEAK_SET_TYPE:
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSWeakSet::cast(this)->JSWeakSetVerify();
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_REGEXP_TYPE:
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      JSRegExp::cast(this)->JSRegExpVerify();
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case FILLER_TYPE:
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
161257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    case JS_PROXY_TYPE:
162257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      JSProxy::cast(this)->JSProxyVerify();
163257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      break;
164589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case JS_FUNCTION_PROXY_TYPE:
165589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      JSFunctionProxy::cast(this)->JSFunctionProxyVerify();
166589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      break;
167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    case FOREIGN_TYPE:
168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      Foreign::cast(this)->ForeignVerify();
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case SHARED_FUNCTION_INFO_TYPE:
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      SharedFunctionInfo::cast(this)->SharedFunctionInfoVerify();
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case JS_MESSAGE_OBJECT_TYPE:
1741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      JSMessageObject::cast(this)->JSMessageObjectVerify();
1751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      break;
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_ARRAY_BUFFER_TYPE:
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSArrayBuffer::cast(this)->JSArrayBufferVerify();
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_TYPED_ARRAY_TYPE:
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSTypedArray::cast(this)->JSTypedArrayVerify();
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_DATA_VIEW_TYPE:
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      JSDataView::cast(this)->JSDataViewVerify();
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_CASE(NAME, Name, name) \
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  case NAME##_TYPE:                        \
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Name::cast(this)->Name##Verify();      \
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    break;
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    STRUCT_LIST(MAKE_STRUCT_CASE)
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_CASE
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      UNREACHABLE();
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::VerifyHeapPointer(Object* p) {
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(p->IsHeapObject());
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HeapObject* ho = HeapObject::cast(p);
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(ho->GetHeap()->Contains(ho));
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Symbol::SymbolVerify() {
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsSymbol());
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(HasHashCode());
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_GT(Hash(), 0);
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(name()->IsUndefined() || name()->IsString());
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(flags()->IsSmi());
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HeapNumber::HeapNumberVerify() {
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsHeapNumber() || IsMutableHeapNumber());
2183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
2193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ByteArray::ByteArrayVerify() {
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsByteArray());
2233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
2243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid FreeSpace::FreeSpaceVerify() {
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsFreeSpace());
2283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
2293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define EXTERNAL_ARRAY_VERIFY(Type, type, TYPE, ctype, size)                  \
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void External##Type##Array::External##Type##ArrayVerify() {                 \
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(IsExternal##Type##Array());                                         \
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTYPED_ARRAYS(EXTERNAL_ARRAY_VERIFY)
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef EXTERNAL_ARRAY_VERIFY
2383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits>
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid FixedTypedArray<Traits>::FixedTypedArrayVerify() {
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsHeapObject() &&
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HeapObject::cast(this)->map()->instance_type() ==
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Traits::kInstanceType);
2453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
2463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSObject::ElementsAreSafeToExamine() {
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If a GC was caused while constructing this object, the elements
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // pointer may point to a one pointer filler map.
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<Map*>(elements()) !=
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      GetHeap()->one_pointer_filler_map();
253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
254257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
255257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::JSObjectVerify() {
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyHeapPointer(properties());
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyHeapPointer(elements());
2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS) {
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this->elements()->IsFixedArray());
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_GE(this->elements()->length(), 2);
2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (HasFastProperties()) {
266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int actual_unused_property_fields = map()->inobject_properties() +
267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                        properties()->length() -
268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                        map()->NextFreePropertyIndex();
269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (map()->unused_property_fields() != actual_unused_property_fields) {
270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // This could actually happen in the middle of StoreTransitionStub
271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // when the new extended backing store is already set into the object and
272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // the allocation of the MutableHeapNumber triggers GC (in this case map
273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // is not updated yet).
274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      CHECK_EQ(map()->unused_property_fields(),
275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier               actual_unused_property_fields - JSObject::kFieldsAdded);
276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DescriptorArray* descriptors = map()->instance_descriptors();
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < map()->NumberOfOwnDescriptors(); i++) {
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (descriptors->GetDetails(i).type() == FIELD) {
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Representation r = descriptors->GetDetails(i).representation();
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FieldIndex index = FieldIndex::ForDescriptor(map(), i);
282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        if (IsUnboxedDoubleField(index)) {
283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          DCHECK(r.IsDouble());
284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          continue;
285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Object* value = RawFastPropertyAt(index);
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (r.IsDouble()) DCHECK(value->IsMutableHeapNumber());
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (value->IsUninitialized()) continue;
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (r.IsSmi()) DCHECK(value->IsSmi());
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (r.IsHeapObject()) DCHECK(value->IsHeapObject());
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HeapType* field_type = descriptors->GetFieldType(i);
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (r.IsNone()) {
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK(field_type->Is(HeapType::None()));
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        } else if (!HeapType::Any()->Is(field_type)) {
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          CHECK(!field_type->NowStable() || field_type->NowContains(value));
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If a GC was caused while constructing this object, the elements
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // pointer may point to a one pointer filler map.
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (ElementsAreSafeToExamine()) {
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ((map()->has_fast_smi_or_object_elements() ||
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              (elements() == GetHeap()->empty_fixed_array())),
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             (elements()->map() == GetHeap()->fixed_array_map() ||
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              elements()->map() == GetHeap()->fixed_cow_array_map()));
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(map()->has_fast_object_elements() == HasFastObjectElements());
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::MapVerify() {
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap* heap = GetHeap();
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(!heap->InNewSpace(this));
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE);
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(instance_size() == kVariableSizeSentinel ||
318791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block         (kPointerSize <= instance_size() &&
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          instance_size() < heap->Capacity()));
320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyHeapPointer(prototype());
321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyHeapPointer(instance_descriptors());
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SLOW_DCHECK(instance_descriptors()->IsSortedNoDuplicates());
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (HasTransitionArray()) {
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SLOW_DCHECK(transitions()->IsSortedNoDuplicates());
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SLOW_DCHECK(transitions()->IsConsistentWithBackPointers(this));
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SLOW_DCHECK(!FLAG_unbox_double_fields ||
328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              layout_descriptor()->IsConsistentWithMap(this));
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::DictionaryMapVerify() {
33380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  MapVerify();
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(is_dictionary_map());
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(instance_descriptors()->IsEmpty());
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, pre_allocated_property_fields());
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, unused_property_fields());
338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CHECK_EQ(StaticVisitorBase::GetVisitorId(this), visitor_id());
33980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
34080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
34180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::VerifyOmittedMapChecks() {
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!FLAG_omit_map_checks_for_leaf_maps) return;
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!is_stable() ||
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      is_deprecated() ||
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HasTransitionArray() ||
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      is_dictionary_map()) {
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_EQ(0, dependent_code()->number_of_entries(
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DependentCode::kPrototypeCheckGroup));
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3546ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid CodeCache::CodeCacheVerify() {
3556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  VerifyHeapPointer(default_cache());
3566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  VerifyHeapPointer(normal_type_cache());
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(default_cache()->IsFixedArray());
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(normal_type_cache()->IsUndefined()
3596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block         || normal_type_cache()->IsCodeCacheHashTable());
3606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid PolymorphicCodeCache::PolymorphicCodeCacheVerify() {
3643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  VerifyHeapPointer(cache());
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(cache()->IsUndefined() || cache()->IsPolymorphicCodeCacheHashTable());
3663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
3673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid TypeFeedbackInfo::TypeFeedbackInfoVerify() {
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kStorage1Offset);
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kStorage2Offset);
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kStorage3Offset);
3733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid AliasedArgumentsEntry::AliasedArgumentsEntryVerify() {
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VerifySmiField(kAliasedContextSlot);
3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::FixedArrayVerify() {
382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < length(); i++) {
383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Object* e = get(i);
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    VerifyPointer(e);
385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid FixedDoubleArray::FixedDoubleArrayVerify() {
3903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (int i = 0; i < length(); i++) {
3913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (!is_the_hole(i)) {
39269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      double value = get_scalar(i);
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(!std::isnan(value) ||
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            (bit_cast<uint64_t>(value) ==
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             bit_cast<uint64_t>(canonical_not_the_hole_nan_as_double())) ||
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            ((bit_cast<uint64_t>(value) & Double::kSignMask) != 0));
3973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
3983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
3993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
4003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ConstantPoolArray::ConstantPoolArrayVerify() {
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsConstantPoolArray());
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConstantPoolArray::Iterator code_iter(this, ConstantPoolArray::CODE_PTR);
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (!code_iter.is_finished()) {
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Address code_entry = get_code_ptr_entry(code_iter.next_index());
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    VerifyPointer(Code::GetCodeFromTargetAddress(code_entry));
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConstantPoolArray::Iterator heap_iter(this, ConstantPoolArray::HEAP_PTR);
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (!heap_iter.is_finished()) {
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    VerifyObjectField(OffsetOfElementAt(heap_iter.next_index()));
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSGeneratorObject::JSGeneratorObjectVerify() {
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // In an expression like "new g()", there can be a point where a generator
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // object is allocated but its fields are all undefined, as it hasn't yet been
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // initialized by the generator.  Hence these weak checks.
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kFunctionOffset);
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kContextOffset);
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kReceiverOffset);
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kOperandStackOffset);
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kContinuationOffset);
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kStackHandlerIndexOffset);
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSModule::JSModuleVerify() {
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kContextOffset);
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kScopeInfoOffset);
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(context()->IsUndefined() ||
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Context::cast(context())->IsModuleContext());
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSValue::JSValueVerify() {
438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* v = value();
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (v->IsHeapObject()) {
440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    VerifyHeapPointer(v);
441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSDate::JSDateVerify() {
4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (value()->IsHeapObject()) {
4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    VerifyHeapPointer(value());
4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(value()->IsUndefined() || value()->IsSmi() || value()->IsHeapNumber());
4503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(year()->IsUndefined() || year()->IsSmi() || year()->IsNaN());
4513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(month()->IsUndefined() || month()->IsSmi() || month()->IsNaN());
4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(day()->IsUndefined() || day()->IsSmi() || day()->IsNaN());
4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(weekday()->IsUndefined() || weekday()->IsSmi() || weekday()->IsNaN());
4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(hour()->IsUndefined() || hour()->IsSmi() || hour()->IsNaN());
4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(min()->IsUndefined() || min()->IsSmi() || min()->IsNaN());
4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(sec()->IsUndefined() || sec()->IsSmi() || sec()->IsNaN());
4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(cache_stamp()->IsUndefined() ||
4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        cache_stamp()->IsSmi() ||
4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        cache_stamp()->IsNaN());
4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (month()->IsSmi()) {
4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int month = Smi::cast(this->month())->value();
4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(0 <= month && month <= 11);
4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (day()->IsSmi()) {
4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int day = Smi::cast(this->day())->value();
4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(1 <= day && day <= 31);
4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (hour()->IsSmi()) {
4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int hour = Smi::cast(this->hour())->value();
4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(0 <= hour && hour <= 23);
4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (min()->IsSmi()) {
4743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int min = Smi::cast(this->min())->value();
4753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(0 <= min && min <= 59);
4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (sec()->IsSmi()) {
4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int sec = Smi::cast(this->sec())->value();
4793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(0 <= sec && sec <= 59);
4803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (weekday()->IsSmi()) {
4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int weekday = Smi::cast(this->weekday())->value();
4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(0 <= weekday && weekday <= 6);
4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (cache_stamp()->IsSmi()) {
4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(Smi::cast(cache_stamp())->value() <=
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Smi::cast(GetIsolate()->date_cache()->stamp())->value());
4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid JSMessageObject::JSMessageObjectVerify() {
4931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  CHECK(IsJSMessageObject());
4941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  CHECK(type()->IsString());
4951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  CHECK(arguments()->IsJSArray());
4961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  VerifyObjectField(kStartPositionOffset);
4971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  VerifyObjectField(kEndPositionOffset);
4981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  VerifyObjectField(kArgumentsOffset);
4991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  VerifyObjectField(kScriptOffset);
5001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  VerifyObjectField(kStackFramesOffset);
5011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
5021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid String::StringVerify() {
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsString());
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(length() >= 0 && length() <= Smi::kMaxValue);
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsInternalizedString()) {
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(!GetHeap()->InNewSpace(this));
509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
51069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (IsConsString()) {
51169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    ConsString::cast(this)->ConsStringVerify();
51269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  } else if (IsSlicedString()) {
51369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SlicedString::cast(this)->SlicedStringVerify();
51469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
51569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
51669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
51769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
51869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid ConsString::ConsStringVerify() {
51969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(this->first()->IsString());
52069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(this->second() == GetHeap()->empty_string() ||
52169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        this->second()->IsString());
5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(this->length() >= ConsString::kMinLength);
523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(this->length() == this->first()->length() + this->second()->length());
52469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (this->IsFlat()) {
52569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // A flat cons can only be created by String::SlowTryFlatten.
52669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Afterwards, the first part may be externalized.
52769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    CHECK(this->first()->IsSeqString() || this->first()->IsExternalString());
52869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
52969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
53069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
53169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
53269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid SlicedString::SlicedStringVerify() {
53369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(!this->parent()->IsConsString());
53469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(!this->parent()->IsSlicedString());
53569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(this->length() >= SlicedString::kMinLength);
536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::JSFunctionVerify() {
540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsJSFunction());
541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kPrototypeOrInitialMapOffset);
542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  VerifyObjectField(kNextFunctionLinkOffset);
5433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(code()->IsCode());
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(next_function_link() == NULL ||
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        next_function_link()->IsUndefined() ||
546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        next_function_link()->IsJSFunction());
547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::SharedFunctionInfoVerify() {
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsSharedFunctionInfo());
552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kNameOffset);
553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kCodeOffset);
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kOptimizedCodeMapOffset);
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kFeedbackVectorOffset);
5563bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  VerifyObjectField(kScopeInfoOffset);
557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kInstanceClassNameOffset);
5586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  VerifyObjectField(kFunctionDataOffset);
559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kScriptOffset);
560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kDebugInfoOffset);
561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSGlobalProxy::JSGlobalProxyVerify() {
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsJSGlobalProxy());
566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSObjectVerify();
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(JSGlobalProxy::kNativeContextOffset);
568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Make sure that this object has no properties, elements.
569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0, properties()->length());
570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CHECK_EQ(FAST_HOLEY_SMI_ELEMENTS, GetElementsKind());
5717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  CHECK_EQ(0, FixedArray::cast(elements())->length());
572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSGlobalObject::JSGlobalObjectVerify() {
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsJSGlobalObject());
577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSObjectVerify();
578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = GlobalObject::kBuiltinsOffset;
579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       i < JSGlobalObject::kSize;
580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       i += kPointerSize) {
581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    VerifyObjectField(i);
582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSBuiltinsObject::JSBuiltinsObjectVerify() {
587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsJSBuiltinsObject());
588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSObjectVerify();
589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = GlobalObject::kBuiltinsOffset;
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       i < JSBuiltinsObject::kSize;
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       i += kPointerSize) {
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    VerifyObjectField(i);
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Oddball::OddballVerify() {
598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsOddball());
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap* heap = GetHeap();
600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyHeapPointer(to_string());
601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* number = to_number();
602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (number->IsHeapObject()) {
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(number == heap->nan_value());
604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(number->IsSmi());
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int value = Smi::cast(number)->value();
607592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    // Hidden oddballs have negative smis.
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const int kLeastHiddenOddballNumber = -5;
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK_LE(value, 1);
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(value >= kLeastHiddenOddballNumber);
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (map() == heap->undefined_map()) {
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->undefined_value());
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->the_hole_map()) {
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->the_hole_value());
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->null_map()) {
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->null_value());
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->boolean_map()) {
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->true_value() ||
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          this == heap->false_value());
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->uninitialized_map()) {
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->uninitialized_value());
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->no_interceptor_result_sentinel_map()) {
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->no_interceptor_result_sentinel());
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->arguments_marker_map()) {
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->arguments_marker());
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->termination_exception_map()) {
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->termination_exception());
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (map() == heap->exception_map()) {
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(this == heap->exception());
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    UNREACHABLE();
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Cell::CellVerify() {
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsCell());
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kValueOffset);
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PropertyCell::PropertyCellVerify() {
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsPropertyCell());
645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyObjectField(kValueOffset);
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyObjectField(kTypeOffset);
647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid WeakCell::WeakCellVerify() {
651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CHECK(IsWeakCell());
652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  VerifyObjectField(kValueOffset);
653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  VerifyObjectField(kNextOffset);
654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Code::CodeVerify() {
658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()),
6590d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                  kCodeAlignment));
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  relocation_info()->ObjectVerify();
661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Address last_gc_pc = NULL;
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = GetIsolate();
663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (RelocIterator it(this); !it.done(); it.next()) {
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    it.rinfo()->Verify(isolate);
665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Ensure that GC will not iterate twice over the same pointer.
666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) {
667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      CHECK(it.rinfo()->pc() != last_gc_pc);
668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      last_gc_pc = it.rinfo()->pc();
669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(raw_type_feedback_info() == Smi::FromInt(0) ||
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        raw_type_feedback_info()->IsSmi() == IsCodeStubOrIC());
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::VerifyEmbeddedObjectsDependency() {
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!CanContainWeakObjects()) return;
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DisallowHeapAllocation no_gc;
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate = GetIsolate();
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScope scope(isolate);
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int mode_mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (RelocIterator it(this, mode_mask); !it.done(); it.next()) {
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Object* obj = it.rinfo()->target_object();
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IsWeakObject(obj)) {
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (obj->IsMap()) {
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Map* map = Map::cast(obj);
687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        CHECK(map->dependent_code()->Contains(DependentCode::kWeakCodeGroup,
688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                              this));
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (obj->IsJSObject()) {
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Object* raw_table = GetIsolate()->heap()->weak_object_to_code_table();
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        WeakHashTable* table = WeakHashTable::cast(raw_table);
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<Object> key_obj(obj, isolate);
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK(DependentCode::cast(table->Lookup(key_obj))->Contains(
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            DependentCode::kWeakCodeGroup, this));
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSArray::JSArrayVerify() {
702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSObjectVerify();
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(length()->IsNumber() || length()->IsUndefined());
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If a GC was caused while constructing this array, the elements
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // pointer may point to a one pointer filler map.
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (ElementsAreSafeToExamine()) {
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CHECK(elements()->IsUndefined() ||
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          elements()->IsFixedArray() ||
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          elements()->IsFixedDoubleArray());
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSSet::JSSetVerify() {
7153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(IsJSSet());
7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  JSObjectVerify();
7173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VerifyHeapPointer(table());
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsOrderedHashTable() || table()->IsUndefined());
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(arv): Verify OrderedHashTable too.
7203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSMap::JSMapVerify() {
7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(IsJSMap());
7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  JSObjectVerify();
7263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VerifyHeapPointer(table());
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsOrderedHashTable() || table()->IsUndefined());
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(arv): Verify OrderedHashTable too.
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSSetIterator::JSSetIteratorVerify() {
733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSSetIterator());
734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObjectVerify();
735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyHeapPointer(table());
736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsOrderedHashTable() || table()->IsUndefined());
737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(index()->IsSmi() || index()->IsUndefined());
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(kind()->IsSmi() || kind()->IsUndefined());
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSMapIterator::JSMapIteratorVerify() {
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSMapIterator());
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObjectVerify();
745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyHeapPointer(table());
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsOrderedHashTable() || table()->IsUndefined());
747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(index()->IsSmi() || index()->IsUndefined());
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(kind()->IsSmi() || kind()->IsUndefined());
7493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
75269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid JSWeakMap::JSWeakMapVerify() {
75369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  CHECK(IsJSWeakMap());
75469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  JSObjectVerify();
75569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  VerifyHeapPointer(table());
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsHashTable() || table()->IsUndefined());
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSWeakSet::JSWeakSetVerify() {
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSWeakSet());
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObjectVerify();
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyHeapPointer(table());
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(table()->IsHashTable() || table()->IsUndefined());
76569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
76669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
76769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSRegExp::JSRegExpVerify() {
769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSObjectVerify();
770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(data()->IsUndefined() || data()->IsFixedArray());
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (TypeTag()) {
772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JSRegExp::ATOM: {
773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      FixedArray* arr = FixedArray::cast(data());
774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(arr->get(JSRegExp::kAtomPatternIndex)->IsString());
775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JSRegExp::IRREGEXP: {
778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      bool is_native = RegExpImpl::UsesNativeRegExp();
779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      FixedArray* arr = FixedArray::cast(data());
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Object* one_byte_data = arr->get(JSRegExp::kIrregexpLatin1CodeIndex);
782257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      // Smi : Not compiled yet (-1) or code prepared for flushing.
783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // JSObject: Compilation error.
784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Code/ByteArray: Compiled code.
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          one_byte_data->IsSmi() ||
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (is_native ? one_byte_data->IsCode() : one_byte_data->IsByteArray()));
788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Object* uc16_data = arr->get(JSRegExp::kIrregexpUC16CodeIndex);
789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(uc16_data->IsSmi() ||
790257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch             (is_native ? uc16_data->IsCode() : uc16_data->IsByteArray()));
791257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Object* one_byte_saved =
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          arr->get(JSRegExp::kIrregexpLatin1CodeSavedIndex);
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(one_byte_saved->IsSmi() || one_byte_saved->IsString() ||
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            one_byte_saved->IsCode());
796257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      Object* uc16_saved = arr->get(JSRegExp::kIrregexpUC16CodeSavedIndex);
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(uc16_saved->IsSmi() || uc16_saved->IsString() ||
798257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch             uc16_saved->IsCode());
799257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(arr->get(JSRegExp::kIrregexpCaptureCountIndex)->IsSmi());
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(arr->get(JSRegExp::kIrregexpMaxRegisterCountIndex)->IsSmi());
802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK_EQ(JSRegExp::NOT_COMPILED, TypeTag());
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(data()->IsUndefined());
807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
812257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid JSProxy::JSProxyVerify() {
8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(IsJSProxy());
814257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  VerifyPointer(handler());
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(hash()->IsSmi() || hash()->IsUndefined());
816257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
817257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
818589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
819589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid JSFunctionProxy::JSFunctionProxyVerify() {
8203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(IsJSFunctionProxy());
821589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  JSProxyVerify();
822589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  VerifyPointer(call_trap());
823589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  VerifyPointer(construct_trap());
824589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
825589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
826589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSArrayBuffer::JSArrayBufferVerify() {
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSArrayBuffer());
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObjectVerify();
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(byte_length());
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(byte_length()->IsSmi() || byte_length()->IsHeapNumber()
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        || byte_length()->IsUndefined());
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSArrayBufferView::JSArrayBufferViewVerify() {
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSArrayBufferView());
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObjectVerify();
839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(buffer());
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(buffer()->IsJSArrayBuffer() || buffer()->IsUndefined()
841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        || buffer() == Smi::FromInt(0));
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(byte_offset());
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(byte_offset()->IsSmi() || byte_offset()->IsHeapNumber()
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        || byte_offset()->IsUndefined());
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(byte_length());
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(byte_length()->IsSmi() || byte_length()->IsHeapNumber()
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        || byte_length()->IsUndefined());
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSTypedArray::JSTypedArrayVerify() {
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSTypedArray());
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSArrayBufferViewVerify();
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(length());
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(length()->IsSmi() || length()->IsHeapNumber()
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        || length()->IsUndefined());
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(elements());
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSDataView::JSDataViewVerify() {
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsJSDataView());
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSArrayBufferViewVerify();
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
870257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Foreign::ForeignVerify() {
871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsForeign());
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Box::BoxVerify() {
876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsBox());
877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->ObjectVerify();
878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::AccessorInfoVerify() {
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(name());
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(flag());
884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(expected_receiver_type());
885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ExecutableAccessorInfo::ExecutableAccessorInfoVerify() {
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsExecutableAccessorInfo());
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AccessorInfoVerify();
891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(getter());
892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(setter());
893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(data());
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DeclaredAccessorDescriptor::DeclaredAccessorDescriptorVerify() {
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsDeclaredAccessorDescriptor());
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(serialized_data());
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DeclaredAccessorInfo::DeclaredAccessorInfoVerify() {
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsDeclaredAccessorInfo());
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AccessorInfoVerify();
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(descriptor());
907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid AccessorPair::AccessorPairVerify() {
9113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CHECK(IsAccessorPair());
9123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VerifyPointer(getter());
9133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VerifyPointer(setter());
9143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessCheckInfo::AccessCheckInfoVerify() {
918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsAccessCheckInfo());
919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(named_callback());
920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(indexed_callback());
921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(data());
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid InterceptorInfo::InterceptorInfoVerify() {
926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsInterceptorInfo());
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(getter());
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(setter());
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(query());
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(deleter());
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(enumerator());
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(data());
933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  VerifySmiField(kFlagsOffset);
934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid CallHandlerInfo::CallHandlerInfoVerify() {
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsCallHandlerInfo());
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(callback());
940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(data());
941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid TemplateInfo::TemplateInfoVerify() {
945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(tag());
946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(property_list());
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyPointer(property_accessors());
948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FunctionTemplateInfo::FunctionTemplateInfoVerify() {
952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsFunctionTemplateInfo());
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  TemplateInfoVerify();
954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(serial_number());
955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(call_code());
956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(prototype_template());
957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(parent_template());
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(named_property_handler());
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(indexed_property_handler());
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(instance_template());
961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(signature());
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(access_check_info());
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ObjectTemplateInfo::ObjectTemplateInfoVerify() {
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsObjectTemplateInfo());
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  TemplateInfoVerify();
969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(constructor());
970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(internal_field_count());
971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SignatureInfo::SignatureInfoVerify() {
975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsSignatureInfo());
976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(receiver());
977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(args());
978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid TypeSwitchInfo::TypeSwitchInfoVerify() {
982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsTypeSwitchInfo());
983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(types());
984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid AllocationSite::AllocationSiteVerify() {
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsAllocationSite());
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid AllocationMemento::AllocationMementoVerify() {
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(IsAllocationMemento());
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  VerifyHeapPointer(allocation_site());
995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(!IsValid() || GetAllocationSite()->IsAllocationSite());
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Script::ScriptVerify() {
1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsScript());
1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(source());
1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(name());
1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  line_offset()->SmiVerify();
1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  column_offset()->SmiVerify();
1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(wrapper());
1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  type()->SmiVerify();
1007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(line_ends());
1008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(id());
1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSFunctionResultCache::JSFunctionResultCacheVerify() {
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSFunction::cast(get(kFactoryIndex))->ObjectVerify();
1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int size = Smi::cast(get(kCacheSizeIndex))->value();
1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(kEntriesIndex <= size);
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(size <= length());
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, size % kEntrySize);
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int finger = Smi::cast(get(kFingerIndex))->value();
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(kEntriesIndex <= finger);
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK((finger < size) || (finger == kEntriesIndex && finger == size));
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, finger % kEntrySize);
1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_enable_slow_asserts) {
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = kEntriesIndex; i < size; i++) {
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(!get(i)->IsTheHole());
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      get(i)->ObjectVerify();
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = size; i < length(); i++) {
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CHECK(get(i)->IsTheHole());
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      get(i)->ObjectVerify();
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid NormalizedMapCache::NormalizedMapCacheVerify() {
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FixedArray::cast(this)->FixedArrayVerify();
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_enable_slow_asserts) {
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < length(); i++) {
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Object* e = FixedArray::get(i);
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (e->IsMap()) {
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Map::cast(e)->DictionaryMapVerify();
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        CHECK(e->IsUndefined());
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DebugInfo::DebugInfoVerify() {
1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsDebugInfo());
1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(shared());
1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(original_code());
1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(code());
1058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(break_points());
1059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid BreakPointInfo::BreakPointInfoVerify() {
1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(IsBreakPointInfo());
1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  code_position()->SmiVerify();
1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  source_position()->SmiVerify();
1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  statement_position()->SmiVerify();
1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(break_point_objects());
1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // VERIFY_HEAP
1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::IncrementSpillStatistics(SpillInformation* info) {
1074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  info->number_of_objects_++;
1075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Named properties
1076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (HasFastProperties()) {
1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    info->number_of_objects_with_fast_properties_++;
1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    info->number_of_fast_used_fields_   += map()->NextFreePropertyIndex();
1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    info->number_of_fast_unused_fields_ += map()->unused_property_fields();
1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    NameDictionary* dict = property_dictionary();
1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    info->number_of_slow_used_properties_ += dict->NumberOfElements();
1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    info->number_of_slow_unused_properties_ +=
1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        dict->Capacity() - dict->NumberOfElements();
1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Indexed properties
1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (GetElementsKind()) {
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FAST_HOLEY_SMI_ELEMENTS:
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FAST_SMI_ELEMENTS:
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FAST_HOLEY_DOUBLE_ELEMENTS:
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FAST_DOUBLE_ELEMENTS:
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FAST_HOLEY_ELEMENTS:
1093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case FAST_ELEMENTS: {
1094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_objects_with_fast_elements_++;
1095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int holes = 0;
1096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      FixedArray* e = FixedArray::cast(elements());
1097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int len = e->length();
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Heap* heap = GetHeap();
1099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      for (int i = 0; i < len; i++) {
110044f0eee88ff00398ff7f715fab053374d808c90dSteve Block        if (e->get(i) == heap->the_hole_value()) holes++;
1101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
1102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_fast_used_elements_   += len - holes;
1103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_fast_unused_elements_ += holes;
1104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size)                       \
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case EXTERNAL_##TYPE##_ELEMENTS:                                          \
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case TYPE##_ELEMENTS:
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TYPED_ARRAYS(TYPED_ARRAY_CASE)
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef TYPED_ARRAY_CASE
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    { info->number_of_objects_with_fast_elements_++;
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FixedArrayBase* e = FixedArrayBase::cast(elements());
1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_fast_used_elements_ += e->length();
1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case DICTIONARY_ELEMENTS: {
1119c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch      SeededNumberDictionary* dict = element_dictionary();
1120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_slow_used_elements_ += dict->NumberOfElements();
1121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      info->number_of_slow_unused_elements_ +=
1122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          dict->Capacity() - dict->NumberOfElements();
1123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case SLOPPY_ARGUMENTS_ELEMENTS:
1126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::SpillInformation::Clear() {
1132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_objects_ = 0;
1133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_objects_with_fast_properties_ = 0;
1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_objects_with_fast_elements_ = 0;
1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_fast_used_fields_ = 0;
1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_fast_unused_fields_ = 0;
1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_slow_used_properties_ = 0;
1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_slow_unused_properties_ = 0;
1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_fast_used_elements_ = 0;
1140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_fast_unused_elements_ = 0;
1141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_slow_used_elements_ = 0;
1142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  number_of_slow_unused_elements_ = 0;
1143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::SpillInformation::Print() {
1147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("\n  JSObject Spill Statistics (#%d):\n", number_of_objects_);
1148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("    - fast properties (#%d): %d (used) %d (unused)\n",
1150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_objects_with_fast_properties_,
1151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_fast_used_fields_, number_of_fast_unused_fields_);
1152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("    - slow properties (#%d): %d (used) %d (unused)\n",
1154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_objects_ - number_of_objects_with_fast_properties_,
1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_slow_used_properties_, number_of_slow_unused_properties_);
1156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("    - fast elements (#%d): %d (used) %d (unused)\n",
1158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_objects_with_fast_elements_,
1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_fast_used_elements_, number_of_fast_unused_elements_);
1160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("    - slow elements (#%d): %d (used) %d (unused)\n",
1162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_objects_ - number_of_objects_with_fast_elements_,
1163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         number_of_slow_used_elements_, number_of_slow_unused_elements_);
1164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("\n");
1166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool DescriptorArray::IsSortedNoDuplicates(int valid_entries) {
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (valid_entries == -1) valid_entries = number_of_descriptors();
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Name* current_key = NULL;
1172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t current = 0;
1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < number_of_descriptors(); i++) {
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Name* key = GetSortedKey(i);
1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (key == current_key) {
1176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Print();
1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return false;
1178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    current_key = key;
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    uint32_t hash = GetSortedKey(i)->Hash();
1181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (hash < current) {
1182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Print();
1183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return false;
1184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    current = hash;
1186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
1188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool LayoutDescriptor::IsConsistentWithMap(Map* map) {
1192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_unbox_double_fields) {
1193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DescriptorArray* descriptors = map->instance_descriptors();
1194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int nof_descriptors = map->NumberOfOwnDescriptors();
1195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    for (int i = 0; i < nof_descriptors; i++) {
1196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      PropertyDetails details = descriptors->GetDetails(i);
1197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (details.type() != FIELD) continue;
1198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FieldIndex field_index = FieldIndex::ForDescriptor(map, i);
1199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      bool tagged_expected =
1200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          !field_index.is_inobject() || !details.representation().IsDouble();
1201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      for (int bit = 0; bit < details.field_width_in_words(); bit++) {
1202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        bool tagged_actual = IsTagged(details.field_index() + bit);
1203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        DCHECK_EQ(tagged_expected, tagged_actual);
1204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        if (tagged_actual != tagged_expected) return false;
1205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return true;
1209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TransitionArray::IsSortedNoDuplicates(int valid_entries) {
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(valid_entries == -1);
1214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Name* prev_key = NULL;
1215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PropertyKind prev_kind = DATA;
1216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PropertyAttributes prev_attributes = NONE;
1217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  uint32_t prev_hash = 0;
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < number_of_transitions(); i++) {
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Name* key = GetSortedKey(i);
1220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    uint32_t hash = key->Hash();
1221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    PropertyKind kind = DATA;
1222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    PropertyAttributes attributes = NONE;
1223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (!IsSpecialTransition(key)) {
1224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Map* target = GetTarget(i);
1225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      PropertyDetails details = GetTargetDetails(key, target);
1226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      kind = details.kind();
1227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      attributes = details.attributes();
1228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    } else {
1229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // Duplicate entries are not allowed for non-property transitions.
1230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      CHECK_NE(prev_key, key);
12316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }
1232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int cmp = CompareKeys(prev_key, prev_hash, prev_kind, prev_attributes, key,
1234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                          hash, kind, attributes);
1235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (cmp >= 0) {
1236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Print();
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
12386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    }
1239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    prev_key = key;
1240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    prev_hash = hash;
1241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    prev_attributes = attributes;
1242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    prev_kind = kind;
12436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
12456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
12466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
12476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic bool CheckOneBackPointer(Map* current_map, Object* target) {
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return !target->IsMap() || Map::cast(target)->GetBackPointer() == current_map;
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TransitionArray::IsConsistentWithBackPointers(Map* current_map) {
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < number_of_transitions(); ++i) {
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!CheckOneBackPointer(current_map, GetTarget(i))) return false;
125680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
125880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
125980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
126080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
1261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Code::VerifyEmbeddedObjectsInFullCode() {
1262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Check that no context-specific object has been embedded.
1263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Heap* heap = GetIsolate()->heap();
1264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
1265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (RelocIterator it(this, mask); !it.done(); it.next()) {
1266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Object* obj = it.rinfo()->target_object();
1267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (obj->IsCell()) obj = Cell::cast(obj)->value();
1268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (obj->IsPropertyCell()) obj = PropertyCell::cast(obj)->value();
1269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (!obj->IsHeapObject()) continue;
1270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Map* map = obj->IsMap() ? Map::cast(obj) : HeapObject::cast(obj)->map();
1271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int i = 0;
1272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    while (map != heap->roots_array_start()[i++]) {
1273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      CHECK_LT(i, Heap::kStrongRootListLength);
1274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // DEBUG
1280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
1282