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