]> Cypherpunks repositories - gostls13.git/commitdiff
map literals
authorKen Thompson <ken@golang.org>
Wed, 3 Sep 2008 21:40:22 +0000 (14:40 -0700)
committerKen Thompson <ken@golang.org>
Wed, 3 Sep 2008 21:40:22 +0000 (14:40 -0700)
R=r
OCL=14759
CL=14759

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

index 748ea4cbd0625e0cbaa8f1a138e7ee65652b2e69..9a6b0422405382501ffd5b554319c2901407c551 100644 (file)
@@ -277,7 +277,7 @@ enum
        OINDEX, OINDEXPTR, OSLICE,
        ONOT, OCOM, OPLUS, OMINUS, OSEND, ORECV,
        OLITERAL, OREGISTER, OINDREG,
-       OCONV,
+       OCONV, OKEY,
        OBAD,
 
        OEND,
@@ -691,7 +691,7 @@ Node*       reorder3(Node*);
 Node*  reorder4(Node*);
 Node*  structlit(Node*);
 Node*  arraylit(Node*);
-Node*  chantlit(Node*);
+Node*  maplit(Node*);
 
 /*
  *     const.c
index 20d4ffac6deaea0045223d2cc7e6acec41aa5f19..a02425c3c208bd160e1854d476ea56283bb4502c 100644 (file)
@@ -990,7 +990,7 @@ chandir:
 keyval:
        expr ':' expr
        {
-               $$ = nod(OLIST, $1, $3);
+               $$ = nod(OKEY, $1, $3);
        }
 
 /*
index 0bc871a4b3c96b2b7a8534527fa1ed23c4ecee21..33628d07a1b74f48580f04da286d370cad9fb3dc 100644 (file)
@@ -619,6 +619,7 @@ opnames[] =
        [OINDEX]        = "INDEX",
        [OINDEXPTR]     = "INDEXPTR",
        [OIND]          = "IND",
+       [OKEY]          = "KEY",
        [OLABEL]        = "LABEL",
        [OLE]           = "LE",
        [OLEN]          = "LEN",
index 7c7b2b4eec9b5dc5878dafdf7844618bc907f62a..f1889864c1f2d106408fa8b3ff40cabefb20df00 100644 (file)
@@ -56,6 +56,7 @@ loop:
                goto ret;
 
        case OLIST:
+       case OKEY:
                walktype(n->left, top);
                n = n->right;
                goto loop;
@@ -367,7 +368,7 @@ loop:
                goto ret;
 
        case OCONV:
-               if(top != Erv)
+               if(top == Etop)
                        goto nottop;
                walktype(n->left, Erv);
 
@@ -434,6 +435,13 @@ loop:
                        goto ret;
                }
 
+               // map literal
+               if(t->etype == TMAP) {
+                       r = maplit(n);
+                       *n = *r;
+                       goto ret;
+               }
+
                badtype(n->op, l->type, t);
                goto ret;
 
@@ -2871,9 +2879,8 @@ arraylit(Node *n)
        r = listfirst(&saver, &n->left);
 
 loop:
-       if(r == N) {
+       if(r == N)
                return var;
-       }
 
        // build list of var[c] = expr
 
@@ -2886,3 +2893,45 @@ loop:
        r = listnext(&saver);
        goto loop;
 }
+
+Node*
+maplit(Node *n)
+{
+       Iter saver;
+       Type *t;
+       Node *var, *r, *a;
+
+       t = n->type;
+       if(t->etype != TMAP)
+               fatal("maplit: not array");
+       t = ptrto(t);
+
+       var = nod(OXXX, N, N);
+       tempname(var, t);
+
+       a = nod(ONEW, N, N);
+       a->type = t;
+       a = nod(OAS, var, a);
+       addtop = list(addtop, a);
+
+       r = listfirst(&saver, &n->left);
+
+loop:
+       if(r == N) {
+               return var;
+       }
+
+       if(r->op != OKEY) {
+               yyerror("map literal must have key:value pairs");
+               return var;
+       }
+
+       // build list of var[c] = expr
+
+       a = nod(OINDEX, var, r->left);
+       a = nod(OAS, a, r->right);
+       addtop = list(addtop, a);
+
+       r = listnext(&saver);
+       goto loop;
+}