@@ -5,7 +5,7 @@ use bytemuck::cast_slice;
55use hashbrown:: { hash_set:: Entry , HashMap , HashSet } ;
66use parking_lot:: Mutex ;
77
8- use crate :: { thread:: JvmThread , ClassInstance , JavaType , JavaValue , Jvm } ;
8+ use crate :: { thread:: JvmThread , ClassInstance , JavaValue , Jvm } ;
99
1010// XXX java/util/Vector, java/util/HashMap internal..
1111type RustVector = Arc < Mutex < Vec < Box < dyn ClassInstance > > > > ;
@@ -59,29 +59,27 @@ fn find_reachable_objects(jvm: &Jvm, object: &Box<dyn ClassInstance>, reachable_
5959
6060 let fields = object. class_definition ( ) . fields ( ) ;
6161 for field in fields {
62- match field. r#type ( ) {
63- JavaType :: Class ( _ ) => {
64- let value = object . get_field ( & * field ) . unwrap ( ) ;
65- if let JavaValue :: Object ( Some ( value) ) = value {
66- find_reachable_objects ( jvm , & value, reachable_objects ) ;
67- }
62+ let descriptor = field. descriptor ( ) ;
63+
64+ if descriptor . starts_with ( "L" ) && descriptor . ends_with ( ";" ) {
65+ let value = object . get_field ( & * field ) . unwrap ( ) ;
66+ if let JavaValue :: Object ( Some ( value ) ) = value {
67+ find_reachable_objects ( jvm , & value , reachable_objects ) ;
6868 }
69- JavaType :: Array ( _) => {
70- let value = object. get_field ( & * field) . unwrap ( ) ;
71- if let JavaValue :: Object ( Some ( value) ) = value {
72- reachable_objects. insert ( value. clone ( ) ) ;
73-
74- let array = value. as_array_instance ( ) . unwrap ( ) ;
75- let values = array. load ( 0 , array. length ( ) ) . unwrap ( ) ;
76-
77- for value in values {
78- if let JavaValue :: Object ( Some ( value) ) = value {
79- find_reachable_objects ( jvm, & value, reachable_objects) ;
80- }
69+ } else if descriptor. starts_with ( "[" ) {
70+ let value = object. get_field ( & * field) . unwrap ( ) ;
71+ if let JavaValue :: Object ( Some ( value) ) = value {
72+ reachable_objects. insert ( value. clone ( ) ) ;
73+
74+ let array = value. as_array_instance ( ) . unwrap ( ) ;
75+ let values = array. load ( 0 , array. length ( ) ) . unwrap ( ) ;
76+
77+ for value in values {
78+ if let JavaValue :: Object ( Some ( value) ) = value {
79+ find_reachable_objects ( jvm, & value, reachable_objects) ;
8180 }
8281 }
8382 }
84- _ => { }
8583 }
8684 }
8785}
0 commit comments