/* Used by callback trampolines after saving the callback args on
the CStack. */
SCM * saved_stack_pointer, * saved_last_return_code;
+ unsigned long saved_prev_restore_history_offset;
unsigned long nargs = GET_LEXPR_ACTUALS;
if (run_callback == SHARP_F)
SET_EXP (c_call_continue);
SAVE_CONT ();
- saved_last_return_code = last_return_code;
saved_stack_pointer = stack_pointer;
+ saved_last_return_code = last_return_code;
+ saved_prev_restore_history_offset = prev_restore_history_offset;
Will_Push ((2 * CONTINUATION_SIZE) + STACK_ENV_EXTRA_SLOTS + 1);
SET_RC (RC_END_OF_COMPUTATION);
SET_EXP (run_callback);
SET_EXP (run_callback);
SAVE_CONT ();
Pushed ();
- SET_EXP (SHARP_F); /* fall through to pop_return */
+ last_return_code = stack_pointer;
+ SET_EXP (SHARP_F);
Re_Enter_Interpreter ();
if (stack_pointer != saved_stack_pointer
|| ((STACK_REF (3)) != c_call_continue)
#endif
)
- signal_error_from_primitive (ERR_STACK_HAS_SLIPPED);
- /*NOTREACHED*/
+ {
+ SET_PRIMITIVE (c_call_continue);
+ SET_LEXPR_ACTUALS (0);
+ outf_error_line ("\nWarning: stack slipped in callback.");
+ signal_error_from_primitive (ERR_STACK_HAS_SLIPPED);
+ /*NOTREACHED*/
+ }
- last_return_code = saved_last_return_code;
stack_pointer = STACK_LOC (4);
+ last_return_code = saved_last_return_code;
+ if (prev_restore_history_offset != saved_prev_restore_history_offset)
+ {
+ outf_error_line ("Warning: restoring prev_restore_history_offset.");
+ prev_restore_history_offset = saved_prev_restore_history_offset;
+ }
SET_PRIMITIVE (c_call_continue);
SET_LEXPR_ACTUALS (nargs);