wcc+ww: //ww:module-reset boundary directive; package-less files keep module "" (#16 PREP-main)
Driver twins emit the line-comment directive only before package-less files (peekpackage==nil); both lexers tokenize it (TK_MODRESET, appended =87 so existing token values hold) and both parsers reset curmod — a package-less file's decls get module "" instead of inheriting the last bundled package (the sticky-curmod leak, task #11). Withdrawn alternative: injecting 'package main' flips non-entry symbols bare->main-prefixed (FFI-visible, broke 764). Codegen-neutral by proof: bare symbols preserved, both stages emit byte-identical asm for a directive-bearing combined. Transitional until strict-package rejects package-less files outright. Includes 737 bad-deep pin for the PREP-peek >2048 edge + 904/toktest rows for the new token.
This commit is contained in:
@@ -306,6 +306,19 @@ expand(FILE *out, const char *path, struct ImportSet *visited,
|
||||
else expand(out, ipath, visited, libdir);
|
||||
}
|
||||
|
||||
/* #16 option-B: a package-less file's decls would otherwise inherit
|
||||
* the preceding bundled module's sticky curmod (parser parse.c). Emit
|
||||
* a curmod-reset boundary directive so the lexer/parser attribute the
|
||||
* file to the primary module ("") — fixes the self-import false-fire
|
||||
* and the leaked-prefix bug, codegen-neutral (bare symbols kept; not
|
||||
* `package main`, which would main-prefix them). A packaged file's own
|
||||
* `package` decl already sets curmod, so it needs nothing — keeping
|
||||
* the directive out of every tracked combined.ww. (Task #11.) */
|
||||
{
|
||||
char pkg[128];
|
||||
if (!peek_package(path, pkg, sizeof pkg))
|
||||
fputs("//ww:module-reset\n", out);
|
||||
}
|
||||
rewind(in);
|
||||
int ch;
|
||||
while ((ch = fgetc(in)) != EOF) fputc(ch, out);
|
||||
|
||||
Reference in New Issue
Block a user