Skip to content

Commit 72706f1

Browse files
committed
Fix array gc
1 parent 409caac commit 72706f1

File tree

1 file changed

+31
-49
lines changed

1 file changed

+31
-49
lines changed

jvm/src/garbage_collector.rs

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)