@@ -3,7 +3,8 @@ use std::hash::{Hash, Hasher};
33use std:: mem;
44use crate :: alloc:: Alloc ;
55use crate :: object:: Object ;
6- use crate :: vm:: { Value , Closure } ;
6+ use crate :: closure:: Closure ;
7+ use crate :: vm:: Value ;
78
89/// Custom Hash implementation for Value
910impl Hash for Value
@@ -94,23 +95,17 @@ pub fn deepcopy(
9495 }
9596
9697 Value :: Closure ( p) => {
97- let new_clos = unsafe { ( * p) . clone ( ) } ;
98+ let clos = unsafe { & * p } ;
99+ let mut new_clos = Closure :: new ( clos. fun_id , clos. num_slots ( ) , dst_alloc) ?;
100+ let mut new_clos = new_clos. unwrap_clos ( ) ;
98101
99- for val in & new_clos. slots {
100- push_val ! ( val) ;
101- }
102-
103- Value :: Closure ( dst_alloc. alloc ( new_clos) ?)
104- }
105-
106- Value :: Dict ( p) => {
107- let new_obj = unsafe { ( * p) . clone ( ) } ;
108-
109- for val in new_obj. hash . values ( ) {
110- push_val ! ( val) ;
102+ for i in 0 ..clos. num_slots ( ) {
103+ let val = clos. get ( i) ;
104+ new_clos. set ( i, val) ;
105+ push_val ! ( & val) ;
111106 }
112107
113- Value :: Dict ( dst_alloc . alloc ( new_obj ) ? )
108+ Value :: Closure ( new_clos )
114109 }
115110
116111 Value :: Object ( p) => {
@@ -127,6 +122,16 @@ pub fn deepcopy(
127122 Value :: Object ( new_obj)
128123 }
129124
125+ Value :: Dict ( p) => {
126+ let new_obj = unsafe { ( * p) . clone ( ) } ;
127+
128+ for val in new_obj. hash . values ( ) {
129+ push_val ! ( val) ;
130+ }
131+
132+ Value :: Dict ( dst_alloc. alloc ( new_obj) ?)
133+ }
134+
130135 Value :: Array ( p) => {
131136 let arr = unsafe { & * p } ;
132137 let new_arr = arr. clone ( dst_alloc) ?;
@@ -175,15 +180,10 @@ pub fn remap(dst_map: &mut HashMap<Value, Value>)
175180
176181 Value :: Closure ( p) => {
177182 let clos = unsafe { & mut * * p } ;
178- for slot_val in & mut clos. slots {
179- remap_val ! ( slot_val) ;
180- }
181- }
182-
183- Value :: Dict ( p) => {
184- let dict = unsafe { & mut * * p } ;
185- for val in dict. hash . values_mut ( ) {
186- remap_val ! ( val) ;
183+ for i in 0 ..clos. num_slots ( ) {
184+ let mut val = clos. get ( i) ;
185+ remap_val ! ( & mut val) ;
186+ clos. set ( i, val) ;
187187 }
188188 }
189189
@@ -196,6 +196,14 @@ pub fn remap(dst_map: &mut HashMap<Value, Value>)
196196 }
197197 }
198198
199+
200+ Value :: Dict ( p) => {
201+ let dict = unsafe { & mut * * p } ;
202+ for val in dict. hash . values_mut ( ) {
203+ remap_val ! ( val) ;
204+ }
205+ }
206+
199207 Value :: Array ( p) => {
200208 let arr = unsafe { & mut * * p } ;
201209 for val in arr. items_mut ( ) {
0 commit comments