interpreter: check for copying flag in exit

This commit is contained in:
Edward Amsden 2024-03-12 18:38:06 -05:00
parent f68a95e1f2
commit 45f7f00dc9
2 changed files with 10 additions and 0 deletions

View File

@ -1185,6 +1185,11 @@ fn exit(
unsafe { unsafe {
context.restore(snapshot); 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 stack = &mut context.stack;
let mut preserve = match error { let mut preserve = match error {
Error::ScryBlocked(path) => path, Error::ScryBlocked(path) => path,
@ -1192,6 +1197,7 @@ fn exit(
// Return $tang of traces // Return $tang of traces
let h = *(stack.local_noun_pointer(0)); let h = *(stack.local_noun_pointer(0));
// XX: Small chance of clobbering something important after OOM? // XX: Small chance of clobbering something important after OOM?
// XX: what if we OOM while making a stack trace
T(stack, &[h, t]) T(stack, &[h, t])
} }
}; };

View File

@ -137,6 +137,10 @@ impl NockStack {
}; };
} }
pub fn copying(&self) -> bool {
self.pc
}
/** Current frame pointer of this NockStack */ /** Current frame pointer of this NockStack */
pub fn get_frame_pointer(&self) -> *const u64 { pub fn get_frame_pointer(&self) -> *const u64 {
self.frame_pointer self.frame_pointer