| Index: src/objects-visiting-inl.h
|
| diff --git a/src/objects-visiting-inl.h b/src/objects-visiting-inl.h
|
| index 8ba92f70c9b8f2dab86f02d1c80ac55889d93211..30a7ad460b01222931a8a0defe744bf96958a31c 100644
|
| --- a/src/objects-visiting-inl.h
|
| +++ b/src/objects-visiting-inl.h
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2011 the V8 project authors. All rights reserved.
|
| +// Copyright 2012 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -93,6 +93,139 @@ void StaticNewSpaceVisitor<StaticVisitor>::Initialize() {
|
| }
|
|
|
|
|
| +template<typename StaticVisitor>
|
| +void StaticMarkingVisitor<StaticVisitor>::Initialize() {
|
| + table_.Register(kVisitShortcutCandidate,
|
| + &FixedBodyVisitor<StaticVisitor,
|
| + ConsString::BodyDescriptor,
|
| + void>::Visit);
|
| +
|
| + table_.Register(kVisitConsString,
|
| + &FixedBodyVisitor<StaticVisitor,
|
| + ConsString::BodyDescriptor,
|
| + void>::Visit);
|
| +
|
| + table_.Register(kVisitSlicedString,
|
| + &FixedBodyVisitor<StaticVisitor,
|
| + SlicedString::BodyDescriptor,
|
| + void>::Visit);
|
| +
|
| + table_.Register(kVisitFixedArray,
|
| + &FlexibleBodyVisitor<StaticVisitor,
|
| + FixedArray::BodyDescriptor,
|
| + void>::Visit);
|
| +
|
| + table_.Register(kVisitFixedDoubleArray, &DataObjectVisitor::Visit);
|
| +
|
| + table_.Register(kVisitGlobalContext, &VisitGlobalContext);
|
| +
|
| + table_.Register(kVisitByteArray, &DataObjectVisitor::Visit);
|
| +
|
| + table_.Register(kVisitFreeSpace, &DataObjectVisitor::Visit);
|
| +
|
| + table_.Register(kVisitSeqAsciiString, &DataObjectVisitor::Visit);
|
| +
|
| + table_.Register(kVisitSeqTwoByteString, &DataObjectVisitor::Visit);
|
| +
|
| + table_.Register(kVisitJSWeakMap, &StaticVisitor::VisitJSWeakMap);
|
| +
|
| + table_.Register(kVisitOddball,
|
| + &FixedBodyVisitor<StaticVisitor,
|
| + Oddball::BodyDescriptor,
|
| + void>::Visit);
|
| +
|
| + table_.Register(kVisitMap,
|
| + &FixedBodyVisitor<StaticVisitor,
|
| + Map::BodyDescriptor,
|
| + void>::Visit);
|
| +
|
| + table_.Register(kVisitCode, &StaticVisitor::VisitCode);
|
| +
|
| + // Registration for kVisitSharedFunctionInfo is done by StaticVisitor.
|
| +
|
| + // Registration for kVisitJSFunction is done by StaticVisitor.
|
| +
|
| + // Registration for kVisitJSRegExp is done by StaticVisitor.
|
| +
|
| + table_.Register(kVisitPropertyCell,
|
| + &FixedBodyVisitor<StaticVisitor,
|
| + JSGlobalPropertyCell::BodyDescriptor,
|
| + void>::Visit);
|
| +
|
| + table_.template RegisterSpecializations<DataObjectVisitor,
|
| + kVisitDataObject,
|
| + kVisitDataObjectGeneric>();
|
| +
|
| + table_.template RegisterSpecializations<JSObjectVisitor,
|
| + kVisitJSObject,
|
| + kVisitJSObjectGeneric>();
|
| +
|
| + table_.template RegisterSpecializations<StructObjectVisitor,
|
| + kVisitStruct,
|
| + kVisitStructGeneric>();
|
| +}
|
| +
|
| +
|
| +template<typename StaticVisitor>
|
| +void StaticMarkingVisitor<StaticVisitor>::VisitCodeEntry(
|
| + Heap* heap, Address entry_address) {
|
| + Code* code = Code::cast(Code::GetObjectFromEntryAddress(entry_address));
|
| + heap->mark_compact_collector()->RecordCodeEntrySlot(entry_address, code);
|
| + StaticVisitor::MarkObject(heap, code);
|
| +}
|
| +
|
| +
|
| +template<typename StaticVisitor>
|
| +void StaticMarkingVisitor<StaticVisitor>::VisitGlobalPropertyCell(
|
| + Heap* heap, RelocInfo* rinfo) {
|
| + ASSERT(rinfo->rmode() == RelocInfo::GLOBAL_PROPERTY_CELL);
|
| + JSGlobalPropertyCell* cell = rinfo->target_cell();
|
| + StaticVisitor::MarkObject(heap, cell);
|
| +}
|
| +
|
| +
|
| +template<typename StaticVisitor>
|
| +void StaticMarkingVisitor<StaticVisitor>::VisitDebugTarget(
|
| + Heap* heap, RelocInfo* rinfo) {
|
| + ASSERT((RelocInfo::IsJSReturn(rinfo->rmode()) &&
|
| + rinfo->IsPatchedReturnSequence()) ||
|
| + (RelocInfo::IsDebugBreakSlot(rinfo->rmode()) &&
|
| + rinfo->IsPatchedDebugBreakSlotSequence()));
|
| + Code* target = Code::GetCodeFromTargetAddress(rinfo->call_address());
|
| + heap->mark_compact_collector()->RecordRelocSlot(rinfo, target);
|
| + StaticVisitor::MarkObject(heap, target);
|
| +}
|
| +
|
| +
|
| +template<typename StaticVisitor>
|
| +void StaticMarkingVisitor<StaticVisitor>::VisitGlobalContext(
|
| + Map* map, HeapObject* object) {
|
| + FixedBodyVisitor<StaticVisitor,
|
| + Context::MarkCompactBodyDescriptor,
|
| + void>::Visit(map, object);
|
| +
|
| + MarkCompactCollector* collector = map->GetHeap()->mark_compact_collector();
|
| + for (int idx = Context::FIRST_WEAK_SLOT;
|
| + idx < Context::GLOBAL_CONTEXT_SLOTS;
|
| + ++idx) {
|
| + Object** slot =
|
| + HeapObject::RawField(object, FixedArray::OffsetOfElementAt(idx));
|
| + collector->RecordSlot(slot, slot, *slot);
|
| + }
|
| +}
|
| +
|
| +
|
| +template<typename StaticVisitor>
|
| +void StaticMarkingVisitor<StaticVisitor>::VisitJSRegExp(
|
| + Map* map, HeapObject* object) {
|
| + int last_property_offset =
|
| + JSRegExp::kSize + kPointerSize * map->inobject_properties();
|
| + StaticVisitor::VisitPointers(map->GetHeap(),
|
| + HeapObject::RawField(object, JSRegExp::kPropertiesOffset),
|
| + HeapObject::RawField(object, last_property_offset));
|
| +}
|
| +
|
| +
|
| void Code::CodeIterateBody(ObjectVisitor* v) {
|
| int mode_mask = RelocInfo::kCodeTargetMask |
|
| RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
|
|
|