Revert "VM: always clear the data and retainstack in general_error because they might contain uninitialized values (#1187)"
This reverts commit 378f208025
.
db4
parent
875d2421df
commit
70778b89ae
|
@ -39,6 +39,16 @@ void context::reset() {
|
||||||
reset_context_objects();
|
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() {
|
context::~context() {
|
||||||
delete datastack_seg;
|
delete datastack_seg;
|
||||||
delete retainstack_seg;
|
delete retainstack_seg;
|
||||||
|
|
|
@ -47,6 +47,7 @@ struct context {
|
||||||
void reset_callstack();
|
void reset_callstack();
|
||||||
void reset_context_objects();
|
void reset_context_objects();
|
||||||
void reset();
|
void reset();
|
||||||
|
void fix_stacks();
|
||||||
void scrub_stacks(gc_info* info, cell index);
|
void scrub_stacks(gc_info* info, cell index);
|
||||||
|
|
||||||
cell peek() { return *(cell*)datastack; }
|
cell peek() { return *(cell*)datastack; }
|
||||||
|
|
|
@ -44,19 +44,17 @@ void factor_vm::general_error(vm_error_type error, cell arg1_, cell arg2_) {
|
||||||
|
|
||||||
faulting_p = true;
|
faulting_p = true;
|
||||||
|
|
||||||
/* If we had an underflow or overflow, data or retain stack pointers
|
/* If we had an underflow or overflow, data or retain stack
|
||||||
might be out of bounds, or some of their slots might be
|
pointers might be out of bounds, so fix them before allocating
|
||||||
uninitialized, so reset them before allocating anything. */
|
anything */
|
||||||
ctx->reset_datastack();
|
ctx->fix_stacks();
|
||||||
ctx->reset_retainstack();
|
|
||||||
|
|
||||||
/* If error was thrown during heap scan, we re-enable the GC */
|
/* If error was thrown during heap scan, we re-enable the GC */
|
||||||
gc_off = false;
|
gc_off = false;
|
||||||
|
|
||||||
cell error_handler = special_objects[ERROR_HANDLER_QUOT];
|
|
||||||
/* If the error handler is set, we rewind any C stack frames and
|
/* If the error handler is set, we rewind any C stack frames and
|
||||||
pass the error to user-space. */
|
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
|
#ifdef FACTOR_DEBUG
|
||||||
/* Doing a GC here triggers all kinds of funny errors */
|
/* Doing a GC here triggers all kinds of funny errors */
|
||||||
primitive_compact_gc();
|
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
|
/* The unwind-native-frames subprimitive will clear faulting_p
|
||||||
if it was successfully reached. */
|
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
|
} /* Error was thrown in early startup before error handler is set, so just
|
||||||
crash. */
|
crash. */
|
||||||
else {
|
else {
|
||||||
|
|
Loading…
Reference in New Issue