mirror of
https://github.com/golang/go
synced 2024-11-26 00:48:01 -07:00
checkpoint; still plenty to clean up
R=ken OCL=32576 CL=32580
This commit is contained in:
parent
9299ae461d
commit
a2b8e38766
@ -52,6 +52,11 @@ builtin.c: sys.go unsafe.go mkbuiltin1.c mkbuiltin
|
||||
./mkbuiltin >builtin.c || \
|
||||
(echo 'mkbuiltin failed; using bootstrap copy of builtin.c'; cp builtin.c.boot builtin.c)
|
||||
|
||||
subr.$O: opnames.h
|
||||
|
||||
opnames.h: mkopnames go.h
|
||||
./mkopnames go.h >opnames.h
|
||||
|
||||
clean:
|
||||
rm -f $(OFILES) *.6 enam.c 6.out a.out y.tab.h y.tab.c $(LIB) mkbuiltin1 builtin.c _builtin.c
|
||||
|
||||
|
@ -4,7 +4,7 @@ char *sysimport =
|
||||
"func sys.throwindex ()\n"
|
||||
"func sys.throwreturn ()\n"
|
||||
"func sys.throwinit ()\n"
|
||||
"func sys.panicl (? int32)\n"
|
||||
"func sys.panicl ()\n"
|
||||
"func sys.printbool (? bool)\n"
|
||||
"func sys.printfloat (? float64)\n"
|
||||
"func sys.printint (? int64)\n"
|
||||
|
@ -1670,7 +1670,7 @@ variter(NodeList *vl, Node *nt, NodeList *el)
|
||||
v = vl->n;
|
||||
tv = t;
|
||||
if(t == T) {
|
||||
gettype(&e, &r);
|
||||
typecheck(&e, Erv);
|
||||
defaultlit(&e, T);
|
||||
tv = e->type;
|
||||
}
|
||||
|
109
src/cmd/gc/go.h
109
src/cmd/gc/go.h
@ -320,43 +320,75 @@ enum
|
||||
{
|
||||
OXXX,
|
||||
|
||||
ONAME, ONONAME, OTYPE, OPACK, OLITERAL,
|
||||
ODCL,
|
||||
ODOT, ODOTPTR, ODOTMETH, ODOTINTER,
|
||||
ODCLFUNC, ODCLFIELD, ODCLARG,
|
||||
OCMP, OPTR, OARRAY, ORANGE,
|
||||
ORETURN, OFOR, OIF, OSWITCH, ODEFER,
|
||||
OAS, OAS2, OASOP, OCASE, OXCASE, OFALL, OXFALL,
|
||||
OGOTO, OPROC, OMAKE, ONEW, OEMPTY, OSELECT,
|
||||
OLEN, OCAP, OPANIC, OPANICN, OPRINT, OPRINTN, OTYPEOF,
|
||||
OCLOSE, OCLOSED, OBLOCK,
|
||||
// names
|
||||
ONAME,
|
||||
ONONAME,
|
||||
OTYPE,
|
||||
OPACK,
|
||||
OLITERAL,
|
||||
|
||||
OOROR,
|
||||
OANDAND,
|
||||
OEQ, ONE, OLT, OLE, OGE, OGT,
|
||||
// exprs
|
||||
OADD, OSUB, OOR, OXOR,
|
||||
OMUL, ODIV, OMOD, OLSH, ORSH, OAND, OANDNOT,
|
||||
OINC, ODEC,
|
||||
OFUNC,
|
||||
OLABEL,
|
||||
OBREAK,
|
||||
OCONTINUE,
|
||||
OADDR,
|
||||
OIND,
|
||||
OCALL, OCALLFUNC, OCALLMETH, OCALLINTER,
|
||||
OINDEX, OSLICE,
|
||||
ONOT, OCOM, OPLUS, OMINUS, OSEND, ORECV,
|
||||
OREGISTER, OINDREG,
|
||||
OKEY, OPARAM,
|
||||
OCOMPOS, OCOMPSLICE, OCOMPMAP,
|
||||
OCONV, OCONVNOP, OCONVRUNE, OCONVSTRB, OCONVSTRI,
|
||||
OCONVA2S,
|
||||
ODOTTYPE, OTYPESW, OTYPECASE,
|
||||
OANDAND,
|
||||
OARRAY,
|
||||
OAS, OAS2, OASOP,
|
||||
OBAD,
|
||||
OCALL, OCALLFUNC, OCALLMETH, OCALLINTER,
|
||||
OCAP,
|
||||
OCLOSE,
|
||||
OCLOSED,
|
||||
OCOMPOS, OCOMPSLICE, OCOMPMAP,
|
||||
OCONV, OCONVNOP, OCONVRUNE, OCONVSTRB, OCONVSTRI, OCONVA2S,
|
||||
ODCL, ODCLFUNC, ODCLFIELD, ODCLARG,
|
||||
ODOT, ODOTPTR, ODOTMETH, ODOTINTER,
|
||||
ODOTTYPE,
|
||||
OEQ, ONE, OLT, OLE, OGE, OGT,
|
||||
OFUNC,
|
||||
OIND,
|
||||
OINDEX, OINDEXSTR, OINDEXMAP, OINDEXARR,
|
||||
OKEY, OPARAM,
|
||||
OLEN,
|
||||
OMAKE,
|
||||
OMUL, ODIV, OMOD, OLSH, ORSH, OAND, OANDNOT,
|
||||
ONEW,
|
||||
ONOT, OCOM, OPLUS, OMINUS,
|
||||
OOROR,
|
||||
OPANIC, OPANICN, OPRINT, OPRINTN,
|
||||
OSEND,
|
||||
OSLICE, OSLICESTR, OSLICEARR,
|
||||
ORECV,
|
||||
|
||||
OTCHAN, OTMAP, OTSTRUCT, OTINTER, OTFUNC, OTARRAY,
|
||||
// stmts
|
||||
OBLOCK,
|
||||
OBREAK,
|
||||
OCASE, OXCASE,
|
||||
OCONTINUE,
|
||||
ODEFER,
|
||||
OEMPTY,
|
||||
OFALL, OXFALL,
|
||||
OFOR,
|
||||
OGOTO,
|
||||
OIF,
|
||||
OLABEL,
|
||||
OPROC,
|
||||
ORANGE,
|
||||
ORETURN,
|
||||
OSELECT,
|
||||
OSWITCH,
|
||||
OTYPECASE,
|
||||
OTYPESW,
|
||||
|
||||
OEXTEND, // 6g internal
|
||||
// types
|
||||
OTCHAN,
|
||||
OTMAP,
|
||||
OTSTRUCT,
|
||||
OTINTER,
|
||||
OTFUNC,
|
||||
OTARRAY,
|
||||
|
||||
// for back ends
|
||||
OCMP, ODEC, OEXTEND, OINC, OREGISTER, OINDREG,
|
||||
|
||||
OEND,
|
||||
};
|
||||
@ -936,12 +968,10 @@ Type* pkgtype(Sym*);
|
||||
/*
|
||||
* walk.c
|
||||
*/
|
||||
void gettype(Node**, NodeList**);
|
||||
void walk(Node*);
|
||||
void walkstmt(Node**);
|
||||
void walkstmtlist(NodeList*);
|
||||
void walkexpr(Node**, int, NodeList**);
|
||||
void walkexprlist(NodeList*, int, NodeList**);
|
||||
void walkexprlist(NodeList*, NodeList**);
|
||||
void walkconv(Node**, NodeList**);
|
||||
void walkdottype(Node*, NodeList**);
|
||||
void walkas(Node*);
|
||||
@ -949,21 +979,20 @@ void walkbool(Node**);
|
||||
void walkswitch(Node*);
|
||||
void walkselect(Node*);
|
||||
void walkdot(Node*, NodeList**);
|
||||
void walkexpr(Node**, NodeList**);
|
||||
Node* ascompatee1(int, Node*, Node*, NodeList**);
|
||||
NodeList* ascompatee(int, NodeList*, NodeList*, NodeList**);
|
||||
NodeList* ascompatet(int, NodeList*, Type**, int, NodeList**);
|
||||
NodeList* ascompatte(int, Type**, NodeList*, int, NodeList**);
|
||||
int ascompat(Type*, Type*);
|
||||
Node* prcompat(NodeList*, int, int);
|
||||
Node* nodpanic(int32);
|
||||
Node* newcompat(Node*);
|
||||
Node* makecompat(Node*);
|
||||
Node* stringop(Node*, int, NodeList**);
|
||||
Node* stringop(Node*, NodeList**);
|
||||
Type* fixmap(Type*);
|
||||
Node* mapop(Node*, int, NodeList**);
|
||||
Node* mapop(Node*, NodeList**);
|
||||
Type* fixchan(Type*);
|
||||
Node* chanop(Node*, int, NodeList**);
|
||||
Node* arrayop(Node*, int);
|
||||
Node* chanop(Node*, NodeList**);
|
||||
Node* arrayop(Node*);
|
||||
Node* ifacecvt(Type*, Node*, int);
|
||||
Node* ifaceop(Node*);
|
||||
int ifaceas(Type*, Type*, int);
|
||||
|
@ -16,7 +16,7 @@ rm -f _builtin.c
|
||||
for i in sys unsafe
|
||||
do
|
||||
$GC -A $i.go
|
||||
./mkbuiltin1 $i >>_builtin.c
|
||||
O=$O ./mkbuiltin1 $i >>_builtin.c
|
||||
done
|
||||
|
||||
# If _builtin.c has changed vs builtin.c.boot,
|
||||
|
@ -26,7 +26,7 @@ main(int argc, char **argv)
|
||||
name = argv[1];
|
||||
snprintf(initfunc, sizeof(initfunc), "init_%s_function", name);
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s.6", name);
|
||||
snprintf(buf, sizeof(buf), "%s.%s", name, getenv("O"));
|
||||
if((fin = fopen(buf, "r")) == NULL) {
|
||||
fprintf(stderr, "open %s: %s\n", buf, strerror(errno));
|
||||
exit(1);
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include "go.h"
|
||||
#include "y.tab.h"
|
||||
#include "opnames.h"
|
||||
|
||||
void
|
||||
errorexit(void)
|
||||
@ -612,127 +613,6 @@ dump(char *s, Node *n)
|
||||
dodump(n, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
s%,%,\n%g
|
||||
s%\n+%\n%g
|
||||
s%^[ ]*O%%g
|
||||
s%,.*%%g
|
||||
s%.+% [O&] = "&",%g
|
||||
s%^ ........*\]%&~%g
|
||||
s%~ %%g
|
||||
|sort
|
||||
*/
|
||||
|
||||
static char*
|
||||
opnames[] =
|
||||
{
|
||||
[OADDR] = "ADDR",
|
||||
[OADD] = "ADD",
|
||||
[OANDAND] = "ANDAND",
|
||||
[OANDNOT] = "ANDNOT",
|
||||
[OAND] = "AND",
|
||||
[OARRAY] = "ARRAY",
|
||||
[OASOP] = "ASOP",
|
||||
[OAS] = "AS",
|
||||
[OAS2] = "AS2",
|
||||
[OBAD] = "BAD",
|
||||
[OBLOCK] = "BLOCK",
|
||||
[OBREAK] = "BREAK",
|
||||
[OCALLFUNC] = "CALLFUNC",
|
||||
[OCALLINTER] = "CALLINTER",
|
||||
[OCALLMETH] = "CALLMETH",
|
||||
[OCALL] = "CALL",
|
||||
[OCAP] = "CAP",
|
||||
[OCASE] = "CASE",
|
||||
[OCLOSED] = "CLOSED",
|
||||
[OCLOSE] = "CLOSE",
|
||||
[OCMP] = "CMP",
|
||||
[OCOMPMAP] = "COMPMAP",
|
||||
[OCOMPOS] = "COMPOS",
|
||||
[OCOMPSLICE] = "COMPSLICE",
|
||||
[OCOM] = "COM",
|
||||
[OCONTINUE] = "CONTINUE",
|
||||
[OCONV] = "CONV",
|
||||
[OCONVNOP] = "CONVNOP",
|
||||
[ODCLARG] = "DCLARG",
|
||||
[ODCLFIELD] = "DCLFIELD",
|
||||
[ODCLFUNC] = "DCLFUNC",
|
||||
[ODCL] = "DCL",
|
||||
[ODEC] = "DEC",
|
||||
[ODEFER] = "DEFER",
|
||||
[ODIV] = "DIV",
|
||||
[ODOTINTER] = "DOTINTER",
|
||||
[ODOTMETH] = "DOTMETH",
|
||||
[ODOTPTR] = "DOTPTR",
|
||||
[ODOTTYPE] = "DOTTYPE",
|
||||
[ODOT] = "DOT",
|
||||
[OEMPTY] = "EMPTY",
|
||||
[OEND] = "END",
|
||||
[OEQ] = "EQ",
|
||||
[OEXTEND] = "EXTEND",
|
||||
[OFALL] = "FALL",
|
||||
[OFOR] = "FOR",
|
||||
[OFUNC] = "FUNC",
|
||||
[OGE] = "GE",
|
||||
[OGOTO] = "GOTO",
|
||||
[OGT] = "GT",
|
||||
[OIF] = "IF",
|
||||
[OINC] = "INC",
|
||||
[OINDEX] = "INDEX",
|
||||
[OINDREG] = "INDREG",
|
||||
[OIND] = "IND",
|
||||
[OKEY] = "KEY",
|
||||
[OLABEL] = "LABEL",
|
||||
[OLEN] = "LEN",
|
||||
[OLE] = "LE",
|
||||
[OLITERAL] = "LITERAL",
|
||||
[OLSH] = "LSH",
|
||||
[OLT] = "LT",
|
||||
[OMAKE] = "MAKE",
|
||||
[OMINUS] = "MINUS",
|
||||
[OMOD] = "MOD",
|
||||
[OMUL] = "MUL",
|
||||
[ONAME] = "NAME",
|
||||
[ONEW] = "NEW",
|
||||
[ONE] = "NE",
|
||||
[ONONAME] = "NONAME",
|
||||
[ONOT] = "NOT",
|
||||
[OOROR] = "OROR",
|
||||
[OOR] = "OR",
|
||||
[OPANICN] = "PANICN",
|
||||
[OPANIC] = "PANIC",
|
||||
[OPACK] = "PACK",
|
||||
[OPARAM] = "PARAM",
|
||||
[OPLUS] = "PLUS",
|
||||
[OPRINTN] = "PRINTN",
|
||||
[OPRINT] = "PRINT",
|
||||
[OPROC] = "PROC",
|
||||
[OPTR] = "PTR",
|
||||
[ORANGE] = "RANGE",
|
||||
[ORECV] = "RECV",
|
||||
[OREGISTER] = "REGISTER",
|
||||
[ORETURN] = "RETURN",
|
||||
[ORSH] = "RSH",
|
||||
[OSELECT] = "SELECT",
|
||||
[OSEND] = "SEND",
|
||||
[OSLICE] = "SLICE",
|
||||
[OSUB] = "SUB",
|
||||
[OSWITCH] = "SWITCH",
|
||||
[OTCHAN] = "TCHAN",
|
||||
[OTMAP] = "TMAP",
|
||||
[OTSTRUCT] = "TSTRUCT",
|
||||
[OTINTER] = "TINTER",
|
||||
[OTFUNC] = "TFUNC",
|
||||
[OTARRAY] = "TARRAY",
|
||||
[OTYPEOF] = "TYPEOF",
|
||||
[OTYPESW] = "TYPESW",
|
||||
[OTYPE] = "TYPE",
|
||||
[OXCASE] = "XCASE",
|
||||
[OXFALL] = "XFALL",
|
||||
[OXOR] = "XOR",
|
||||
[OXXX] = "XXX",
|
||||
};
|
||||
|
||||
static char*
|
||||
goopnames[] =
|
||||
{
|
||||
@ -2395,7 +2275,7 @@ saferef(Node *n, NodeList **init)
|
||||
*r = *n;
|
||||
r->left = l;
|
||||
typecheck(&r, Elv);
|
||||
walkexpr(&r, Elv, init);
|
||||
walkexpr(&r, init);
|
||||
return r;
|
||||
|
||||
case OINDEX:
|
||||
@ -2405,11 +2285,11 @@ saferef(Node *n, NodeList **init)
|
||||
tempname(l, ptrto(n->type));
|
||||
a = nod(OAS, l, nod(OADDR, n, N));
|
||||
typecheck(&a, Etop);
|
||||
walkexpr(&a, Etop, init);
|
||||
walkexpr(&a, init);
|
||||
*init = list(*init, a);
|
||||
r = nod(OIND, l, N);
|
||||
typecheck(&r, Elv);
|
||||
walkexpr(&r, Elv, init);
|
||||
walkexpr(&r, init);
|
||||
return r;
|
||||
}
|
||||
fatal("saferef %N", n);
|
||||
|
@ -250,7 +250,7 @@ sw0(Node **cp, Type *place, int arg)
|
||||
yyerror("expression case in a type switch");
|
||||
return T;
|
||||
}
|
||||
walkexpr(cp, Erv, nil);
|
||||
walkexpr(cp, nil);
|
||||
break;
|
||||
case OTYPESW:
|
||||
case OTYPECASE:
|
||||
@ -596,7 +596,7 @@ exprswitch(Node *sw)
|
||||
if(sw->ntest->val.u.bval == 0)
|
||||
arg = Sfalse;
|
||||
}
|
||||
walkexpr(&sw->ntest, Erv, &sw->ninit);
|
||||
walkexpr(&sw->ntest, &sw->ninit);
|
||||
|
||||
/*
|
||||
* pass 0,1,2,3
|
||||
@ -780,7 +780,7 @@ typeswitch(Node *sw)
|
||||
yyerror("type switch must have an assignment");
|
||||
return;
|
||||
}
|
||||
walkexpr(&sw->ntest->right, Erv, &sw->ninit);
|
||||
walkexpr(&sw->ntest->right, &sw->ninit);
|
||||
if(!istype(sw->ntest->right->type, TINTER)) {
|
||||
yyerror("type switch must be on an interface");
|
||||
return;
|
||||
|
@ -2,7 +2,6 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
|
||||
package PACKAGE
|
||||
|
||||
// emitted by compiler, not referred to by go programs
|
||||
@ -11,7 +10,7 @@ func mal(int32) *any;
|
||||
func throwindex();
|
||||
func throwreturn();
|
||||
func throwinit();
|
||||
func panicl(int32);
|
||||
func panicl();
|
||||
|
||||
func printbool(bool);
|
||||
func printfloat(float64);
|
||||
|
@ -315,7 +315,9 @@ reswitch:
|
||||
* exprs
|
||||
*/
|
||||
case OADDR:
|
||||
l = typecheck(&n->left, Elv);
|
||||
typecheck(&n->left, Elv);
|
||||
defaultlit(&n->left, T);
|
||||
l = n->left;
|
||||
if((t = l->type) == T)
|
||||
goto error;
|
||||
n->type = ptrto(t);
|
||||
@ -452,6 +454,9 @@ reswitch:
|
||||
break;
|
||||
|
||||
case TMAP:
|
||||
n->etype = 0;
|
||||
if(top & Elv)
|
||||
n->etype = 1; // clumsy hack
|
||||
ok |= Erv | Elv;
|
||||
defaultlit(&n->right, t->down);
|
||||
n->type = t->type;
|
||||
@ -499,6 +504,9 @@ reswitch:
|
||||
if((t = r->type) == T)
|
||||
goto error;
|
||||
// TODO: more aggressive
|
||||
n->etype = 0;
|
||||
if(top & Erv)
|
||||
n->etype = 1; // clumsy hack
|
||||
ok |= Etop | Erv;
|
||||
n->type = types[TBOOL];
|
||||
goto ret;
|
||||
@ -539,12 +547,15 @@ reswitch:
|
||||
goto error;
|
||||
|
||||
case TARRAY:
|
||||
ok |= Elv;
|
||||
n = arrayop(n, Erv);
|
||||
n->type = typ(TARRAY);
|
||||
n->type->type = t;
|
||||
n->type->bound = -1;
|
||||
n = arrayop(n);
|
||||
break;
|
||||
|
||||
case TSTRING:
|
||||
n = stringop(n, Erv, nil);
|
||||
n->type = t;
|
||||
n = stringop(n, nil);
|
||||
break;
|
||||
}
|
||||
goto ret;
|
||||
|
1253
src/cmd/gc/walk.c
1253
src/cmd/gc/walk.c
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user