81 // Try to discover reference and return if it succeeds.
82 if (try_discover<T>(obj, type, closure)) {
83 return;
84 }
85
86 // Treat referent and discovered as normal oops.
87 do_referent<T>(obj, closure, contains);
88 do_discovered<T>(obj, closure, contains);
89 }
90
91 template <typename T, class OopClosureType, class Contains>
92 void InstanceRefKlass::oop_oop_iterate_discovered_and_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) {
93 // Explicitly apply closure to the discovered field.
94 do_discovered<T>(obj, closure, contains);
95 // Then do normal reference processing with discovery.
96 oop_oop_iterate_discovery<T>(obj, type, closure, contains);
97 }
98
99 template <typename T, class OopClosureType, class Contains>
100 void InstanceRefKlass::oop_oop_iterate_fields(oop obj, OopClosureType* closure, Contains& contains) {
101 do_referent<T>(obj, closure, contains);
102 do_discovered<T>(obj, closure, contains);
103 }
104
105 template <typename T, class OopClosureType, class Contains>
106 void InstanceRefKlass::oop_oop_iterate_fields_except_referent(oop obj, OopClosureType* closure, Contains& contains) {
107 do_discovered<T>(obj, closure, contains);
108 }
109
110 template <typename T, class OopClosureType, class Contains>
111 void InstanceRefKlass::oop_oop_iterate_ref_processing(oop obj, OopClosureType* closure, Contains& contains) {
112 switch (closure->reference_iteration_mode()) {
113 case OopIterateClosure::DO_DISCOVERY:
114 trace_reference_gc<T>("do_discovery", obj);
115 oop_oop_iterate_discovery<T>(obj, reference_type(), closure, contains);
116 break;
117 case OopIterateClosure::DO_DISCOVERED_AND_DISCOVERY:
118 trace_reference_gc<T>("do_discovered_and_discovery", obj);
119 oop_oop_iterate_discovered_and_discovery<T>(obj, reference_type(), closure, contains);
120 break;
121 case OopIterateClosure::DO_FIELDS:
122 trace_reference_gc<T>("do_fields", obj);
123 oop_oop_iterate_fields<T>(obj, closure, contains);
124 break;
125 case OopIterateClosure::DO_FIELDS_EXCEPT_REFERENT:
126 trace_reference_gc<T>("do_fields_except_referent", obj);
|
81 // Try to discover reference and return if it succeeds.
82 if (try_discover<T>(obj, type, closure)) {
83 return;
84 }
85
86 // Treat referent and discovered as normal oops.
87 do_referent<T>(obj, closure, contains);
88 do_discovered<T>(obj, closure, contains);
89 }
90
91 template <typename T, class OopClosureType, class Contains>
92 void InstanceRefKlass::oop_oop_iterate_discovered_and_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) {
93 // Explicitly apply closure to the discovered field.
94 do_discovered<T>(obj, closure, contains);
95 // Then do normal reference processing with discovery.
96 oop_oop_iterate_discovery<T>(obj, type, closure, contains);
97 }
98
99 template <typename T, class OopClosureType, class Contains>
100 void InstanceRefKlass::oop_oop_iterate_fields(oop obj, OopClosureType* closure, Contains& contains) {
101 assert(closure->ref_discoverer() == NULL, "ReferenceDiscoverer should not be set");
102 do_referent<T>(obj, closure, contains);
103 do_discovered<T>(obj, closure, contains);
104 }
105
106 template <typename T, class OopClosureType, class Contains>
107 void InstanceRefKlass::oop_oop_iterate_fields_except_referent(oop obj, OopClosureType* closure, Contains& contains) {
108 assert(closure->ref_discoverer() == NULL, "ReferenceDiscoverer should not be set");
109 do_discovered<T>(obj, closure, contains);
110 }
111
112 template <typename T, class OopClosureType, class Contains>
113 void InstanceRefKlass::oop_oop_iterate_ref_processing(oop obj, OopClosureType* closure, Contains& contains) {
114 switch (closure->reference_iteration_mode()) {
115 case OopIterateClosure::DO_DISCOVERY:
116 trace_reference_gc<T>("do_discovery", obj);
117 oop_oop_iterate_discovery<T>(obj, reference_type(), closure, contains);
118 break;
119 case OopIterateClosure::DO_DISCOVERED_AND_DISCOVERY:
120 trace_reference_gc<T>("do_discovered_and_discovery", obj);
121 oop_oop_iterate_discovered_and_discovery<T>(obj, reference_type(), closure, contains);
122 break;
123 case OopIterateClosure::DO_FIELDS:
124 trace_reference_gc<T>("do_fields", obj);
125 oop_oop_iterate_fields<T>(obj, closure, contains);
126 break;
127 case OopIterateClosure::DO_FIELDS_EXCEPT_REFERENT:
128 trace_reference_gc<T>("do_fields_except_referent", obj);
|