87 do_referent<T>(obj, closure, contains); |
87 do_referent<T>(obj, closure, contains); |
88 do_discovered<T>(obj, closure, contains); |
88 do_discovered<T>(obj, closure, contains); |
89 } |
89 } |
90 |
90 |
91 template <typename T, class OopClosureType, class Contains> |
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> |
92 void InstanceRefKlass::oop_oop_iterate_fields(oop obj, OopClosureType* closure, Contains& contains) { |
100 void InstanceRefKlass::oop_oop_iterate_fields(oop obj, OopClosureType* closure, Contains& contains) { |
93 do_referent<T>(obj, closure, contains); |
101 do_referent<T>(obj, closure, contains); |
94 do_discovered<T>(obj, closure, contains); |
102 do_discovered<T>(obj, closure, contains); |
95 } |
103 } |
96 |
104 |
97 template <typename T, class OopClosureType, class Contains> |
105 template <typename T, class OopClosureType, class Contains> |
98 void InstanceRefKlass::oop_oop_iterate_discovered_and_discovery(oop obj, ReferenceType type, OopClosureType* closure, Contains& contains) { |
106 void InstanceRefKlass::oop_oop_iterate_fields_except_referent(oop obj, OopClosureType* closure, Contains& contains) { |
99 // Explicitly apply closure to the discovered field. |
|
100 do_discovered<T>(obj, closure, contains); |
107 do_discovered<T>(obj, closure, contains); |
101 // Then do normal reference processing with discovery. |
|
102 oop_oop_iterate_discovery<T>(obj, type, closure, contains); |
|
103 } |
108 } |
104 |
109 |
105 template <typename T, class OopClosureType, class Contains> |
110 template <typename T, class OopClosureType, class Contains> |
106 void InstanceRefKlass::oop_oop_iterate_ref_processing(oop obj, OopClosureType* closure, Contains& contains) { |
111 void InstanceRefKlass::oop_oop_iterate_ref_processing(oop obj, OopClosureType* closure, Contains& contains) { |
107 switch (closure->reference_iteration_mode()) { |
112 switch (closure->reference_iteration_mode()) { |
114 oop_oop_iterate_discovered_and_discovery<T>(obj, reference_type(), closure, contains); |
119 oop_oop_iterate_discovered_and_discovery<T>(obj, reference_type(), closure, contains); |
115 break; |
120 break; |
116 case OopIterateClosure::DO_FIELDS: |
121 case OopIterateClosure::DO_FIELDS: |
117 trace_reference_gc<T>("do_fields", obj); |
122 trace_reference_gc<T>("do_fields", obj); |
118 oop_oop_iterate_fields<T>(obj, closure, contains); |
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); |
|
127 oop_oop_iterate_fields_except_referent<T>(obj, closure, contains); |
119 break; |
128 break; |
120 default: |
129 default: |
121 ShouldNotReachHere(); |
130 ShouldNotReachHere(); |
122 } |
131 } |
123 } |
132 } |