mirror of
https://github.com/golang/go
synced 2024-11-25 01:17:56 -07:00
more maps
more semi-colons type assignment of constants SVN=123278
This commit is contained in:
parent
c5bb50c9dc
commit
c242b53d22
@ -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;
|
||||
|
||||
|
@ -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*);
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user