1
0
mirror of https://github.com/golang/go synced 2024-11-11 18:51:37 -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:
Gustavo Niemeyer 2011-03-02 16:18:17 -05:00 committed by Russ Cox
parent ff1d89d600
commit daffc2d2ef
4 changed files with 39 additions and 20 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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
View 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"
}