vm: fix crash when doing GC with profiling enabled
parent
1aec1ce9b9
commit
7b35f82bf4
|
@ -19,25 +19,29 @@ void factor_vm::c_to_factor(cell quot)
|
|||
c_to_factor_func(quot);
|
||||
}
|
||||
|
||||
template<typename Func> Func factor_vm::get_entry_point(cell n)
|
||||
{
|
||||
/* We return word->code->entry_point() and not word->entry_point,
|
||||
because if profiling is enabled, we don't want to go through the
|
||||
entry point's profiling stub. This clobbers registers, since entry
|
||||
points use the C ABI and not the Factor ABI. */
|
||||
tagged<word> entry_point_word(special_objects[n]);
|
||||
return (Func)entry_point_word->code->entry_point();
|
||||
}
|
||||
|
||||
void factor_vm::unwind_native_frames(cell quot, stack_frame *to)
|
||||
{
|
||||
tagged<word> unwind_native_frames_word(special_objects[UNWIND_NATIVE_FRAMES_WORD]);
|
||||
unwind_native_frames_func_type unwind_native_frames_func = (unwind_native_frames_func_type)unwind_native_frames_word->entry_point;
|
||||
unwind_native_frames_func(quot,to);
|
||||
get_entry_point<unwind_native_frames_func_type>(UNWIND_NATIVE_FRAMES_WORD)(quot,to);
|
||||
}
|
||||
|
||||
cell factor_vm::get_fpu_state()
|
||||
{
|
||||
tagged<word> get_fpu_state_word(special_objects[GET_FPU_STATE_WORD]);
|
||||
get_fpu_state_func_type get_fpu_state_func = (get_fpu_state_func_type)get_fpu_state_word->entry_point;
|
||||
return get_fpu_state_func();
|
||||
return get_entry_point<get_fpu_state_func_type>(GET_FPU_STATE_WORD)();
|
||||
}
|
||||
|
||||
void factor_vm::set_fpu_state(cell state)
|
||||
{
|
||||
tagged<word> set_fpu_state_word(special_objects[SET_FPU_STATE_WORD]);
|
||||
set_fpu_state_func_type set_fpu_state_func = (set_fpu_state_func_type)set_fpu_state_word->entry_point;
|
||||
set_fpu_state_func(state);
|
||||
get_entry_point<set_fpu_state_func_type>(GET_FPU_STATE_WORD)(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue