diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-28 19:56:42 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-28 19:56:42 +0200 |
| commit | 16d58ebac0ea1250055b046414b40549426eeb84 (patch) | |
| tree | ddda72dcef4c44411f6c313c2c03ac09bda50a34 | |
| parent | 6bcaef138f13f9894abe3790aca52591a3d2d1f6 (diff) | |
Fix function body literal mutation: make examples pass
Two bugs combined to break uber.fy and any function called more than once:
1. Scanner split identifiers at '_' boundaries (e.g. arr_sum → arr + _sum).
Fixed by adding d != '_' to the token-splitting guard condition so
underscores are treated as part of identifiers.
2. Dead keyword TT_ARR reserved the name 'arr' as a keyword token,
preventing its use as a function parameter. Removed TT_ARR from the
enum, keyword table, and name table.
3. (Root cause of the assert failure) _var_assign stored the symbol for a
newly declared variable pointing directly at the literal token from the
function body token list. incr/decr modify tokens in place via
stack_top, so a loop like `my i = 0; while i < n { incr i; }` would
corrupt the body's '0' literal — on the next call i starts at 10 instead
of 0. Fixed by allocating a fresh token_new_integer / token_new_dummy
for TT_INTEGER and TT_DOUBLE initialisers so body literals are never
mutated. Arrays and strings retain reference semantics unchanged.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| -rw-r--r-- | docs/help.txt | 2 | ||||
| -rw-r--r-- | docs/stats.txt | 2 | ||||
| -rw-r--r-- | docs/version.txt | 2 | ||||
| -rwxr-xr-x | fype | bin | 287944 -> 287912 bytes | |||
| -rw-r--r-- | src/build.h | 2 | ||||
| -rw-r--r-- | src/core/interpret.c | 14 | ||||
| -rw-r--r-- | src/core/scanner.c | 2 | ||||
| -rw-r--r-- | src/core/token.c | 2 | ||||
| -rw-r--r-- | src/core/token.h | 1 |
9 files changed, 18 insertions, 9 deletions
diff --git a/docs/help.txt b/docs/help.txt index 4c3ded3..204cbd3 100644 --- a/docs/help.txt +++ b/docs/help.txt @@ -1,4 +1,4 @@ -Fype Superalpha Build 9705 +Fype Superalpha Build 9720 (c) Paul C. Buetow (2005 - 2008) <fype@dev.buetow.org> -e Executes given code string (see synopses) -h Prints this help diff --git a/docs/stats.txt b/docs/stats.txt index e4a2d10..09e90e9 100644 --- a/docs/stats.txt +++ b/docs/stats.txt @@ -1,6 +1,6 @@ make[1]: Entering directory '/home/paul/git/fype' ===> Num of C source files : 46 -===> Num of C source lines : 8744 +===> Num of C source lines : 8753 ===> Num of Fype source examples : 19 ===> Num of Fype source lines : 883 make[1]: Leaving directory '/home/paul/git/fype' diff --git a/docs/version.txt b/docs/version.txt index baab03e..646d854 100644 --- a/docs/version.txt +++ b/docs/version.txt @@ -1 +1 @@ -Fype Superalpha Build 9705 +Fype Superalpha Build 9720 Binary files differdiff --git a/src/build.h b/src/build.h index cd6ed73..7e13941 100644 --- a/src/build.h +++ b/src/build.h @@ -36,7 +36,7 @@ #ifndef BUILD_H #define BUILD_H -#define BUILDNR 9709 +#define BUILDNR 9731 #define OS_LINUX #endif diff --git a/src/core/interpret.c b/src/core/interpret.c index 7fc9334..38464f8 100644 --- a/src/core/interpret.c +++ b/src/core/interpret.c @@ -267,7 +267,19 @@ _var_assign(Interpret *p_interpret) { p_interpret->p_stack = p_stack; p_token = stack_top(p_interpret->p_stack); - Symbol *p_symbol = symbol_new(SYM_VARIABLE, p_token); + /* For scalar types, own a fresh token so that in-place + * mutations (incr/decr) don't corrupt the function body's + * literal tokens across repeated calls. Arrays and strings + * keep reference semantics as-is. */ + Token *p_own = p_token; + if (token_get_tt(p_token) == TT_INTEGER) { + p_own = token_new_integer(token_get_ival(p_token)); + } else if (token_get_tt(p_token) == TT_DOUBLE) { + p_own = token_new_dummy(); + token_set_tt(p_own, TT_DOUBLE); + token_set_dval(p_own, token_get_dval(p_token)); + } + Symbol *p_symbol = symbol_new(SYM_VARIABLE, p_own); scope_newset(p_interpret->p_scope, c_name, p_symbol); } else { return (0); diff --git a/src/core/scanner.c b/src/core/scanner.c index 87fc624..7eecb01 100644 --- a/src/core/scanner.c +++ b/src/core/scanner.c @@ -287,7 +287,7 @@ scanner_run(List *p_list_token, Tupel *p_tupel_argv, _add_semicolon_to_list(p_scanner); char d = c_token[i_token_len-1]; - if ((!isalpha(d) && !isdigit(d) /*&& d != '-'*/) && + if ((!isalpha(d) && !isdigit(d) && d != '_' /*&& d != '-'*/) && (isalpha(c) || isdigit(c))) { scanner_add_token(p_scanner, &c_token, &i_token_len, diff --git a/src/core/token.c b/src/core/token.c index f7cc745..b31bed9 100644 --- a/src/core/token.c +++ b/src/core/token.c @@ -61,7 +61,6 @@ get_tt(char *c_token) { CHECK("proc") TT_PROC; CHECK("fun") TT_FUNC; CHECK("my") TT_MY; - CHECK("arr") TT_ARR; CHECK("!") TT_NOT; CHECK("!=") TT_NEQ; CHECK("=~") TT_RE; @@ -127,7 +126,6 @@ tt_get_name(TokenType tt_cur) { CASE(TT_PROC,"TT_PROC") CASE(TT_FUNC,"TT_FUNC") CASE(TT_MY,"TT_MY") - CASE(TT_ARR,"TT_ARR") CASE(TT_WHILE,"TT_WHILE") CASE(TT_UNTIL,"TT_UNTIL") CASE(TT_NEXT,"TT_NEXT") diff --git a/src/core/token.h b/src/core/token.h index 497dc78..b7e77a9 100644 --- a/src/core/token.h +++ b/src/core/token.h @@ -101,7 +101,6 @@ typedef enum { TT_PROC, TT_FUNC, TT_MY, - TT_ARR, TT_WHILE, TT_UNTIL, TT_NEXT, |
