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 /src/core/scanner.c | |
| 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>
Diffstat (limited to 'src/core/scanner.c')
| -rw-r--r-- | src/core/scanner.c | 2 |
1 files changed, 1 insertions, 1 deletions
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, |
