Revert "VM: always clear the data and retainstack in general_error because they might contain uninitialized values (#1187)"

This reverts commit 378f208025.
db4
John Benediktsson 2014-12-04 11:45:13 -08:00
parent 875d2421df
commit 70778b89ae
3 changed files with 18 additions and 8 deletions

View File

@ -39,6 +39,16 @@ void context::reset() {
reset_context_objects();
}
void context::fix_stacks() {
if (datastack + sizeof(cell) < datastack_seg->start ||
datastack + stack_reserved >= datastack_seg->end)
reset_datastack();
if (retainstack + sizeof(cell) < retainstack_seg->start ||
retainstack + stack_reserved >= retainstack_seg->end)
reset_retainstack();
}
context::~context() {
delete datastack_seg;
delete retainstack_seg;

View File

@ -47,6 +47,7 @@ struct context {
void reset_callstack();
void reset_context_objects();
void reset();
void fix_stacks();
void scrub_stacks(gc_info* info, cell index);
cell peek() { return *(cell*)datastack; }

View File

@ -44,19 +44,17 @@ void factor_vm::general_error(vm_error_type error, cell arg1_, cell arg2_) {
faulting_p = true;
/* If we had an underflow or overflow, data or retain stack pointers
might be out of bounds, or some of their slots might be
uninitialized, so reset them before allocating anything. */
ctx->reset_datastack();
ctx->reset_retainstack();
/* If we had an underflow or overflow, data or retain stack
pointers might be out of bounds, so fix them before allocating
anything */
ctx->fix_stacks();
/* If error was thrown during heap scan, we re-enable the GC */
gc_off = false;
cell error_handler = special_objects[ERROR_HANDLER_QUOT];
/* If the error handler is set, we rewind any C stack frames and
pass the error to user-space. */
if (!current_gc && to_boolean(error_handler)) {
if (!current_gc && to_boolean(special_objects[ERROR_HANDLER_QUOT])) {
#ifdef FACTOR_DEBUG
/* Doing a GC here triggers all kinds of funny errors */
primitive_compact_gc();
@ -74,7 +72,8 @@ void factor_vm::general_error(vm_error_type error, cell arg1_, cell arg2_) {
/* The unwind-native-frames subprimitive will clear faulting_p
if it was successfully reached. */
unwind_native_frames(error_handler, ctx->callstack_top);
unwind_native_frames(special_objects[ERROR_HANDLER_QUOT],
ctx->callstack_top);
} /* Error was thrown in early startup before error handler is set, so just
crash. */
else {