]> Repositorios git - scryer-prolog.git/commitdiff
record perm vars only while resident stack frame is still up
authorMark Thom <[email protected]>
Sat, 2 Feb 2019 19:45:50 +0000 (12:45 -0700)
committerMark Thom <[email protected]>
Sat, 2 Feb 2019 19:45:50 +0000 (12:45 -0700)
src/prolog/machine/mod.rs

index a13cd7737ff38005669e5b5c7e12087d358513cd..c4ada3f182ce910c0798abf9543d90b533358ef7 100644 (file)
@@ -592,13 +592,14 @@ impl MachineState {
     {
         for (var, var_data) in alloc_locs {
             match var_data {
-                &VarData::Perm(p) if p > 0 => {
-                    let e = self.e;
-                    let r = var_data.as_reg_type().reg_num();
-                    let addr = self.and_stack[e][r].clone();
+                &VarData::Perm(p) if p > 0 =>
+                    if !heap_locs.contains_key(var) {
+                        let e = self.e;
+                        let r = var_data.as_reg_type().reg_num(); // crashes here.
+                        let addr = self.and_stack[e][r].clone();
 
-                    heap_locs.insert(var.clone(), addr);
-                },
+                        heap_locs.insert(var.clone(), addr);
+                    },
                 &VarData::Temp(cn, _, _) if cn == chunk_num => {
                     let r = var_data.as_reg_type();