@@ -52,23 +52,10 @@ fn find_static_reachable_objects(jvm: &Jvm, class: &Class, reachable_objects: &m
5252 let descriptor = field. descriptor ( ) ;
5353 let value = class. definition . get_static_field ( & * field) . unwrap ( ) ;
5454
55- if descriptor. starts_with ( "L" ) && descriptor. ends_with ( ";" ) {
55+ if ( descriptor. starts_with ( 'L' ) && descriptor. ends_with ( ';' ) ) || descriptor . starts_with ( '[' ) {
5656 if let JavaValue :: Object ( Some ( value) ) = value {
5757 find_reachable_objects ( jvm, & value, reachable_objects) ;
5858 }
59- } else if descriptor. starts_with ( "[" ) {
60- if let JavaValue :: Object ( Some ( value) ) = value {
61- reachable_objects. insert ( value. clone ( ) ) ;
62-
63- let array = value. as_array_instance ( ) . unwrap ( ) ;
64- let values = array. load ( 0 , array. length ( ) ) . unwrap ( ) ;
65-
66- for value in values {
67- if let JavaValue :: Object ( Some ( value) ) = value {
68- find_reachable_objects ( jvm, & value, reachable_objects) ;
69- }
70- }
71- }
7259 }
7360 }
7461}
@@ -81,48 +68,43 @@ fn find_reachable_objects(jvm: &Jvm, object: &Box<dyn ClassInstance>, reachable_
8168 }
8269 entry. insert ( ) ;
8370
84- // XXX we have to deal with java value wrapped inside rust type e.g. java.util.Vector, java.util.Hashtable
85- if jvm. is_instance ( & * * object, "java/util/Vector" ) {
86- let members = vector_members ( jvm, & * * object) ;
87- for member in members {
88- find_reachable_objects ( jvm, & member, reachable_objects) ;
89- }
90- } else if jvm. is_instance ( & * * object, "java/util/Hashtable" ) {
91- let members = hashtable_members ( jvm, & * * object) ;
92- for member in members {
93- find_reachable_objects ( jvm, & member, reachable_objects) ;
94- }
95- }
71+ let name = object. class_definition ( ) . name ( ) ;
72+ if name. starts_with ( '[' ) {
73+ // is array
74+ let array = object. as_array_instance ( ) . unwrap ( ) ;
75+ let values = array. load ( 0 , array. length ( ) ) . unwrap ( ) ;
9676
97- let fields = object . class_definition ( ) . fields ( ) ;
98- for field in fields {
99- if field . access_flags ( ) . contains ( FieldAccessFlags :: STATIC ) {
100- continue ;
77+ for value in values {
78+ if let JavaValue :: Object ( Some ( value ) ) = value {
79+ find_reachable_objects ( jvm , & value , reachable_objects ) ;
80+ }
10181 }
102-
103- let descriptor = field. descriptor ( ) ;
104-
105- if !descriptor. starts_with ( "L" ) && !descriptor. starts_with ( "[" ) {
106- continue ;
82+ } else {
83+ // XXX we have to deal with java value wrapped inside rust type e.g. java.util.Vector, java.util.Hashtable
84+ if jvm. is_instance ( & * * object, "java/util/Vector" ) {
85+ let members = vector_members ( jvm, & * * object) ;
86+ for member in members {
87+ find_reachable_objects ( jvm, & member, reachable_objects) ;
88+ }
89+ } else if jvm. is_instance ( & * * object, "java/util/Hashtable" ) {
90+ let members = hashtable_members ( jvm, & * * object) ;
91+ for member in members {
92+ find_reachable_objects ( jvm, & member, reachable_objects) ;
93+ }
10794 }
10895
109- let value = object. get_field ( & * field) . unwrap ( ) ;
110-
111- if descriptor. starts_with ( "L" ) && descriptor. ends_with ( ";" ) {
112- if let JavaValue :: Object ( Some ( value) ) = value {
113- find_reachable_objects ( jvm, & value, reachable_objects) ;
96+ let fields = object. class_definition ( ) . fields ( ) ;
97+ for field in fields {
98+ if field. access_flags ( ) . contains ( FieldAccessFlags :: STATIC ) {
99+ continue ;
114100 }
115- } else if descriptor. starts_with ( "[" ) {
116- if let JavaValue :: Object ( Some ( value) ) = value {
117- reachable_objects. insert ( value. clone ( ) ) ;
118101
119- let array = value. as_array_instance ( ) . unwrap ( ) ;
120- let values = array. load ( 0 , array. length ( ) ) . unwrap ( ) ;
102+ let descriptor = field. descriptor ( ) ;
121103
122- for value in values {
123- if let JavaValue :: Object ( Some ( value) ) = value {
124- find_reachable_objects ( jvm , & value, reachable_objects ) ;
125- }
104+ if ( descriptor . starts_with ( 'L' ) && descriptor . ends_with ( ';' ) ) || descriptor . starts_with ( '[' ) {
105+ let value = object . get_field ( & * field ) . unwrap ( ) ;
106+ if let JavaValue :: Object ( Some ( value ) ) = value {
107+ find_reachable_objects ( jvm , & value , reachable_objects ) ;
126108 }
127109 }
128110 }
0 commit comments