agen_inter(Node *n, Node *res)
{
Node nodo, nodr, nodt;
+ Node *var;
Sym *s;
char *e;
int32 o,lno;
nodo.xoffset = 1*widthptr;
if(!n->left->addable) {
- agen(n->left, &nodr);
- gmove(&nodr, &nodo);
- fatal("agen_inter i2i");
+ var = nod(OXXX, N, N);
+ tempname(var, n->left->type);
+ cgen(n->left, var);
+ cgen(var, &nodo);
} else {
cgen(n->left, &nodo);
}
nodo.xoffset = 1*widthptr;
if(!n->left->addable) {
- agen(n->left, &nodr);
- gmove(&nodr, &nodo);
- fatal("agen_inter i2s");
+ var = nod(OXXX, N, N);
+ tempname(var, n->left->type);
+ cgen(n->left, var);
+ cgen(var, &nodo);
} else {
cgen(n->left, &nodo);
}
OPTR, OARRAY,
ORETURN, OFOR, OIF, OSWITCH, OI2S, OS2I, OI2I,
OAS, OASOP, OCASE, OXCASE, OSCASE, OFALL, OXFALL,
- OGOTO, OPROC, ONEW, OPANIC, OPRINT, OEMPTY, OSELECT,
+ OGOTO, OPROC, ONEW, OEMPTY, OSELECT,
+ OLEN, OPANIC, OPRINT, OTYPEOF,
OOROR,
OANDAND,
OEQ, ONE, OLT, OLE, OGE, OGT,
OADD, OSUB, OOR, OXOR,
OMUL, ODIV, OMOD, OLSH, ORSH, OAND,
- OLEN,
OFUNC,
OLABEL,
OBREAK,
%token <sym> LPACKAGE LIMPORT LEXPORT
%token <sym> LMAP LCHAN LINTERFACE LFUNC LSTRUCT
%token <sym> LCOLAS LFALL LRETURN
-%token <sym> LNEW LLEN
+%token <sym> LNEW LLEN LTYPEOF LPANIC LPRINT
%token <sym> LVAR LTYPE LCONST LCONVERT LSELECT
%token <sym> LFOR LIF LELSE LSWITCH LCASE LDEFAULT
%token <sym> LBREAK LCONTINUE LGO LGOTO LRANGE
%token <sym> LNIL LTRUE LFALSE LIOTA
-%token <sym> LPANIC LPRINT LIGNORE
%token LOROR LANDAND LEQ LNE LLE LLT LGE LGT
%token LLSH LRSH LINC LDEC LSEND LRECV
+%token LIGNORE
%type <sym> sym sym1 sym2 key1 key2 laconst lname latype
%type <lint> chandir
{
$$ = nod(OLEN, $3, N);
}
+| LTYPEOF '(' type ')'
+ {
+ $$ = nod(OTYPEOF, N, N);
+ $$->type = $3;
+ }
| LNEW '(' type ')'
{
$$ = nod(ONEW, N, N);
| LPRINT
| LNEW
| LBASETYPE
+| LTYPEOF
/*
* keywords that we can
| LGO
| LGOTO
| LRANGE
-| LIGNORE
name:
lname
"chan", LCHAN, Txxx,
"const", LCONST, Txxx,
"continue", LCONTINUE, Txxx,
- "convert", LCONVERT, Txxx, // should be a var
+ "convert", LCONVERT, Txxx,
"default", LDEFAULT, Txxx,
"else", LELSE, Txxx,
"export", LEXPORT, Txxx,
"fallthrough", LFALL, Txxx,
- "false", LFALSE, Txxx, // should be a var
+ "false", LFALSE, Txxx,
"for", LFOR, Txxx,
"func", LFUNC, Txxx,
"go", LGO, Txxx,
"interface", LINTERFACE, Txxx,
"iota", LIOTA, Txxx,
"map", LMAP, Txxx,
- "new", LNEW, Txxx, // should be a var
- "len", LLEN, Txxx, // should be a var
- "nil", LNIL, Txxx, // should be a var
+ "new", LNEW, Txxx,
+ "len", LLEN, Txxx,
+ "nil", LNIL, Txxx,
"package", LPACKAGE, Txxx,
- "panic", LPANIC, Txxx, // temp
- "print", LPRINT, Txxx, // temp
+ "panic", LPANIC, Txxx,
+ "print", LPRINT, Txxx,
"range", LRANGE, Txxx,
"return", LRETURN, Txxx,
"select", LSELECT, Txxx,
"struct", LSTRUCT, Txxx,
"switch", LSWITCH, Txxx,
- "true", LTRUE, Txxx, // should be a var
+ "true", LTRUE, Txxx,
"type", LTYPE, Txxx,
+ "typeof", LTYPEOF, Txxx,
"var", LVAR, Txxx,
"notwithstanding", LIGNORE, Txxx,