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