]> Cypherpunks repositories - gostls13.git/commitdiff
gc: fix init of packages named main
authorGustavo Niemeyer <gustavo@niemeyer.net>
Wed, 2 Mar 2011 21:18:17 +0000 (16:18 -0500)
committerRuss Cox <rsc@golang.org>
Wed, 2 Mar 2011 21:18:17 +0000 (16:18 -0500)
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

src/cmd/gc/export.c
src/cmd/gc/init.c
src/cmd/gc/subr.c
test/init.go [new file with mode: 0644]

index 594509915ee2fdce5fe2e45ea8ff78e7b04da912..09b963f271ed6b967c5d0a8a39f5b2ec64e3b55b 100644 (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);
index dc073443e010bddee4a8b3c71bcf481d4e928665..af4eb03360730b1091b31e4933aafffb82f76daa 100644 (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;
index 94e6dc5d52334dadbadce21f8049ed63dc5ca88a..142e5ba41efb063ce6663aca6fb61ddfa2cdf79a 100644 (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;
diff --git a/test/init.go b/test/init.go
new file mode 100644 (file)
index 0000000..b6c8c97
--- /dev/null
@@ -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"
+}