]> Cypherpunks repositories - gostls13.git/commitdiff
more maps
authorKen Thompson <ken@golang.org>
Wed, 18 Jun 2008 05:33:32 +0000 (22:33 -0700)
committerKen Thompson <ken@golang.org>
Wed, 18 Jun 2008 05:33:32 +0000 (22:33 -0700)
more semi-colons
type assignment of constants

SVN=123278

src/cmd/gc/const.c
src/cmd/gc/go.h
src/cmd/gc/go.y
src/cmd/gc/subr.c
src/cmd/gc/walk.c

index 589066a9bbf2204477a0aadc80764627916ccaf7..9bd3e742ef760724dc65e2c141a89eea33e6f7c3 100644 (file)
@@ -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;
 
index 0946b680b195729d6f5be90a2a9f60731e71f6fd..4e08bc58451cc0c706d2119d1b7d309b7593f090 100644 (file)
@@ -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*);
index c72900f808bc784f5e85c34d79934ede0637d311..c07d113d9b345a5ee11ced308d43bccf8e89bca8 100644 (file)
@@ -30,7 +30,7 @@
 %type  <lint>          chandir
 %type  <node>          xdcl xdcl_list_r oxdcl_list common_dcl
 %type  <node>          oarg_type_list arg_type_list_r arg_type
-%type  <node>          else_stmt1 else_stmt2
+%type  <node>          else_stmt1 else_stmt2 inc_stmt noninc_stmt
 %type  <node>          complex_stmt compound_stmt ostmt_list
 %type  <node>          stmt_list_r Astmt_list_r Bstmt_list_r
 %type  <node>          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:
index 1cd9f94718ef159f405d1e6e586ea29299f98743..499200521f2a7db7eb3b894af310a33ef46d04fa 100644 (file)
@@ -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)
 {
index 16f0c2ce3e68ea626012089604c6ccd071ffa3bb..56475b177b0bd85113a79c1c28d01d0dbea25832 100644 (file)
@@ -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);