diff --git a/rust/ares/src/interpreter.rs b/rust/ares/src/interpreter.rs index 12bb229..250aa96 100644 --- a/rust/ares/src/interpreter.rs +++ b/rust/ares/src/interpreter.rs @@ -1185,6 +1185,11 @@ fn exit( unsafe { context.restore(snapshot); + if context.stack.copying() { + assert!(context.stack.get_frame_pointer() != virtual_frame); + context.stack.frame_pop(); + } + let stack = &mut context.stack; let mut preserve = match error { Error::ScryBlocked(path) => path, @@ -1192,6 +1197,7 @@ fn exit( // Return $tang of traces let h = *(stack.local_noun_pointer(0)); // XX: Small chance of clobbering something important after OOM? + // XX: what if we OOM while making a stack trace T(stack, &[h, t]) } }; diff --git a/rust/ares/src/mem.rs b/rust/ares/src/mem.rs index 210e897..6852139 100644 --- a/rust/ares/src/mem.rs +++ b/rust/ares/src/mem.rs @@ -137,6 +137,10 @@ impl NockStack { }; } + pub fn copying(&self) -> bool { + self.pc + } + /** Current frame pointer of this NockStack */ pub fn get_frame_pointer(&self) -> *const u64 { self.frame_pointer diff --git a/rust/ares_pma/c-src/btree.c b/rust/ares_pma/c-src/btree.c index a796748..29693cc 100644 --- a/rust/ares_pma/c-src/btree.c +++ b/rust/ares_pma/c-src/btree.c @@ -1134,6 +1134,7 @@ _pending_flist_merge(BT_state *state) src_head = src_head->next; free(prev); } + state->pending_flist = 0; }