ref: 4cbf921e4eb323a3c8817e1471632fd25021a2a1
parent: 9ddae457b5c0790d6293dcb24b445079017d2afe
author: Ori Bernstein <[email protected]>
date: Thu Jun 7 13:17:29 EDT 2012
Implement Osize operator
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -327,7 +327,7 @@
case Tyslice: u = mkexpr(-1, Oslbase, t, NULL); break;
default: die("Unslicable type %s", tystr(n->expr.type));
}
- /* safe: all types have a sub[0] that we want to grab */
+ /* safe: all types we allow here have a sub[0] that we want to grab */
sz = tysize(n->expr.type->sub[0]);
v = mkexpr(-1, Omul, u, mkexpr(-1, Olit, mkint(-1, sz), NULL), NULL);
return mkexpr(-1, Oadd, u, v, NULL);
@@ -376,9 +376,11 @@
switch (exprop(n)) {
case Obad:
case Olor: case Oland:
- case Osize:
die("Have not implemented lowering op %s", opstr(exprop(n)));
break;
+ case Osize:
+ r = mkexpr(-1, Olit, mkint(-1, size(args[0])), NULL);
+ break;
case Oslice:
args[1] = rval(s, args[1]);
args[2] = rval(s, args[2]);
@@ -441,8 +443,7 @@
t = mkexpr(-1, Ostor, r, v, NULL);
lappend(&s->incqueue, &s->nqueue, t);
break;
- case Olit:
- case Ovar:
+ case Olit: case Ovar:
r = n;
break;
case Oret: