Skip to content

Commit d05230b

Browse files
committed
Add gc mark
1 parent f108f55 commit d05230b

File tree

1 file changed

+37
-12
lines changed
  • vm/ignite/src/runtime

1 file changed

+37
-12
lines changed

vm/ignite/src/runtime/gc.rs

+37-12
Original file line numberDiff line numberDiff line change
@@ -51,31 +51,56 @@ fn sweep(mut rt: Runtime, m: HashMap<EnvWeak, bool>) -> Runtime {
5151
}
5252

5353
fn env_hashmap(rt: &Runtime) -> HashMap<EnvWeak, bool> {
54-
let mut envs = HashMap::new();
54+
let mut m = HashMap::new();
5555
for env in rt.env_registry.iter() {
56-
envs.insert(W(weak_clone(env)), false);
56+
m.insert(W(weak_clone(env)), false);
5757
}
58-
envs
58+
m
5959
}
6060

6161
fn mark_thread(mut m: HashMap<EnvWeak, bool>, t: &Thread) -> HashMap<EnvWeak, bool> {
62-
todo!()
62+
m = mark_env(m, &t.env);
63+
m = mark_operand_stack(m, &t.operand_stack);
64+
m = mark_runtime_stack(m, &t.runtime_stack);
65+
m
6366
}
6467

6568
fn mark_env(
6669
mut m: HashMap<EnvWeak, bool>,
6770
env: &Weak<RefCell<Environment>>,
6871
) -> HashMap<EnvWeak, bool> {
69-
todo!()
72+
let is_marked = m
73+
.get_mut(&W(env.clone()))
74+
.expect("Environment must be in the registry");
75+
76+
match is_marked {
77+
true => return m, // Already marked
78+
false => *is_marked = true,
79+
}
80+
81+
let env = env
82+
.upgrade()
83+
.expect("Environment must still be referenced to be marked");
84+
85+
if let Some(parent) = &env.borrow().parent {
86+
m = mark_env(m, parent);
87+
}
88+
89+
m
7090
}
7191

72-
fn mark_operand_stack(mut m: HashMap<EnvWeak, bool>, os: &Vec<Value>) -> HashMap<EnvWeak, bool> {
73-
todo!()
92+
fn mark_operand_stack(mut m: HashMap<EnvWeak, bool>, os: &[Value]) -> HashMap<EnvWeak, bool> {
93+
for val in os.iter() {
94+
if let Value::Closure { env, .. } = val {
95+
m = mark_env(m, env);
96+
}
97+
}
98+
m
7499
}
75100

76-
fn mark_runtime_stack(
77-
mut m: HashMap<EnvWeak, bool>,
78-
rs: &Vec<StackFrame>,
79-
) -> HashMap<EnvWeak, bool> {
80-
todo!()
101+
fn mark_runtime_stack(mut m: HashMap<EnvWeak, bool>, rs: &[StackFrame]) -> HashMap<EnvWeak, bool> {
102+
for frame in rs.iter() {
103+
m = mark_env(m, &frame.env);
104+
}
105+
m
81106
}

0 commit comments

Comments
 (0)