1
1
use super :: abi:: * ;
2
- use super :: UPCALLS ;
2
+ use super :: { OpenJDKEdge , UPCALLS } ;
3
3
use mmtk:: util:: constants:: * ;
4
4
use mmtk:: util:: opaque_pointer:: * ;
5
5
use mmtk:: util:: { Address , ObjectReference } ;
6
6
use mmtk:: vm:: EdgeVisitor ;
7
7
use std:: { mem, slice} ;
8
8
9
9
trait OopIterate : Sized {
10
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) ;
10
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor < OpenJDKEdge > ) ;
11
11
}
12
12
13
13
impl OopIterate for OopMapBlock {
14
14
#[ inline]
15
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
15
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor < OpenJDKEdge > ) {
16
16
let start = oop. get_field_address ( self . offset ) ;
17
17
for i in 0 ..self . count as usize {
18
18
let edge = start + ( i << LOG_BYTES_IN_ADDRESS ) ;
@@ -23,7 +23,7 @@ impl OopIterate for OopMapBlock {
23
23
24
24
impl OopIterate for InstanceKlass {
25
25
#[ inline]
26
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
26
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor < OpenJDKEdge > ) {
27
27
let oop_maps = self . nonstatic_oop_maps ( ) ;
28
28
for map in oop_maps {
29
29
map. oop_iterate ( oop, closure)
@@ -33,7 +33,7 @@ impl OopIterate for InstanceKlass {
33
33
34
34
impl OopIterate for InstanceMirrorKlass {
35
35
#[ inline]
36
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
36
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor < OpenJDKEdge > ) {
37
37
self . instance_klass . oop_iterate ( oop, closure) ;
38
38
// if (Devirtualizer::do_metadata(closure)) {
39
39
// Klass* klass = java_lang_Class::as_Klass(obj);
@@ -74,7 +74,7 @@ impl OopIterate for InstanceMirrorKlass {
74
74
75
75
impl OopIterate for InstanceClassLoaderKlass {
76
76
#[ inline]
77
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
77
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor < OpenJDKEdge > ) {
78
78
self . instance_klass . oop_iterate ( oop, closure) ;
79
79
// if (Devirtualizer::do_metadata(closure)) {
80
80
// ClassLoaderData* cld = java_lang_ClassLoader::loader_data(obj);
@@ -88,7 +88,7 @@ impl OopIterate for InstanceClassLoaderKlass {
88
88
89
89
impl OopIterate for ObjArrayKlass {
90
90
#[ inline]
91
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
91
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor < OpenJDKEdge > ) {
92
92
let array = unsafe { oop. as_array_oop ( ) } ;
93
93
for oop in unsafe { array. data :: < Oop > ( BasicType :: T_OBJECT ) } {
94
94
closure. visit_edge ( Address :: from_ref ( oop as & Oop ) ) ;
@@ -98,15 +98,15 @@ impl OopIterate for ObjArrayKlass {
98
98
99
99
impl OopIterate for TypeArrayKlass {
100
100
#[ inline]
101
- fn oop_iterate ( & self , _oop : Oop , _closure : & mut impl EdgeVisitor ) {
101
+ fn oop_iterate ( & self , _oop : Oop , _closure : & mut impl EdgeVisitor < OpenJDKEdge > ) {
102
102
// Performance tweak: We skip processing the klass pointer since all
103
103
// TypeArrayKlasses are guaranteed processed via the null class loader.
104
104
}
105
105
}
106
106
107
107
impl OopIterate for InstanceRefKlass {
108
108
#[ inline]
109
- fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor ) {
109
+ fn oop_iterate ( & self , oop : Oop , closure : & mut impl EdgeVisitor < OpenJDKEdge > ) {
110
110
use crate :: abi:: * ;
111
111
use crate :: api:: { add_phantom_candidate, add_soft_candidate, add_weak_candidate} ;
112
112
self . instance_klass . oop_iterate ( oop, closure) ;
@@ -139,7 +139,7 @@ impl InstanceRefKlass {
139
139
!* SINGLETON . get_options ( ) . no_reference_types
140
140
}
141
141
#[ inline]
142
- fn process_ref_as_strong ( oop : Oop , closure : & mut impl EdgeVisitor ) {
142
+ fn process_ref_as_strong ( oop : Oop , closure : & mut impl EdgeVisitor < OpenJDKEdge > ) {
143
143
let referent_addr = Self :: referent_address ( oop) ;
144
144
closure. visit_edge ( referent_addr) ;
145
145
let discovered_addr = Self :: discovered_address ( oop) ;
@@ -148,14 +148,14 @@ impl InstanceRefKlass {
148
148
}
149
149
150
150
#[ allow( unused) ]
151
- fn oop_iterate_slow ( oop : Oop , closure : & mut impl EdgeVisitor , tls : OpaquePointer ) {
151
+ fn oop_iterate_slow ( oop : Oop , closure : & mut impl EdgeVisitor < OpenJDKEdge > , tls : OpaquePointer ) {
152
152
unsafe {
153
153
( ( * UPCALLS ) . scan_object ) ( closure as * mut _ as _ , mem:: transmute ( oop) , tls) ;
154
154
}
155
155
}
156
156
157
157
#[ inline]
158
- fn oop_iterate ( oop : Oop , closure : & mut impl EdgeVisitor ) {
158
+ fn oop_iterate ( oop : Oop , closure : & mut impl EdgeVisitor < OpenJDKEdge > ) {
159
159
let klass_id = oop. klass . id ;
160
160
debug_assert ! (
161
161
klass_id as i32 >= 0 && ( klass_id as i32 ) < 6 ,
@@ -192,7 +192,11 @@ fn oop_iterate(oop: Oop, closure: &mut impl EdgeVisitor) {
192
192
}
193
193
194
194
#[ inline]
195
- pub fn scan_object ( object : ObjectReference , closure : & mut impl EdgeVisitor , _tls : VMWorkerThread ) {
195
+ pub fn scan_object (
196
+ object : ObjectReference ,
197
+ closure : & mut impl EdgeVisitor < OpenJDKEdge > ,
198
+ _tls : VMWorkerThread ,
199
+ ) {
196
200
// println!("*****scan_object(0x{:x}) -> \n 0x{:x}, 0x{:x} \n",
197
201
// object,
198
202
// unsafe { *(object.value() as *const usize) },
0 commit comments