Commit 179af0bb authored by Ken Thompson's avatar Ken Thompson

clear automatic arrays created with literals

R=r
OCL=22215
CL=22215
parent a577ea31
......@@ -3499,63 +3499,63 @@ loop:
goto loop;
}
Node*
oldarraylit(Node *n)
{
Iter saver;
Type *t;
Node *var, *r, *a;
int idx;
t = n->type;
if(t->etype != TARRAY)
fatal("arraylit: not array");
if(t->bound < 0) {
// make a shallow copy
t = typ(0);
*t = *n->type;
n->type = t;
// make it a closed array
r = listfirst(&saver, &n->left);
if(r != N && r->op == OEMPTY)
r = N;
for(idx=0; r!=N; idx++)
r = listnext(&saver);
t->bound = idx;
}
var = nod(OXXX, N, N);
tempname(var, t);
idx = 0;
r = listfirst(&saver, &n->left);
if(r != N && r->op == OEMPTY)
r = N;
loop:
if(r == N)
return var;
// build list of var[c] = expr
a = nodintconst(idx);
a = nod(OINDEX, var, a);
a = nod(OAS, a, r);
addtop = list(addtop, a);
idx++;
r = listnext(&saver);
goto loop;
}
//Node*
//oldarraylit(Node *n)
//{
// Iter saver;
// Type *t;
// Node *var, *r, *a;
// int idx;
//
// t = n->type;
// if(t->etype != TARRAY)
// fatal("arraylit: not array");
//
// if(t->bound < 0) {
// // make a shallow copy
// t = typ(0);
// *t = *n->type;
// n->type = t;
//
// // make it a closed array
// r = listfirst(&saver, &n->left);
// if(r != N && r->op == OEMPTY)
// r = N;
// for(idx=0; r!=N; idx++)
// r = listnext(&saver);
// t->bound = idx;
// }
//
// var = nod(OXXX, N, N);
// tempname(var, t);
//
// idx = 0;
// r = listfirst(&saver, &n->left);
// if(r != N && r->op == OEMPTY)
// r = N;
//
//loop:
// if(r == N)
// return var;
//
// // build list of var[c] = expr
//
// a = nodintconst(idx);
// a = nod(OINDEX, var, a);
// a = nod(OAS, a, r);
// addtop = list(addtop, a);
// idx++;
//
// r = listnext(&saver);
// goto loop;
//}
Node*
arraylit(Node *n)
{
Iter saver;
Type *t;
Node *var, *r, *a, *nas, *nnew;
Node *var, *r, *a, *nnew;
int idx, b;
t = n->type;
......@@ -3571,20 +3571,34 @@ arraylit(Node *n)
nnew = nod(OMAKE, N, N);
nnew->type = t;
nas = nod(OAS, var, nnew);
addtop = list(addtop, nas);
a = nod(OAS, var, nnew);
addtop = list(addtop, a);
}
if(b >= 0) {
idx = 0;
r = listfirst(&saver, &n->left);
if(r != N && r->op == OEMPTY)
r = N;
while(r != N) {
// build list of var[c] = expr
if(b >= 0 && idx >= b) {
yyerror("literal array initializer out of bounds");
break;
// count initializers
idx++;
r = listnext(&saver);
}
// if entire array isnt initialized,
// then clear the array
if(idx < b) {
a = nod(OAS, var, N);
addtop = list(addtop, a);
}
}
idx = 0;
r = listfirst(&saver, &n->left);
if(r != N && r->op == OEMPTY)
r = N;
while(r != N) {
// build list of var[c] = expr
a = nodintconst(idx);
a = nod(OINDEX, var, a);
a = nod(OAS, a, r);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment