vm: callstack_reversed in code_block_visitor
							parent
							
								
									d12b6e375b
								
							
						
					
					
						commit
						e6a80aa9aa
					
				| 
						 | 
					@ -40,7 +40,8 @@ void factor_vm::iterate_callstack_object_reversed(callstack *stack_,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename Iterator> void factor_vm::iterate_callstack_object(callstack *stack_, Iterator &iterator)
 | 
					template<typename Iterator> void factor_vm::iterate_callstack_object(callstack *stack_,
 | 
				
			||||||
 | 
						Iterator &iterator)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	data_root<callstack> stack(stack_,this);
 | 
						data_root<callstack> stack(stack_,this);
 | 
				
			||||||
	fixnum frame_offset = factor::untag_fixnum(stack->length) - sizeof(stack_frame);
 | 
						fixnum frame_offset = factor::untag_fixnum(stack->length) - sizeof(stack_frame);
 | 
				
			||||||
| 
						 | 
					@ -53,6 +54,39 @@ template<typename Iterator> void factor_vm::iterate_callstack_object(callstack *
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename Iterator, typename Fixup>
 | 
				
			||||||
 | 
					void factor_vm::iterate_callstack_reversed(context *ctx, Iterator &iterator, Fixup &fixup)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (ctx->callstack_top == ctx->callstack_bottom)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						char *frame_top = (char*)ctx->callstack_top;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (frame_top < (char*)ctx->callstack_bottom)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							void *addr = frame_return_address((void*)frame_top);
 | 
				
			||||||
 | 
							FACTOR_ASSERT(addr != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void *fixed_addr = (void*)fixup.translate_code((code_block*)addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							code_block *owner = code->code_block_for_address((cell)fixed_addr);
 | 
				
			||||||
 | 
							cell frame_size = owner->stack_frame_size_for_address((cell)fixed_addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef FACTOR_DEBUG
 | 
				
			||||||
 | 
							// check our derived owner and frame size against the ones stored in the frame
 | 
				
			||||||
 | 
							// by the function prolog
 | 
				
			||||||
 | 
							stack_frame *frame = (stack_frame*)(frame_top + frame_size) - 1;
 | 
				
			||||||
 | 
							void *fixed_entry_point =
 | 
				
			||||||
 | 
								(void*)fixup.translate_code((code_block*)frame->entry_point);
 | 
				
			||||||
 | 
							FACTOR_ASSERT(owner->entry_point() == fixed_entry_point);
 | 
				
			||||||
 | 
							FACTOR_ASSERT(frame_size == frame->size);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							iterator(frame_top, owner, fixed_addr);
 | 
				
			||||||
 | 
							frame_top += frame_size;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename Iterator>
 | 
					template<typename Iterator>
 | 
				
			||||||
void factor_vm::iterate_callstack_reversed(context *ctx, Iterator &iterator)
 | 
					void factor_vm::iterate_callstack_reversed(context *ctx, Iterator &iterator)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,12 +42,13 @@ struct call_frame_code_block_visitor {
 | 
				
			||||||
	explicit call_frame_code_block_visitor(factor_vm *parent_, Fixup fixup_) :
 | 
						explicit call_frame_code_block_visitor(factor_vm *parent_, Fixup fixup_) :
 | 
				
			||||||
		parent(parent_), fixup(fixup_) {}
 | 
							parent(parent_), fixup(fixup_) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void operator()(stack_frame *frame)
 | 
						void operator()(void *frame_top, code_block *owner, void *addr)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		cell offset = parent->frame_offset(frame);
 | 
							set_frame_return_address(frame_top, addr);
 | 
				
			||||||
		code_block *compiled = fixup.fixup_code(parent->frame_code(frame));
 | 
							// XXX remove this when prolog data is removed
 | 
				
			||||||
		frame->entry_point = compiled->entry_point();
 | 
							cell frame_size = owner->stack_frame_size_for_address((cell)addr);
 | 
				
			||||||
		parent->set_frame_offset(frame,offset);
 | 
							stack_frame *frame = (stack_frame*)((char*)frame_top + frame_size) - 1;
 | 
				
			||||||
 | 
							frame->entry_point = owner->entry_point();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,7 +75,7 @@ void code_block_visitor<Fixup>::visit_object_code_block(object *obj)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			callstack *stack = (callstack *)obj;
 | 
								callstack *stack = (callstack *)obj;
 | 
				
			||||||
			call_frame_code_block_visitor<Fixup> call_frame_visitor(parent,fixup);
 | 
								call_frame_code_block_visitor<Fixup> call_frame_visitor(parent,fixup);
 | 
				
			||||||
			parent->iterate_callstack_object(stack,call_frame_visitor);
 | 
								parent->iterate_callstack_object_reversed(stack,call_frame_visitor,fixup);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -110,7 +111,7 @@ template<typename Fixup>
 | 
				
			||||||
void code_block_visitor<Fixup>::visit_context_code_blocks()
 | 
					void code_block_visitor<Fixup>::visit_context_code_blocks()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	call_frame_code_block_visitor<Fixup> call_frame_visitor(parent,fixup);
 | 
						call_frame_code_block_visitor<Fixup> call_frame_visitor(parent,fixup);
 | 
				
			||||||
	parent->iterate_active_callstacks(call_frame_visitor);
 | 
						parent->iterate_active_callstacks_reversed(call_frame_visitor,fixup);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename Fixup>
 | 
					template<typename Fixup>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,9 +8,9 @@ inline static void* frame_return_address(void *frame_top)
 | 
				
			||||||
	return *(void**)frame_top;
 | 
						return *(void**)frame_top;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline static void set_frame_return_address(void *frame_top, cell return_address)
 | 
					inline static void set_frame_return_address(void *frame_top, void *return_address)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	*(cell*)frame_top = return_address;
 | 
						*(void**)frame_top = return_address;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CALLSTACK_BOTTOM(ctx) (stack_frame *)(ctx->callstack_seg->end - sizeof(cell) * 5)
 | 
					#define CALLSTACK_BOTTOM(ctx) (stack_frame *)(ctx->callstack_seg->end - sizeof(cell) * 5)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -614,6 +614,8 @@ void factor_vm::factorbug()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else if(strcmp(cmd,"code") == 0)
 | 
							else if(strcmp(cmd,"code") == 0)
 | 
				
			||||||
			dump_code_heap();
 | 
								dump_code_heap();
 | 
				
			||||||
 | 
							else if(strcmp(cmd,"compact-gc") == 0)
 | 
				
			||||||
 | 
								primitive_compact_gc();
 | 
				
			||||||
		else if(strcmp(cmd,"gc") == 0)
 | 
							else if(strcmp(cmd,"gc") == 0)
 | 
				
			||||||
			primitive_full_gc();
 | 
								primitive_full_gc();
 | 
				
			||||||
		else if(strcmp(cmd,"compact-gc") == 0)
 | 
							else if(strcmp(cmd,"compact-gc") == 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -130,12 +130,13 @@ template<typename Block> struct mark_bits {
 | 
				
			||||||
		//FACTOR_ASSERT(marked_p(original));
 | 
							//FACTOR_ASSERT(marked_p(original));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		std::pair<cell,cell> position = bitmap_deref(original);
 | 
							std::pair<cell,cell> position = bitmap_deref(original);
 | 
				
			||||||
 | 
							cell offset = (cell)original & (data_alignment - 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		cell approx_popcount = forwarding[position.first];
 | 
							cell approx_popcount = forwarding[position.first];
 | 
				
			||||||
		cell mask = ((cell)1 << position.second) - 1;
 | 
							cell mask = ((cell)1 << position.second) - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		cell new_line_number = approx_popcount + popcount(marked[position.first] & mask);
 | 
							cell new_line_number = approx_popcount + popcount(marked[position.first] & mask);
 | 
				
			||||||
		Block *new_block = line_block(new_line_number);
 | 
							Block *new_block = (Block*)((char*)line_block(new_line_number) + offset);
 | 
				
			||||||
#ifdef FACTOR_DEBUG
 | 
					#ifdef FACTOR_DEBUG
 | 
				
			||||||
		FACTOR_ASSERT(new_block <= original);
 | 
							FACTOR_ASSERT(new_block <= original);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -373,7 +373,7 @@ template<typename Fixup>
 | 
				
			||||||
void slot_visitor<Fixup>::visit_callstack(context *ctx)
 | 
					void slot_visitor<Fixup>::visit_callstack(context *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	call_frame_slot_visitor<Fixup> call_frame_visitor(parent,this);
 | 
						call_frame_slot_visitor<Fixup> call_frame_visitor(parent,this);
 | 
				
			||||||
	parent->iterate_callstack_reversed(ctx,call_frame_visitor);
 | 
						parent->iterate_callstack_reversed(ctx,call_frame_visitor,fixup);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename Fixup>
 | 
					template<typename Fixup>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										25
									
								
								vm/vm.hpp
								
								
								
								
							
							
						
						
									
										25
									
								
								vm/vm.hpp
								
								
								
								
							| 
						 | 
					@ -178,7 +178,8 @@ struct factor_vm
 | 
				
			||||||
	void primitive_check_datastack();
 | 
						void primitive_check_datastack();
 | 
				
			||||||
	void primitive_load_locals();
 | 
						void primitive_load_locals();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	template<typename Iterator> void iterate_active_callstacks(Iterator &iter)
 | 
						template<typename Iterator>
 | 
				
			||||||
 | 
						void iterate_active_callstacks(Iterator &iter)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		std::set<context *>::const_iterator begin = active_contexts.begin();
 | 
							std::set<context *>::const_iterator begin = active_contexts.begin();
 | 
				
			||||||
		std::set<context *>::const_iterator end = active_contexts.end();
 | 
							std::set<context *>::const_iterator end = active_contexts.end();
 | 
				
			||||||
| 
						 | 
					@ -188,6 +189,17 @@ struct factor_vm
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						template<typename Iterator, typename Fixup>
 | 
				
			||||||
 | 
						void iterate_active_callstacks_reversed(Iterator &iter, Fixup &fixup)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							std::set<context *>::const_iterator begin = active_contexts.begin();
 | 
				
			||||||
 | 
							std::set<context *>::const_iterator end = active_contexts.end();
 | 
				
			||||||
 | 
							while(begin != end)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								iterate_callstack_reversed(*begin++,iter,fixup);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// run
 | 
						// run
 | 
				
			||||||
	void primitive_exit();
 | 
						void primitive_exit();
 | 
				
			||||||
	void primitive_nano_count();
 | 
						void primitive_nano_count();
 | 
				
			||||||
| 
						 | 
					@ -648,8 +660,15 @@ struct factor_vm
 | 
				
			||||||
	void primitive_innermost_stack_frame_scan();
 | 
						void primitive_innermost_stack_frame_scan();
 | 
				
			||||||
	void primitive_set_innermost_stack_frame_quot();
 | 
						void primitive_set_innermost_stack_frame_quot();
 | 
				
			||||||
	void primitive_callstack_bounds();
 | 
						void primitive_callstack_bounds();
 | 
				
			||||||
	template<typename Iterator> void iterate_callstack_reversed(context *ctx, Iterator &iterator);
 | 
					
 | 
				
			||||||
	template<typename Iterator> void iterate_callstack(context *ctx, Iterator &iterator);
 | 
						template<typename Iterator>
 | 
				
			||||||
 | 
						void iterate_callstack_reversed(context *ctx, Iterator &iterator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						template<typename Iterator, typename Fixup>
 | 
				
			||||||
 | 
						void iterate_callstack_reversed(context *ctx, Iterator &iterator, Fixup &fixup);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						template<typename Iterator>
 | 
				
			||||||
 | 
						void iterate_callstack(context *ctx, Iterator &iterator);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// cpu-*
 | 
						// cpu-*
 | 
				
			||||||
	void dispatch_signal_handler(cell *sp, cell *pc, cell newpc);
 | 
						void dispatch_signal_handler(cell *sp, cell *pc, cell newpc);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue