13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without 33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are 43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met: 53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Redistributions of source code must retain the above copyright 73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// notice, this list of conditions and the following disclaimer. 83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Redistributions in binary form must reproduce the above 93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// copyright notice, this list of conditions and the following 103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// disclaimer in the documentation and/or other materials provided 113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// with the distribution. 123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Neither the name of Google Inc. nor the names of its 133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// contributors may be used to endorse or promote products derived 143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// from this software without specific prior written permission. 153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifndef V8_OBJECTS_VISITING_INL_H_ 293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define V8_OBJECTS_VISITING_INL_H_ 303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace v8 { 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace internal { 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<typename StaticVisitor> 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid StaticNewSpaceVisitor<StaticVisitor>::Initialize() { 373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitShortcutCandidate, 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch &FixedBodyVisitor<StaticVisitor, 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ConsString::BodyDescriptor, 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int>::Visit); 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitConsString, 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch &FixedBodyVisitor<StaticVisitor, 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ConsString::BodyDescriptor, 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int>::Visit); 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitSlicedString, 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch &FixedBodyVisitor<StaticVisitor, 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SlicedString::BodyDescriptor, 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int>::Visit); 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitFixedArray, 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch &FlexibleBodyVisitor<StaticVisitor, 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedArray::BodyDescriptor, 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int>::Visit); 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitFixedDoubleArray, &VisitFixedDoubleArray); 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitGlobalContext, 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch &FixedBodyVisitor<StaticVisitor, 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Context::ScavengeBodyDescriptor, 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int>::Visit); 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitByteArray, &VisitByteArray); 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitSharedFunctionInfo, 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch &FixedBodyVisitor<StaticVisitor, 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SharedFunctionInfo::BodyDescriptor, 693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int>::Visit); 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitSeqAsciiString, &VisitSeqAsciiString); 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitSeqTwoByteString, &VisitSeqTwoByteString); 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitJSFunction, 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch &JSObjectVisitor:: 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch template VisitSpecialized<JSFunction::kSize>); 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitFreeSpace, &VisitFreeSpace); 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitJSWeakMap, &JSObjectVisitor::Visit); 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.Register(kVisitJSRegExp, &JSObjectVisitor::Visit); 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.template RegisterSpecializations<DataObjectVisitor, 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kVisitDataObject, 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kVisitDataObjectGeneric>(); 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.template RegisterSpecializations<JSObjectVisitor, 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kVisitJSObject, 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kVisitJSObjectGeneric>(); 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch table_.template RegisterSpecializations<StructVisitor, 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kVisitStruct, 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kVisitStructGeneric>(); 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Code::CodeIterateBody(ObjectVisitor* v) { 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int mode_mask = RelocInfo::kCodeTargetMask | 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::GLOBAL_PROPERTY_CELL) | 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) | 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::JS_RETURN) | 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT) | 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY); 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // There are two places where we iterate code bodies: here and the 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // templated CodeIterateBody (below). They should be kept in sync. 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch IteratePointer(v, kRelocationInfoOffset); 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch IteratePointer(v, kHandlerTableOffset); 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch IteratePointer(v, kDeoptimizationDataOffset); 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch IteratePointer(v, kTypeFeedbackInfoOffset); 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocIterator it(this, mode_mask); 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (; !it.done(); it.next()) { 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch it.rinfo()->Visit(v); 1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<typename StaticVisitor> 1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Code::CodeIterateBody(Heap* heap) { 1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int mode_mask = RelocInfo::kCodeTargetMask | 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | 1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::GLOBAL_PROPERTY_CELL) | 1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) | 1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::JS_RETURN) | 1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT) | 1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY); 1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // There are two places where we iterate code bodies: here and the 1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // non-templated CodeIterateBody (above). They should be kept in sync. 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StaticVisitor::VisitPointer( 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap, 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<Object**>(this->address() + kRelocationInfoOffset)); 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StaticVisitor::VisitPointer( 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap, 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<Object**>(this->address() + kHandlerTableOffset)); 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StaticVisitor::VisitPointer( 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap, 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<Object**>(this->address() + kDeoptimizationDataOffset)); 1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StaticVisitor::VisitPointer( 1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap, 1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<Object**>(this->address() + kTypeFeedbackInfoOffset)); 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch RelocIterator it(this, mode_mask); 1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (; !it.done(); it.next()) { 1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch it.rinfo()->template Visit<StaticVisitor>(heap); 1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} } // namespace v8::internal 1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif // V8_OBJECTS_VISITING_INL_H_ 156