VM: after reset_datastack and retainstack clear the stack segment. makes
it easier to find bad accesses to shadow datadb4
							parent
							
								
									183ec83a6d
								
							
						
					
					
						commit
						8e1f3a0e51
					
				| 
						 | 
				
			
			@ -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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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; }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue