diff --git a/include/QF/progs.h b/include/QF/progs.h index 800e03816..a9d08a9af 100644 --- a/include/QF/progs.h +++ b/include/QF/progs.h @@ -99,14 +99,15 @@ void PR_RunError (progs_t *pr, const char *error, ...) __attribute__((format(PRI */ #define PR_RESET_PARAMS(pr) PR_SetupParams (pr, PR_MAX_PARAMS, 1) -/** \name Detouring Function Calls +/** \name Nested Function Calls These functions allow a builtin function that uses PR_CallFunction() to safely insert a call to another VM function. The +initialize diversion - required by Objective-QuakeC uses this. + required by Objective-QuakeC uses this, but any other nested call will + be similar. PR_PushFrame (pr); - __auto_type params = PR_SaveParams (pr); + auto params = PR_SaveParams (pr); ... set up parameters to detour_function PR_ExecuteProgram (pr, detour_function) PR_RestoreParams (pr, params); diff --git a/ruamoko/qwaq/builtins/graphics.c b/ruamoko/qwaq/builtins/graphics.c index bdf3b595a..220f0878a 100644 --- a/ruamoko/qwaq/builtins/graphics.c +++ b/ruamoko/qwaq/builtins/graphics.c @@ -171,12 +171,14 @@ event_handler (const IE_event_t *ie_event, void *_pr) num_params = (num_params + 3) / 4 + 2; PR_PushFrame (pr); + auto params = PR_SaveParams (pr); PR_SetupParams (pr, num_params, 2); auto event = &P_PACKED (pr, IE_event_t, 2); P_POINTER (pr, 0) = PR_SetPointer (pr, event); P_POINTER (pr, 1) = qcevent_data; *event = *ie_event; PR_ExecuteProgram (pr, qcevent); + PR_RestoreParams (pr, params); PR_PopFrame (pr); return R_INT (pr); }