@@ -51,31 +51,56 @@ fn sweep(mut rt: Runtime, m: HashMap<EnvWeak, bool>) -> Runtime {
51
51
}
52
52
53
53
fn env_hashmap ( rt : & Runtime ) -> HashMap < EnvWeak , bool > {
54
- let mut envs = HashMap :: new ( ) ;
54
+ let mut m = HashMap :: new ( ) ;
55
55
for env in rt. env_registry . iter ( ) {
56
- envs . insert ( W ( weak_clone ( env) ) , false ) ;
56
+ m . insert ( W ( weak_clone ( env) ) , false ) ;
57
57
}
58
- envs
58
+ m
59
59
}
60
60
61
61
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
63
66
}
64
67
65
68
fn mark_env (
66
69
mut m : HashMap < EnvWeak , bool > ,
67
70
env : & Weak < RefCell < Environment > > ,
68
71
) -> 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
70
90
}
71
91
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
74
99
}
75
100
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
81
106
}
0 commit comments