aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo Niemeyer <gustavo@niemeyer.net>2011-03-02 16:18:17 -0500
committerRuss Cox <rsc@golang.org>2011-03-02 16:18:17 -0500
commitdaffc2d2ef1b68eae0a7e79d015fe33339f19534 (patch)
tree628224fbc772bd6d34275fab33fb3aeba28cdf5a
parentff1d89d6003272585093cfbab630c534fbba69bd (diff)
downloadgo-daffc2d2ef1b68eae0a7e79d015fe33339f19534.tar.gz
go-daffc2d2ef1b68eae0a7e79d015fe33339f19534.zip
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
-rw-r--r--src/cmd/gc/export.c12
-rw-r--r--src/cmd/gc/init.c27
-rw-r--r--src/cmd/gc/subr.c2
-rw-r--r--test/init.go18
4 files changed, 39 insertions, 20 deletions
diff --git a/src/cmd/gc/export.c b/src/cmd/gc/export.c
index 594509915e..09b963f271 100644
--- a/src/cmd/gc/export.c
+++ b/src/cmd/gc/export.c
@@ -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);
diff --git a/src/cmd/gc/init.c b/src/cmd/gc/init.c
index dc073443e0..af4eb03360 100644
--- a/src/cmd/gc/init.c
+++ b/src/cmd/gc/init.c
@@ -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;
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 94e6dc5d52..142e5ba41e 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -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;
diff --git a/test/init.go b/test/init.go
new file mode 100644
index 0000000000..b6c8c97063
--- /dev/null
+++ b/test/init.go
@@ -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"
+}