File the scanned line in RUNSTREAM, not the raw one
process_line_runstream() chose between the stripped line and the raw buffer on obj->mode == AKBASIC_MODE_REPL, but nothing reaches that function except the RUNSTREAM arm of step(). The stripped branch was dead, so every program the driver ran from a file was stored with its own line number inside source[]: LIST printed "10 10 PRINT", and DSAVE and HELP would have echoed it the same way. No .bas in either corpus calls LIST, and runtime_verbs.c's load() helper -- which claims to load "the way RUNSTREAM would" -- already stored the scanned line, so it encoded the correct contract and could not catch the wrong one. The new test drives the real sink path instead. Keep the step-over-a-leading-number allowance in scan_line_labels() and skip_lineno(): no path inside the library stores a raw line now, but akbasic_runtime_store_line() is public and a host may hand it one. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -42,9 +42,9 @@ static const char *skip_space(const char *cursor)
|
||||
/**
|
||||
* @brief Step over a stored line's own line number, if it still carries one.
|
||||
*
|
||||
* A line arrives either from akbasic_runtime_load(), which files what the
|
||||
* scanner already stripped, or from RUNSTREAM, which files the raw text. Both
|
||||
* spellings are real, so both are handled here -- the same allowance
|
||||
* Every path inside the library files what the scanner already stripped, but
|
||||
* akbasic_runtime_store_line() is public and a host may hand it a raw line, so
|
||||
* both spellings are real and both are handled here -- the same allowance
|
||||
* scan_line_labels() makes.
|
||||
*/
|
||||
static const char *skip_lineno(const char *cursor)
|
||||
|
||||
Reference in New Issue
Block a user