]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: after reset_datastack and retainstack clear the stack segment. makes
authorBjörn Lindqvist <bjourne@gmail.com>
Fri, 22 May 2015 14:52:13 +0000 (16:52 +0200)
committerDoug Coleman <doug.coleman@gmail.com>
Fri, 22 May 2015 19:22:28 +0000 (12:22 -0700)
it easier to find bad accesses to shadow data

vm/contexts.cpp
vm/contexts.hpp
vm/slot_visitor.hpp

index df698b38e8231cbede04c67cfb36e3cf0f1db32a..e829bfd4b21364d5f47643ba01014f896bc16825 100644 (file)
@@ -17,10 +17,12 @@ context::context(cell datastack_size, cell retainstack_size,
 
 void context::reset_datastack() {
   datastack = datastack_seg->start - sizeof(cell);
+  fill_stack_seg(datastack, datastack_seg, 0x11111111);
 }
 
 void context::reset_retainstack() {
   retainstack = retainstack_seg->start - sizeof(cell);
+  fill_stack_seg(retainstack, retainstack_seg, 0x22222222);
 }
 
 void context::reset_callstack() {
@@ -32,6 +34,14 @@ void context::reset_context_objects() {
               context_object_count * sizeof(cell));
 }
 
+void context::fill_stack_seg(cell top_ptr, segment* seg, cell pattern) {
+#ifdef FACTOR_DEBUG
+  cell clear_start = top_ptr + sizeof(cell);
+  cell clear_size = seg->end - clear_start;
+  memset_cell((void*)clear_start, pattern, clear_size);
+#endif
+}
+
 void context::reset() {
   reset_datastack();
   reset_retainstack();
index b898d78c0b069b4149736b3a3a1a0eebecdb6853..b9e04fe3022474e63f394b477270b97d1b7a5fe2 100644 (file)
@@ -48,6 +48,7 @@ struct context {
   void reset_context_objects();
   void reset();
   void fix_stacks();
+  void fill_stack_seg(cell top_ptr, segment* seg, cell pattern);
 
   cell peek() { return *(cell*)datastack; }
 
index 6db92c592e82c7070c8ecfaace05498f1041047a..7bd7a1c7ea0684179fe5dca54704a908ee77890a 100644 (file)
@@ -381,23 +381,19 @@ void slot_visitor<Fixup>::visit_context(context* ctx) {
      stacks. */
   visit_callstack(ctx);
 
-  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);
+  cell ds_ptr = ctx->datastack;
+  cell rs_ptr = ctx->retainstack;
+  segment* ds_seg = ctx->datastack_seg;
+  segment* rs_seg = ctx->retainstack_seg;
+  visit_stack_elements(ds_seg, (cell*)ds_ptr);
+  visit_stack_elements(rs_seg, (cell*)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
+  ctx->fill_stack_seg(ds_ptr, ds_seg, 0xbaadbadd);
+  ctx->fill_stack_seg(rs_ptr, rs_seg, 0xdaabdaab);
 }
 
 template <typename Fixup> void slot_visitor<Fixup>::visit_contexts() {