diff --git a/vm/slot_visitor.hpp b/vm/slot_visitor.hpp index e1a2206684..92da352ea0 100644 --- a/vm/slot_visitor.hpp +++ b/vm/slot_visitor.hpp @@ -381,10 +381,23 @@ void slot_visitor::visit_context(context* ctx) { stacks. */ visit_callstack(ctx); - visit_stack_elements(ctx->datastack_seg, (cell*)ctx->datastack); - visit_stack_elements(ctx->retainstack_seg, (cell*)ctx->retainstack); + cell* ds_ptr = (cell*)ctx->datastack; + cell* rs_ptr = (cell*)ctx->retainstack; + visit_stack_elements(ctx->datastack_seg, ds_ptr); + visit_stack_elements(ctx->retainstack_seg, rs_ptr); visit_object_array(ctx->context_objects, ctx->context_objects + context_object_count); + + /* Clear out the space not visited with a known pattern. That makes + it easier to see if uninitialized reads are made. */ + #ifdef FACTOR_DEBUG + cell ds_clear_start = (cell)(ds_ptr + 1); + cell ds_clear_size = ctx->datastack_seg->end - ds_clear_start; + memset_cell((void*)ds_clear_start, 0xbaadbaad, ds_clear_size); + cell rs_clear_start = (cell)(rs_ptr + 1); + cell rs_clear_size = ctx->retainstack_seg->end - rs_clear_start; + memset_cell((void*)rs_clear_start, 0xdaabdaab, rs_clear_size); + #endif } template void slot_visitor::visit_contexts() {