From 3f3db5422397f1bf8d5af1ade256638d89b1081c Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Sun, 23 Aug 2026 21:51:48 +0200 Subject: functions that can tail-call must be tail-called as well Otherwise we could "leak" stack frames, which causes crashes on platforms with small stack sizes. This still did not result in a reproducable speedup with GCC 16. fixup 2e097cec409182c3cb39b74489387480bf8a278f --- src/core-commands.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'src/core-commands.c') diff --git a/src/core-commands.c b/src/core-commands.c index d01cbb9..d850c14 100644 --- a/src/core-commands.c +++ b/src/core-commands.c @@ -914,10 +914,8 @@ teco_state_start_input(teco_machine_main_t *ctx, gunichar chr, GError **error) /* * commands implemented in teco_state_control */ - if (TECO_IS_CTL(chr)) { - teco_state_t *next = teco_state_control_input(ctx, TECO_CTL_ECHO(chr), error); - TECO_RETURN(ctx, next, error); - } + if (TECO_IS_CTL(chr)) + TECO_TAIL return teco_state_control_input(ctx, TECO_CTL_ECHO(chr), error); } teco_state_t *next = teco_machine_main_transition_input(ctx, transitions, G_N_ELEMENTS(transitions), @@ -1828,7 +1826,7 @@ TECO_DEFINE_STATE(teco_state_ascii, * at the expense of yet another parser state. */ static teco_state_t * -teco_return(teco_machine_main_t *ctx, GError **error) +teco_throw_return(teco_machine_main_t *ctx, GError **error) { g_assert(ctx->flags.mode == TECO_MODE_NORMAL); @@ -1871,9 +1869,11 @@ teco_return(teco_machine_main_t *ctx, GError **error) static teco_state_t * teco_state_escape_input(teco_machine_main_t *ctx, gunichar chr, GError **error) { - if (chr == '\e' || chr == '$') - return ctx->flags.mode > TECO_MODE_NORMAL - ? &teco_state_start : teco_return(ctx, error); + if (chr == '\e' || chr == '$') { + if (ctx->flags.mode > TECO_MODE_NORMAL) + TECO_RETURN(ctx, &teco_state_start, error); + return teco_throw_return(ctx, error); + } /* * Alternatives: ^[, , , $ (dollar) @@ -1900,7 +1900,7 @@ teco_state_escape_input(teco_machine_main_t *ctx, gunichar chr, GError **error) if (ctx->flags.mode == TECO_MODE_NORMAL && !teco_expressions_discard_args(error)) return NULL; - return teco_state_start_input(ctx, chr, error); + TECO_TAIL return teco_state_start_input(ctx, chr, error); } static gboolean @@ -1940,12 +1940,13 @@ static teco_state_t * teco_state_ctlc_input(teco_machine_main_t *ctx, gunichar chr, GError **error) { switch (chr) { - case TECO_CTL_KEY('C'): return teco_state_ctlc_control_input(ctx, 'C', error); + case TECO_CTL_KEY('C'): TECO_TAIL return teco_state_ctlc_control_input(ctx, 'C', error); case '^': TECO_RETURN(ctx, &teco_state_ctlc_control, error); } - return ctx->flags.mode > TECO_MODE_NORMAL - ? teco_state_start_input(ctx, chr, error) : teco_return(ctx, error); + if (ctx->flags.mode > TECO_MODE_NORMAL) + TECO_TAIL return teco_state_start_input(ctx, chr, error); + return teco_throw_return(ctx, error); } static gboolean @@ -2009,8 +2010,9 @@ teco_state_ctlc_control_input(teco_machine_main_t *ctx, gunichar chr, GError **e return NULL; } - return ctx->flags.mode > TECO_MODE_NORMAL - ? teco_state_control_input(ctx, chr, error) : teco_return(ctx, error); + if (ctx->flags.mode > TECO_MODE_NORMAL) + TECO_TAIL return teco_state_control_input(ctx, chr, error); + return teco_throw_return(ctx, error); } /* -- cgit v1.2.3