diff options
Diffstat (limited to 'src/cmd/gc/lex.c')
-rw-r--r-- | src/cmd/gc/lex.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c index 45b1257fa..e79d3b0f8 100644 --- a/src/cmd/gc/lex.c +++ b/src/cmd/gc/lex.c @@ -405,7 +405,7 @@ void importfile(Val *f, int line) { Biobuf *imp; - char *file; + char *file, *p, *q; int32 c; int len; Strlit *path; @@ -423,6 +423,15 @@ importfile(Val *f, int line) errorexit(); } + // The package name main is no longer reserved, + // but we reserve the import path "main" to identify + // the main package, just as we reserve the import + // path "math" to identify the standard math package. + if(strcmp(f->u.sval->s, "main") == 0) { + yyerror("cannot import \"main\""); + errorexit(); + } + if(strcmp(f->u.sval->s, "unsafe") == 0) { if(safemode) { yyerror("cannot import package unsafe"); @@ -432,7 +441,7 @@ importfile(Val *f, int line) cannedimports("unsafe.6", unsafeimport); return; } - + path = f->u.sval; if(islocalname(path)) { cleanbuf = mal(strlen(pathname) + strlen(path->s) + 2); @@ -459,9 +468,24 @@ importfile(Val *f, int line) len = strlen(namebuf); if(len > 2 && namebuf[len-2] == '.' && namebuf[len-1] == 'a') { if(!skiptopkgdef(imp)) { - yyerror("import not package file: %s", namebuf); + yyerror("import %s: not a package file", file); + errorexit(); + } + } + + // check object header + p = Brdstr(imp, '\n', 1); + if(strcmp(p, "empty archive") != 0) { + if(strncmp(p, "go object ", 10) != 0) { + yyerror("import %s: not a go object file", file); errorexit(); } + q = smprint("%s %s %s", getgoos(), thestring, getgoversion()); + if(strcmp(p+10, q) != 0) { + yyerror("import %s: object is [%s] expected [%s]", file, p+10, q); + errorexit(); + } + free(q); } // assume files move (get installed) @@ -479,6 +503,7 @@ importfile(Val *f, int line) curio.infile = file; curio.nlsemi = 0; typecheckok = 1; + for(;;) { c = getc(); if(c == EOF) |