Commit 0183baaf authored by Russ Cox's avatar Russ Cox

* delete export

* rename init functions

R=ken
OCL=23122
CL=23126
parent 8f14451f
......@@ -329,8 +329,8 @@ bad:
* a function named init is a special case.
* it is called by the initialization before
* main is run. to make it unique within a
* package, the name, normally "pkg.init", is
* altered to "pkg.<file>_init".
* package and also uncallable, the name,
* normally "pkg.init", is altered to "pkg.init·filename".
*/
Node*
renameinit(Node *n)
......@@ -342,7 +342,8 @@ renameinit(Node *n)
return n;
if(strcmp(s->name, "init") != 0)
return n;
snprint(namebuf, sizeof(namebuf), "init_%s", filename);
snprint(namebuf, sizeof(namebuf), "init·%s", filename);
s = lookup(namebuf);
return newname(s);
}
......@@ -1022,17 +1023,16 @@ mixed:
}
// hand-craft the following initialization code
// var init_<file>_done bool; (1)
// func init_<file>_function() (2)
// if init_<file>_done { return } (3)
// init_<file>_done = true; (4)
// var initdone·<file> bool (1)
// func Init·<file>() (2)
// if initdone·<file> { return } (3)
// initdone.<file> = true; (4)
// // over all matching imported symbols
// <pkg>.init_<file>_function() (5)
// <pkg>.init·<file>() (5)
// { <init stmts> } (6)
// init() // if any (7)
// init·<file>() // if any (7)
// return (8)
// }
// export init_<file>_function (9)
void
fninit(Node *n)
......@@ -1045,7 +1045,7 @@ fninit(Node *n)
r = N;
// (1)
snprint(namebuf, sizeof(namebuf), "init_%s_done", filename);
snprint(namebuf, sizeof(namebuf), "initdone·%s", filename);
done = newname(lookup(namebuf));
addvar(done, types[TBOOL], PEXTERN);
......@@ -1054,12 +1054,12 @@ fninit(Node *n)
maxarg = 0;
stksize = initstksize;
snprint(namebuf, sizeof(namebuf), "init_%s_function", filename);
snprint(namebuf, sizeof(namebuf), "Init·%s", filename);
// this is a botch since we need a known name to
// call the top level init function out of rt0
if(strcmp(package, "main") == 0)
snprint(namebuf, sizeof(namebuf), "init_function");
snprint(namebuf, sizeof(namebuf), "init");
fn = nod(ODCLFUNC, N, N);
fn->nname = newname(lookup(namebuf));
......@@ -1079,11 +1079,7 @@ fninit(Node *n)
// (5)
for(h=0; h<NHASH; h++)
for(s = hash[h]; s != S; s = s->link) {
if(s->name[0] != 'i')
continue;
if(strstr(s->name, "init_") == nil)
continue;
if(strstr(s->name, "_function") == nil)
if(s->name[0] != 'I' || strncmp(s->name, "Init·", 6) != 0)
continue;
if(s->oname == N)
continue;
......@@ -1098,7 +1094,7 @@ fninit(Node *n)
// (7)
// could check that it is fn of no args/returns
snprint(namebuf, sizeof(namebuf), "init_%s", filename);
snprint(namebuf, sizeof(namebuf), "init·%s", filename);
s = lookup(namebuf);
if(s->oname != N) {
a = nod(OCALL, s->oname, N);
......@@ -1109,7 +1105,6 @@ fninit(Node *n)
a = nod(ORETURN, N, N);
r = list(r, a);
// (9)
exportsym(fn->nname->sym);
fn->nbody = rev(r);
......
......@@ -72,15 +72,9 @@ autoexport(Sym *s)
if(dclcontext != PEXTERN)
return;
if(exportname(s->name)) {
if(dcladj != exportsym)
warn("uppercase missing export: %S", s);
exportsym(s);
} else {
if(dcladj == exportsym) {
warn("export missing uppercase: %S", s);
exportsym(s);
} else
packagesym(s);
packagesym(s);
}
}
......@@ -115,10 +109,6 @@ dumpexportconst(Sym *s)
dumpprereq(t);
Bprint(bout, "\t");
if(s->export == 1)
Bprint(bout, "export ");
else if(s->export == 2)
Bprint(bout, "package ");
Bprint(bout, "const %lS", s);
if(t != T)
Bprint(bout, " %#T", t);
......@@ -163,10 +153,6 @@ dumpexportvar(Sym *s)
dumpprereq(t);
Bprint(bout, "\t");
if(s->export == 1)
Bprint(bout, "export ");
else if(s->export == 2)
Bprint(bout, "package ");
if(t->etype == TFUNC)
Bprint(bout, "func ");
else
......@@ -179,10 +165,6 @@ dumpexporttype(Sym *s)
{
dumpprereq(s->otype);
Bprint(bout, "\t");
if(s->export == 1)
Bprint(bout, "export ");
else if(s->export == 2)
Bprint(bout, "package ");
switch (s->otype->etype) {
case TFORW:
case TFORWSTRUCT:
......@@ -304,7 +286,7 @@ pkgsym(char *name, char *pkg, int lexical)
* return the sym for ss, which should match lexical
*/
Sym*
importsym(int export, Node *ss, int lexical)
importsym(Node *ss, int lexical)
{
Sym *s;
......@@ -316,11 +298,10 @@ importsym(int export, Node *ss, int lexical)
s = pkgsym(ss->sym->name, ss->psym->name, lexical);
/* TODO botch - need some diagnostic checking for the following assignment */
s->opackage = ss->osym->name;
if(export) {
if(s->export != export && s->export != 0)
yyerror("export/package mismatch: %S", s);
s->export = export;
}
if(exportname(ss->sym->name))
s->export = 1;
else
s->export = 2; // package scope
s->imported = 1;
return s;
}
......@@ -342,7 +323,7 @@ pkgtype(char *name, char *pkg)
n->psym = lookup(pkg);
n->osym = n->psym;
renamepkg(n);
s = importsym(0, n, LATYPE);
s = importsym(n, LATYPE);
if(s->otype == T) {
t = typ(TFORW);
......@@ -362,44 +343,39 @@ mypackage(Node *ss)
}
void
importconst(int export, Node *ss, Type *t, Val *v)
importconst(Node *ss, Type *t, Val *v)
{
Node *n;
Sym *s;
export = exportname(ss->sym->name);
if(export == 2 && !mypackage(ss))
if(!exportname(ss->sym->name) && !mypackage(ss))
return;
n = nod(OLITERAL, N, N);
n->val = *v;
n->type = t;
s = importsym(export, ss, LACONST);
s = importsym(ss, LACONST);
if(s->oconst != N) {
// TODO: check if already the same.
return;
}
// fake out export vs upper checks until transition is over
if(export == 1) dcladj = exportsym;
dodclconst(newname(s), n);
dcladj = nil;
if(debug['e'])
print("import const %S\n", s);
}
void
importvar(int export, Node *ss, Type *t)
importvar(Node *ss, Type *t)
{
Sym *s;
if(export == 2 && !mypackage(ss))
if(!exportname(ss->sym->name) && !mypackage(ss))
return;
s = importsym(export, ss, LNAME);
s = importsym(ss, LNAME);
if(s->oname != N) {
if(eqtype(t, s->oname->type, 0))
return;
......@@ -408,18 +384,17 @@ importvar(int export, Node *ss, Type *t)
}
checkwidth(t);
addvar(newname(s), t, PEXTERN);
s->export = export;
if(debug['e'])
print("import var %S %lT\n", s, t);
}
void
importtype(int export, Node *ss, Type *t)
importtype(Node *ss, Type *t)
{
Sym *s;
s = importsym(export, ss, LATYPE);
s = importsym(ss, LATYPE);
if(s->otype != T) {
if(eqtype(t, s->otype, 0))
return;
......@@ -440,7 +415,7 @@ importtype(int export, Node *ss, Type *t)
// This will make references in the ordinary program
// (but not the import sections) look at s->oname,
// which is nil, as for an undefined name.
if(export == 0 || (export == 2 && !mypackage(ss)))
if(s->export == 2 && !mypackage(ss))
s->lexical = LNAME;
if(debug['e'])
......
......@@ -459,7 +459,6 @@ EXTERN int tptr; // either TPTR32 or TPTR64
extern char* sysimport;
extern char* unsafeimport;
EXTERN char* filename; // name to uniqify names
EXTERN void (*dcladj)(Sym*); // declaration is being exported/packaged
EXTERN Type* types[NTYPE];
EXTERN uchar simtype[NTYPE];
......@@ -761,10 +760,10 @@ void doimport6(Node*, Node*);
void doimport7(Node*, Node*);
void doimport8(Node*, Val*, Node*);
void doimport9(Sym*, Node*);
void importconst(int, Node *ss, Type *t, Val *v);
void importconst(Node *ss, Type *t, Val *v);
void importmethod(Sym *s, Type *t);
void importtype(int, Node *ss, Type *t);
void importvar(int, Node *ss, Type *t);
void importtype(Node *ss, Type *t);
void importvar(Node *ss, Type *t);
void checkimports(void);
Type* pkgtype(char*, char*);
......
......@@ -81,7 +81,6 @@
%type <node> hidden_interfacedcl
%type <node> hidden_funarg_list ohidden_funarg_list hidden_funarg_list_r
%type <node> hidden_funres ohidden_funres hidden_importsym
%type <lint> oexport
%left LOROR
%left LANDAND
......@@ -191,30 +190,6 @@ xdcl:
autoexport($1->nname->sym);
$$ = N;
}
| LEXPORT { dcladj = exportsym; stksize = initstksize; } common_dcl
{
$$ = $3;
dcladj = 0;
initstksize = stksize;
}
| LPACKAGE { warn("package is gone"); stksize = initstksize; } common_dcl
{
$$ = $3;
initstksize = stksize;
}
| LEXPORT '(' export_list_r ')'
{
$$ = N;
}
| LEXPORT xfndcl
{
if($2 != N && $2->nname != N) {
dcladj = exportsym;
autoexport($2->nname->sym);
dcladj = nil;
}
$$ = N;
}
| LPACKAGE { warn("package is gone"); } xfndcl
{
if($3 != N && $3->nname != N)
......@@ -1604,20 +1579,6 @@ exprsym3_list_r:
$$ = nod(OLIST, $1, $3);
}
export_list_r:
export
| export_list_r ocomma export
export:
sym
{
exportsym($1);
}
| sym '.' sym2
{
exportsym(pkglookup($3->name, $1->name));
}
import_stmt_list_r:
import_stmt
| import_stmt_list_r osemi import_stmt
......@@ -1768,19 +1729,6 @@ ohidden_interfacedcl_list:
}
| hidden_interfacedcl_list
oexport:
{
$$ = 0;
}
| LEXPORT
{
$$ = 1;
}
| LPACKAGE
{
$$ = 2;
}
oliteral:
{
$$.ctype = CTxxx;
......@@ -1794,37 +1742,33 @@ oliteral:
hidden_import:
LPACKAGE sym1
/* variables */
| oexport LVAR hidden_importsym hidden_type
| LVAR hidden_importsym hidden_type
{
importvar($1, $3, $4);
importvar($2, $3);
}
| oexport LCONST hidden_importsym '=' hidden_constant
| LCONST hidden_importsym '=' hidden_constant
{
importconst($1, $3, T, &$5);
importconst($2, T, &$4);
}
| oexport LCONST hidden_importsym hidden_type '=' hidden_constant
| LCONST hidden_importsym hidden_type '=' hidden_constant
{
importconst($1, $3, $4, &$6);
importconst($2, $3, &$5);
}
| oexport LTYPE hidden_importsym hidden_type
| LTYPE hidden_importsym hidden_type
{
importtype($1, $3, $4);
importtype($2, $3);
}
| oexport LFUNC hidden_importsym '(' ohidden_funarg_list ')' ohidden_funres
| LFUNC hidden_importsym '(' ohidden_funarg_list ')' ohidden_funres
{
importvar($1, $3, functype(N, $5, $7));
importvar($2, functype(N, $4, $6));
}
| oexport LFUNC '(' hidden_funarg_list ')' sym1 '(' ohidden_funarg_list ')' ohidden_funres
| LFUNC '(' hidden_funarg_list ')' sym1 '(' ohidden_funarg_list ')' ohidden_funres
{
// have to put oexport here to avoid shift/reduce
// with non-method func. but it isn't allowed.
if($1)
yyerror("cannot export method");
if($4->op != ODCLFIELD) {
if($3->op != ODCLFIELD) {
yyerror("bad receiver in method");
YYERROR;
}
importmethod($6, functype($4, $8, $10));
importmethod($5, functype($3, $7, $9));
}
hidden_type:
......
char *sysimport =
"package sys\n"
"package func sys.mal (? int32) (? *any)\n"
"package func sys.throwindex ()\n"
"package func sys.throwreturn ()\n"
"package func sys.panicl (? int32)\n"
"package func sys.printbool (? bool)\n"
"package func sys.printfloat (? float64)\n"
"package func sys.printint (? int64)\n"
"package func sys.printstring (? string)\n"
"package func sys.printpointer (? *any)\n"
"package func sys.printinter (? any)\n"
"package func sys.printarray (? any)\n"
"package func sys.printnl ()\n"
"package func sys.printsp ()\n"
"package func sys.catstring (? string, ? string) (? string)\n"
"package func sys.cmpstring (? string, ? string) (? int)\n"
"package func sys.slicestring (? string, ? int, ? int) (? string)\n"
"package func sys.indexstring (? string, ? int) (? uint8)\n"
"package func sys.intstring (? int64) (? string)\n"
"package func sys.byteastring (? *uint8, ? int) (? string)\n"
"package func sys.arraystring (? []uint8) (? string)\n"
"package func sys.ifaceT2I (sigi *uint8, sigt *uint8, elem any) (ret any)\n"
"package func sys.ifaceI2T (sigt *uint8, iface any) (ret any)\n"
"package func sys.ifaceI2T2 (sigt *uint8, iface any) (ret any, ok bool)\n"
"package func sys.ifaceI2I (sigi *uint8, iface any) (ret any)\n"
"package func sys.ifaceI2I2 (sigi *uint8, iface any) (ret any, ok bool)\n"
"package func sys.ifaceeq (i1 any, i2 any) (ret bool)\n"
"package func sys.newmap (keysize int, valsize int, keyalg int, valalg int, hint int) (hmap map[any] any)\n"
"package func sys.mapaccess1 (hmap map[any] any, key any) (val any)\n"
"package func sys.mapaccess2 (hmap map[any] any, key any) (val any, pres bool)\n"
"package func sys.mapassign1 (hmap map[any] any, key any, val any)\n"
"package func sys.mapassign2 (hmap map[any] any, key any, val any, pres bool)\n"
"package func sys.mapiterinit (hmap map[any] any, hiter *any)\n"
"package func sys.mapiternext (hiter *any)\n"
"package func sys.mapiter1 (hiter *any) (key any)\n"
"package func sys.mapiter2 (hiter *any) (key any, val any)\n"
"package func sys.newchan (elemsize int, elemalg int, hint int) (hchan chan any)\n"
"package func sys.chanrecv1 (hchan chan any) (elem any)\n"
"package func sys.chanrecv2 (hchan chan any) (elem any, pres bool)\n"
"package func sys.chanrecv3 (hchan chan any, elem *any) (pres bool)\n"
"package func sys.chansend1 (hchan chan any, elem any)\n"
"package func sys.chansend2 (hchan chan any, elem any) (pres bool)\n"
"package func sys.newselect (size int) (sel *uint8)\n"
"package func sys.selectsend (sel *uint8, hchan chan any, elem any) (selected bool)\n"
"package func sys.selectrecv (sel *uint8, hchan chan any, elem *any) (selected bool)\n"
"package func sys.selectdefault (sel *uint8) (selected bool)\n"
"package func sys.selectgo (sel *uint8)\n"
"package func sys.newarray (nel int, cap int, width int) (ary []any)\n"
"package func sys.arraysliced (old []any, lb int, hb int, width int) (ary []any)\n"
"package func sys.arrayslices (old *any, nel int, lb int, hb int, width int) (ary []any)\n"
"package func sys.arrays2d (old *any, nel int) (ary []any)\n"
"export func sys.Breakpoint ()\n"
"export func sys.Reflect (i interface { }) (? uint64, ? string, ? bool)\n"
"export func sys.Unreflect (? uint64, ? string, ? bool) (ret interface { })\n"
"export var sys.Args []string\n"
"export var sys.Envs []string\n"
"export func sys.Frexp (? float64) (? float64, ? int)\n"
"export func sys.Ldexp (? float64, ? int) (? float64)\n"
"export func sys.Modf (? float64) (? float64, ? float64)\n"
"export func sys.IsInf (? float64, ? int) (? bool)\n"
"export func sys.IsNaN (? float64) (? bool)\n"
"export func sys.Inf (? int) (? float64)\n"
"export func sys.NaN () (? float64)\n"
"export func sys.Float32bits (? float32) (? uint32)\n"
"export func sys.Float64bits (? float64) (? uint64)\n"
"export func sys.Float32frombits (? uint32) (? float32)\n"
"export func sys.Float64frombits (? uint64) (? float64)\n"
"export func sys.Gosched ()\n"
"export func sys.Goexit ()\n"
"export func sys.BytesToRune (? *uint8, ? int, ? int) (? int, ? int)\n"
"export func sys.StringToRune (? string, ? int) (? int, ? int)\n"
"export func sys.Exit (? int)\n"
"export func sys.Caller (n int) (pc uint64, file string, line int, ok bool)\n"
"export func sys.SemAcquire (sema *int32)\n"
"export func sys.SemRelease (sema *int32)\n"
"func sys.mal (? int32) (? *any)\n"
"func sys.throwindex ()\n"
"func sys.throwreturn ()\n"
"func sys.panicl (? int32)\n"
"func sys.printbool (? bool)\n"
"func sys.printfloat (? float64)\n"
"func sys.printint (? int64)\n"
"func sys.printstring (? string)\n"
"func sys.printpointer (? *any)\n"
"func sys.printinter (? any)\n"
"func sys.printarray (? any)\n"
"func sys.printnl ()\n"
"func sys.printsp ()\n"
"func sys.catstring (? string, ? string) (? string)\n"
"func sys.cmpstring (? string, ? string) (? int)\n"
"func sys.slicestring (? string, ? int, ? int) (? string)\n"
"func sys.indexstring (? string, ? int) (? uint8)\n"
"func sys.intstring (? int64) (? string)\n"
"func sys.byteastring (? *uint8, ? int) (? string)\n"
"func sys.arraystring (? []uint8) (? string)\n"
"func sys.ifaceT2I (sigi *uint8, sigt *uint8, elem any) (ret any)\n"
"func sys.ifaceI2T (sigt *uint8, iface any) (ret any)\n"
"func sys.ifaceI2T2 (sigt *uint8, iface any) (ret any, ok bool)\n"
"func sys.ifaceI2I (sigi *uint8, iface any) (ret any)\n"
"func sys.ifaceI2I2 (sigi *uint8, iface any) (ret any, ok bool)\n"
"func sys.ifaceeq (i1 any, i2 any) (ret bool)\n"
"func sys.newmap (keysize int, valsize int, keyalg int, valalg int, hint int) (hmap map[any] any)\n"
"func sys.mapaccess1 (hmap map[any] any, key any) (val any)\n"
"func sys.mapaccess2 (hmap map[any] any, key any) (val any, pres bool)\n"
"func sys.mapassign1 (hmap map[any] any, key any, val any)\n"
"func sys.mapassign2 (hmap map[any] any, key any, val any, pres bool)\n"
"func sys.mapiterinit (hmap map[any] any, hiter *any)\n"
"func sys.mapiternext (hiter *any)\n"
"func sys.mapiter1 (hiter *any) (key any)\n"
"func sys.mapiter2 (hiter *any) (key any, val any)\n"
"func sys.newchan (elemsize int, elemalg int, hint int) (hchan chan any)\n"
"func sys.chanrecv1 (hchan chan any) (elem any)\n"
"func sys.chanrecv2 (hchan chan any) (elem any, pres bool)\n"
"func sys.chanrecv3 (hchan chan any, elem *any) (pres bool)\n"
"func sys.chansend1 (hchan chan any, elem any)\n"
"func sys.chansend2 (hchan chan any, elem any) (pres bool)\n"
"func sys.newselect (size int) (sel *uint8)\n"
"func sys.selectsend (sel *uint8, hchan chan any, elem any) (selected bool)\n"
"func sys.selectrecv (sel *uint8, hchan chan any, elem *any) (selected bool)\n"
"func sys.selectdefault (sel *uint8) (selected bool)\n"
"func sys.selectgo (sel *uint8)\n"
"func sys.newarray (nel int, cap int, width int) (ary []any)\n"
"func sys.arraysliced (old []any, lb int, hb int, width int) (ary []any)\n"
"func sys.arrayslices (old *any, nel int, lb int, hb int, width int) (ary []any)\n"
"func sys.arrays2d (old *any, nel int) (ary []any)\n"
"func sys.Breakpoint ()\n"
"func sys.Reflect (i interface { }) (? uint64, ? string, ? bool)\n"
"func sys.Unreflect (? uint64, ? string, ? bool) (ret interface { })\n"
"var sys.Args []string\n"
"var sys.Envs []string\n"
"func sys.Frexp (? float64) (? float64, ? int)\n"
"func sys.Ldexp (? float64, ? int) (? float64)\n"
"func sys.Modf (? float64) (? float64, ? float64)\n"
"func sys.IsInf (? float64, ? int) (? bool)\n"
"func sys.IsNaN (? float64) (? bool)\n"
"func sys.Inf (? int) (? float64)\n"
"func sys.NaN () (? float64)\n"
"func sys.Float32bits (? float32) (? uint32)\n"
"func sys.Float64bits (? float64) (? uint64)\n"
"func sys.Float32frombits (? uint32) (? float32)\n"
"func sys.Float64frombits (? uint64) (? float64)\n"
"func sys.Gosched ()\n"
"func sys.Goexit ()\n"
"func sys.BytesToRune (? *uint8, ? int, ? int) (? int, ? int)\n"
"func sys.StringToRune (? string, ? int) (? int, ? int)\n"
"func sys.Exit (? int)\n"
"func sys.Caller (n int) (pc uint64, file string, line int, ok bool)\n"
"func sys.SemAcquire (sema *int32)\n"
"func sys.SemRelease (sema *int32)\n"
"\n"
"$$\n";
char *unsafeimport =
"package unsafe\n"
"export type unsafe.pointer *any\n"
"type unsafe.Pointer *any\n"
"\n"
"$$\n";
......@@ -51,7 +51,7 @@ TEXT _rt0_amd64(SB),7,$-8
RET
TEXT mainstart(SB),7,$0
CALL main·init_function(SB)
CALL main·init(SB)
CALL initdone(SB)
CALL main·main(SB)
PUSHQ $0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment