From c242b53d22aacbce0b78a2d0c977e2d92069cba5 Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Tue, 17 Jun 2008 22:33:32 -0700 Subject: [PATCH] more maps more semi-colons type assignment of constants SVN=123278 --- src/cmd/gc/const.c | 12 +++++++++++- src/cmd/gc/go.h | 1 + src/cmd/gc/go.y | 45 ++++++++++++++++++++++++++------------------- src/cmd/gc/subr.c | 10 ++++++++++ src/cmd/gc/walk.c | 15 ++++++++++++--- 5 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/cmd/gc/const.c b/src/cmd/gc/const.c index 589066a9bb..9bd3e742ef 100644 --- a/src/cmd/gc/const.c +++ b/src/cmd/gc/const.c @@ -20,7 +20,17 @@ convlit(Node *n, Type *t) goto bad1; case Wlitnil: - if(isptr[et] || et = TINTER) + if(isptr[et] || et == TINTER) + break; + goto bad1; + + case Wlitstr: + if(isptrto(t, TSTRING)) + break; + goto bad1; + + case Wlitbool: + if(et == TBOOL) break; goto bad1; diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index 0946b680b1..4e08bc5845 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -446,6 +446,7 @@ void warn(char*, ...); void fatal(char*, ...); void linehist(char*, long); Node* nod(int, Node*, Node*); +Node* list(Node*, Node*); Type* typ(int); Dcl* dcl(void); Node* rev(Node*); diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index c72900f808..c07d113d9b 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -30,7 +30,7 @@ %type chandir %type xdcl xdcl_list_r oxdcl_list common_dcl %type oarg_type_list arg_type_list_r arg_type -%type else_stmt1 else_stmt2 +%type else_stmt1 else_stmt2 inc_stmt noninc_stmt %type complex_stmt compound_stmt ostmt_list %type stmt_list_r Astmt_list_r Bstmt_list_r %type Astmt Bstmt Cstmt Dstmt @@ -232,20 +232,14 @@ else_stmt2: } simple_stmt: + inc_stmt +| noninc_stmt + +noninc_stmt: expr { $$ = $1; } -| expr LINC - { - $$ = nod(OASOP, $1, literal(1)); - $$->etype = OADD; - } -| expr LDEC - { - $$ = nod(OASOP, $1, literal(1)); - $$->etype = OSUB; - } | expr LASOP expr { $$ = nod(OASOP, $1, $3); @@ -264,6 +258,18 @@ simple_stmt: $$ = nod(OAS, $1, $3); } +inc_stmt: + expr LINC + { + $$ = nod(OASOP, $1, literal(1)); + $$->etype = OADD; + } +| expr LDEC + { + $$ = nod(OASOP, $1, literal(1)); + $$->etype = OSUB; + } + complex_stmt: LFOR for_stmt { @@ -1094,14 +1100,15 @@ Bstmt: * need semi in back YES */ Cstmt: - simple_stmt + noninc_stmt /* * need semi in front YES * need semi in back NO */ Dstmt: - new_name ':' + inc_stmt +| new_name ':' { $$ = nod(OLABEL, $1, N); } @@ -1114,15 +1121,15 @@ Astmt_list_r: | Dstmt | Astmt_list_r Astmt { - $$ = nod(OLIST, $1, $2); + $$ = list($1, $2); } | Astmt_list_r Dstmt { - $$ = nod(OLIST, $1, $2); + $$ = list($1, $2); } | Bstmt_list_r Astmt { - $$ = nod(OLIST, $1, $2); + $$ = list($1, $2); } /* @@ -1133,15 +1140,15 @@ Bstmt_list_r: | Cstmt | Astmt_list_r Bstmt { - $$ = nod(OLIST, $1, $2); + $$ = list($1, $2); } | Astmt_list_r Cstmt { - $$ = nod(OLIST, $1, $2); + $$ = list($1, $2); } | Bstmt_list_r Bstmt { - $$ = nod(OLIST, $1, $2); + $$ = list($1, $2); } stmt_list_r: diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 1cd9f94718..499200521f 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -254,6 +254,16 @@ nod(int op, Node *nleft, Node *nright) return n; } +Node* +list(Node *a, Node *b) +{ + if(a == N) + return b; + if(b == N) + return a; + return nod(OLIST, a, b); +} + Type* typ(int et) { diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 16f0c2ce3e..56475b177b 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -12,8 +12,12 @@ static Node* curfn; void walk(Node *fn) { + if(debug['W']) + dump("fn-before", fn->nbody); curfn = fn; walktype(fn->nbody, Etop); + if(debug['W']) + dump("fn", fn->nbody); } void @@ -458,6 +462,9 @@ loop: goto badt; case TMAP: + +print("top=%d type %lT", top, t); +dump("index", n); // right side must map type if(n->right->type == T) { convlit(n->right, t->down); @@ -470,6 +477,8 @@ loop: goto badt; n->op = OINDEX; n->type = t->type; + if(top == Erv) +*n = *mapop(n, top); break; case TSTRING: @@ -710,7 +719,6 @@ walkswitch(Node *sw, Type*(*call)(Node*, Type*)) { Node *n, *c; Type *place; - place = call(sw->ntest, T); n = sw->nbody; @@ -1372,10 +1380,10 @@ mapop(Node *n, int top) r->type = n->type; break; - case OINDEXPTR: + case OINDEX: if(top != Erv) goto nottop; - +dump("access start", n); // mapaccess1(hmap *map[any]any, key any) (val any); t = fixmap(n->left->type); @@ -1408,6 +1416,7 @@ mapop(Node *n, int top) r = nod(OCALL, on, r); walktype(r, Erv); r->type = t->type; +dump("access finish", r); break; // mapaccess2(hmap *map[any]any, key any) (val any, pres bool); -- 2.48.1