Skip to content

Commit 5de7a14

Browse files
committed
We should not garbage collect hashtable key
1 parent e000706 commit 5de7a14

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

jvm/src/garbage_collector.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,5 +154,8 @@ fn hashtable_members(jvm: &Jvm, hashtable: &dyn ClassInstance) -> Vec<Box<dyn Cl
154154
let rust_hashmap: RustHashMap = get_rust_object_field(jvm, hashtable, "raw");
155155

156156
let rust_hashmap = rust_hashmap.lock();
157-
rust_hashmap.iter().flat_map(|(_, v)| v.iter().map(|x| x.1.clone())).collect()
157+
rust_hashmap
158+
.iter()
159+
.flat_map(|(_, v)| v.iter().flat_map(|x| [x.0.clone(), x.1.clone()].into_iter()))
160+
.collect()
158161
}

jvm/tests/test_garbage_collection.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use jvm::{Result as JvmResult, runtime::JavaLangString};
1+
use jvm::{JavaValue, Result as JvmResult, runtime::JavaLangString};
22

33
use test_utils::test_jvm;
44

@@ -73,3 +73,34 @@ async fn test_garbage_collection() -> JvmResult<()> {
7373

7474
Ok(())
7575
}
76+
77+
#[tokio::test]
78+
async fn test_garbage_collection_hashtable() -> JvmResult<()> {
79+
let jvm = test_jvm().await?;
80+
81+
// collect garbage before test to ensure a clean state
82+
jvm.collect_garbage()?;
83+
84+
let hashtable = jvm.new_class("java/util/Hashtable", "()V", ()).await?;
85+
86+
jvm.push_native_frame();
87+
88+
let key = JavaLangString::from_rust_string(&jvm, "key").await?;
89+
let value = JavaLangString::from_rust_string(&jvm, "value").await?;
90+
let _: JavaValue = jvm
91+
.invoke_virtual(
92+
&hashtable,
93+
"put",
94+
"(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
95+
(key.clone(), value.clone()),
96+
)
97+
.await
98+
.unwrap();
99+
100+
jvm.pop_frame();
101+
102+
let garbage_count = jvm.collect_garbage()?;
103+
assert_eq!(garbage_count, 2);
104+
105+
Ok(())
106+
}

0 commit comments

Comments
 (0)