mirror of
https://github.com/golang/go
synced 2024-11-21 15:04:44 -07:00
gc: fix init of packages named main
This change removes the special case which existed for handling the initalization of the main package, so that other modules named 'main' get properly initialized when imported. Note that gotest of main packages will break in most cases without this. R=rsc CC=golang-dev https://golang.org/cl/4190050
This commit is contained in:
parent
ff1d89d600
commit
daffc2d2ef
@ -51,6 +51,12 @@ exportname(char *s)
|
||||
return isupperrune(r);
|
||||
}
|
||||
|
||||
static int
|
||||
initname(char *s)
|
||||
{
|
||||
return strcmp(s, "init") == 0;
|
||||
}
|
||||
|
||||
void
|
||||
autoexport(Node *n, int ctxt)
|
||||
{
|
||||
@ -60,7 +66,7 @@ autoexport(Node *n, int ctxt)
|
||||
return;
|
||||
if(n->ntype && n->ntype->op == OTFUNC && n->ntype->left) // method
|
||||
return;
|
||||
if(exportname(n->sym->name) || strcmp(n->sym->name, "init") == 0)
|
||||
if(exportname(n->sym->name) || initname(n->sym->name))
|
||||
exportsym(n);
|
||||
else
|
||||
packagesym(n);
|
||||
@ -304,7 +310,7 @@ importsym(Sym *s, int op)
|
||||
|
||||
// mark the symbol so it is not reexported
|
||||
if(s->def == N) {
|
||||
if(exportname(s->name))
|
||||
if(exportname(s->name) || initname(s->name))
|
||||
s->flags |= SymExport;
|
||||
else
|
||||
s->flags |= SymPackage; // package scope
|
||||
@ -374,7 +380,7 @@ importvar(Sym *s, Type *t, int ctxt)
|
||||
{
|
||||
Node *n;
|
||||
|
||||
if(!exportname(s->name) && !mypackage(s))
|
||||
if(!exportname(s->name) && !initname(s->name) && !mypackage(s))
|
||||
return;
|
||||
|
||||
importsym(s, ONAME);
|
||||
|
@ -30,19 +30,19 @@ renameinit(Node *n)
|
||||
|
||||
/*
|
||||
* hand-craft the following initialization code
|
||||
* var initdone·<file> uint8 (1)
|
||||
* func Init·<file>() (2)
|
||||
* if initdone·<file> != 0 { (3)
|
||||
* if initdone·<file> == 2 (4)
|
||||
* var initdone· uint8 (1)
|
||||
* func init() (2)
|
||||
* if initdone· != 0 { (3)
|
||||
* if initdone· == 2 (4)
|
||||
* return
|
||||
* throw(); (5)
|
||||
* }
|
||||
* initdone.<file> = 1; (6)
|
||||
* initdone· = 1; (6)
|
||||
* // over all matching imported symbols
|
||||
* <pkg>.init·<file>() (7)
|
||||
* <pkg>.init() (7)
|
||||
* { <init stmts> } (8)
|
||||
* init·<file>() // if any (9)
|
||||
* initdone.<file> = 2; (10)
|
||||
* init·<n>() // if any (9)
|
||||
* initdone· = 2; (10)
|
||||
* return (11)
|
||||
* }
|
||||
*/
|
||||
@ -79,7 +79,7 @@ anyinit(NodeList *n)
|
||||
// are there any imported init functions
|
||||
for(h=0; h<NHASH; h++)
|
||||
for(s = hash[h]; s != S; s = s->link) {
|
||||
if(s->name[0] != 'I' || strncmp(s->name, "Init·", 6) != 0)
|
||||
if(s->name[0] != 'i' || strcmp(s->name, "init") != 0)
|
||||
continue;
|
||||
if(s->def == N)
|
||||
continue;
|
||||
@ -118,12 +118,7 @@ fninit(NodeList *n)
|
||||
|
||||
// (2)
|
||||
maxarg = 0;
|
||||
snprint(namebuf, sizeof(namebuf), "Init·");
|
||||
|
||||
// this is a botch since we need a known name to
|
||||
// call the top level init function out of rt0
|
||||
if(strcmp(localpkg->name, "main") == 0)
|
||||
snprint(namebuf, sizeof(namebuf), "init");
|
||||
snprint(namebuf, sizeof(namebuf), "init");
|
||||
|
||||
fn = nod(ODCLFUNC, N, N);
|
||||
initsym = lookup(namebuf);
|
||||
@ -154,7 +149,7 @@ fninit(NodeList *n)
|
||||
// (7)
|
||||
for(h=0; h<NHASH; h++)
|
||||
for(s = hash[h]; s != S; s = s->link) {
|
||||
if(s->name[0] != 'I' || strncmp(s->name, "Init·", 6) != 0)
|
||||
if(s->name[0] != 'i' || strcmp(s->name, "init") != 0)
|
||||
continue;
|
||||
if(s->def == N)
|
||||
continue;
|
||||
|
@ -2268,7 +2268,7 @@ syslook(char *name, int copy)
|
||||
|
||||
s = pkglookup(name, runtimepkg);
|
||||
if(s == S || s->def == N)
|
||||
fatal("looksys: cant find runtime.%s", name);
|
||||
fatal("syslook: can't find runtime.%s", name);
|
||||
|
||||
if(!copy)
|
||||
return s->def;
|
||||
|
18
test/init.go
Normal file
18
test/init.go
Normal file
@ -0,0 +1,18 @@
|
||||
// errchk $G -e $D/$F.go
|
||||
|
||||
// Copyright 2011 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package main
|
||||
|
||||
import "runtime"
|
||||
|
||||
func init() {
|
||||
}
|
||||
|
||||
func main() {
|
||||
init() // ERROR "undefined: init"
|
||||
runtime.init() // ERROR "unexported.*runtime\.init"
|
||||
var _ = init // ERROR "undefined: init"
|
||||
}
|
Loading…
Reference in New Issue
Block a user