ref: fbbdeabda88a0262e59d68fcf5227c165d673afe
parent: e119045a1d483c7dc7808c140a3659e41b9d160b
author: Ori Bernstein <[email protected]>
date: Sat Jun 8 08:47:09 EDT 2013
Add support for compiling struct literals.
--- a/6/isel.c
+++ b/6/isel.c
@@ -877,6 +877,7 @@
{
char lbl[128];
size_t i;
+ Node *val;
char *intsz[] = {
[1] = ".byte",
[2] = ".short",
@@ -896,12 +897,16 @@
writeblob(fd, v->lit.strval, strlen(v->lit.strval));
break;
case Larray:
- for (i = 0; i < v->lit.nelt; i++)
- writelit(fd, v->lit.seqval[i]->expr.args[0], size(v->lit.seqval[i]));
+ for (i = 0; i < v->lit.nelt; i++) {
+ val = v->lit.seqval[i]->idxinit.init;
+ writelit(fd, val->expr.args[0], size(val));
+ }
break;
case Lstruct:
- for (i = 0; i < v->lit.nelt; i++)
- writelit(fd, v->lit.seqval[i]->expr.args[0], size(v->lit.seqval[i]));
+ for (i = 0; i < v->lit.nelt; i++) {
+ val = v->lit.seqval[i]->idxinit.init;
+ writelit(fd, val->expr.args[0], size(val));
+ }
break;
case Lfunc:
die("Generating this shit ain't ready yet ");
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -622,9 +622,9 @@
: /* empty */
| arrayelt
{$$.nl = NULL; $$.nn = 0;
- lappend(&$$.nl, &$$.nn, $1);}
+ lappend(&$$.nl, &$$.nn, mkidxinit($1->line, mkint($1->line, 0), $1));}
| arrayelts Tcomma arrayelt
- {lappend(&$$.nl, &$$.nn, $3);}
+ {lappend(&$$.nl, &$$.nn, mkidxinit($3->line, mkint($3->line, $$.nn), $3));}
arrayelt: endlns expr endlns {$$ = $2;}
;
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -339,6 +339,7 @@
case Nexpr: t = n->expr.type; break;
case Ndecl: t = decltype(n); break;
case Nfunc: t = n->func.type; break;
+ case Nidxinit: t = type(st, n->idxinit.init); break;
default:
t = NULL;
die("untypeable node %s", nodestr(n->type));
--- a/test/structlit.myr
+++ b/test/structlit.myr
@@ -1,3 +1,5 @@
+use std
+
/* checks that we can create struct literals with named initializers.
exits with 42. */
type t = struct