1
0
mirror of https://github.com/golang/go synced 2024-11-13 19:00:25 -07:00

portability bug

cant assign to closed array

R=r
OCL=21634
CL=21634
This commit is contained in:
Ken Thompson 2008-12-19 14:04:25 -08:00
parent cd40cd2435
commit 6fa74e0973
6 changed files with 39 additions and 30 deletions

View File

@ -151,7 +151,7 @@ dowidth(Type *t)
if(t->type == T) if(t->type == T)
break; break;
dowidth(t->type); dowidth(t->type);
w = sizeof(Array); w = sizeof_Array;
if(t->bound >= 0) if(t->bound >= 0)
w = t->bound * t->type->width; w = t->bound * t->type->width;
break; break;
@ -259,5 +259,10 @@ belexinit(int lextype)
symstringo = lookup(".stringo"); // strings symstringo = lookup(".stringo"); // strings
Array_array = rnd(0, types[tptr]->width);
Array_nel = rnd(Array_array+types[tptr]->width, types[TUINT32]->width);
Array_cap = rnd(Array_nel+types[TUINT32]->width, types[TUINT32]->width);
sizeof_Array = rnd(Array_cap+types[TUINT32]->width, maxround);
listinit(); listinit();
} }

View File

@ -189,14 +189,14 @@ cgen(Node *n, Node *res)
// convert dynamic array to static array // convert dynamic array to static array
n2 = n1; n2 = n1;
n2.op = OINDREG; n2.op = OINDREG;
n2.xoffset = offsetof(Array,array); n2.xoffset = Array_array;
n2.type = types[tptr]; n2.type = types[tptr];
gins(AMOVQ, &n2, &n1); gins(AMOVQ, &n2, &n1);
} }
if(isptrdarray(n->type) && isptrsarray(nl->type)) { if(isptrdarray(n->type) && isptrsarray(nl->type)) {
// conver static array to dynamic array // conver static array to dynamic array
// it is assumed that the dope is just before the array // it is assumed that the dope is just before the array
nodconst(&n2, types[tptr], sizeof(Array)); nodconst(&n2, types[tptr], sizeof_Array);
gins(ASUBQ, &n2, &n1); gins(ASUBQ, &n2, &n1);
} }
gmove(&n1, res); gmove(&n1, res);
@ -247,7 +247,7 @@ cgen(Node *n, Node *res)
cgen(nl, &n1); cgen(nl, &n1);
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[TUINT32]; n1.type = types[TUINT32];
n1.xoffset = offsetof(Array,nel); n1.xoffset = Array_nel;
gmove(&n1, res); gmove(&n1, res);
regfree(&n1); regfree(&n1);
break; break;
@ -257,7 +257,7 @@ cgen(Node *n, Node *res)
agen(nl, &n1); agen(nl, &n1);
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[TUINT32]; n1.type = types[TUINT32];
n1.xoffset = offsetof(Array,nel); n1.xoffset = Array_nel;
gmove(&n1, res); gmove(&n1, res);
regfree(&n1); regfree(&n1);
break; break;
@ -271,7 +271,7 @@ cgen(Node *n, Node *res)
cgen(nl, &n1); cgen(nl, &n1);
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[TUINT32]; n1.type = types[TUINT32];
n1.xoffset = offsetof(Array,cap); n1.xoffset = Array_cap;
gmove(&n1, res); gmove(&n1, res);
regfree(&n1); regfree(&n1);
break; break;
@ -281,7 +281,7 @@ cgen(Node *n, Node *res)
agen(nl, &n1); agen(nl, &n1);
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[TUINT32]; n1.type = types[TUINT32];
n1.xoffset = offsetof(Array,cap); n1.xoffset = Array_cap;
gmove(&n1, res); gmove(&n1, res);
regfree(&n1); regfree(&n1);
break; break;
@ -491,7 +491,7 @@ agen(Node *n, Node *res)
n1 = n3; n1 = n3;
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[tptr]; n1.type = types[tptr];
n1.xoffset = offsetof(Array, nel); n1.xoffset = Array_nel;
nodconst(&n2, types[TUINT64], v); nodconst(&n2, types[TUINT64], v);
gins(optoas(OCMP, types[TUINT32]), &n1, &n2); gins(optoas(OCMP, types[TUINT32]), &n1, &n2);
p1 = gbranch(optoas(OGT, types[TUINT32]), T); p1 = gbranch(optoas(OGT, types[TUINT32]), T);
@ -502,7 +502,7 @@ agen(Node *n, Node *res)
n1 = n3; n1 = n3;
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[tptr]; n1.type = types[tptr];
n1.xoffset = offsetof(Array, array); n1.xoffset = Array_array;
gmove(&n1, &n3); gmove(&n1, &n3);
} else } else
if(!debug['B']) { if(!debug['B']) {
@ -540,7 +540,7 @@ agen(Node *n, Node *res)
n1 = n3; n1 = n3;
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[tptr]; n1.type = types[tptr];
n1.xoffset = offsetof(Array, nel); n1.xoffset = Array_nel;
} else { } else {
nodconst(&n1, types[TUINT64], nl->type->bound); nodconst(&n1, types[TUINT64], nl->type->bound);
if(isptrsarray(nl->type)) if(isptrsarray(nl->type))
@ -556,7 +556,7 @@ agen(Node *n, Node *res)
n1 = n3; n1 = n3;
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[tptr]; n1.type = types[tptr];
n1.xoffset = offsetof(Array, array); n1.xoffset = Array_array;
gmove(&n1, &n3); gmove(&n1, &n3);
} }
@ -756,7 +756,7 @@ bgen(Node *n, int true, Prog *to)
agen(nl, &n1); agen(nl, &n1);
n2 = n1; n2 = n1;
n2.op = OINDREG; n2.op = OINDREG;
n2.xoffset = offsetof(Array,array); n2.xoffset = Array_array;
nodconst(&tmp, types[tptr], 0); nodconst(&tmp, types[tptr], 0);
gins(optoas(OCMP, types[tptr]), &n2, &tmp); gins(optoas(OCMP, types[tptr]), &n2, &tmp);
patch(gbranch(a, types[tptr]), to); patch(gbranch(a, types[tptr]), to);

View File

@ -119,6 +119,22 @@ EXTERN Node* newproc;
EXTERN Node* throwindex; EXTERN Node* throwindex;
EXTERN Node* throwreturn; EXTERN Node* throwreturn;
/*
* note this is the runtime representation
* of the compilers arrays.
*
* typedef struct
* { // must not move anything
* uchar array[8]; // pointer to data
* uchar nel[4]; // number of elements
* uchar cap[4]; // allocated number of elements
* } Array;
*/
EXTERN int Array_array; // runtime offsetof(Array,array)
EXTERN int Array_nel; // runtime offsetof(Array,nel)
EXTERN int Array_cap; // runtime offsetof(Array,cap)
EXTERN int sizeof_Array; // runtime sizeof(Array)
/* /*
* gen.c * gen.c
*/ */

View File

@ -1965,7 +1965,7 @@ oindex:
n2 = *reg; n2 = *reg;
n2.op = OINDREG; n2.op = OINDREG;
n2.type = types[tptr]; n2.type = types[tptr];
n2.xoffset = offsetof(Array, nel); n2.xoffset = Array_nel;
} else { } else {
nodconst(&n2, types[TUINT64], l->type->bound); nodconst(&n2, types[TUINT64], l->type->bound);
if(o & OPtrto) if(o & OPtrto)
@ -1981,7 +1981,7 @@ oindex:
n2 = *reg; n2 = *reg;
n2.op = OINDREG; n2.op = OINDREG;
n2.type = types[tptr]; n2.type = types[tptr];
n2.xoffset = offsetof(Array, array); n2.xoffset = Array_array;
gmove(&n2, reg); gmove(&n2, reg);
} }
@ -2011,7 +2011,7 @@ oindex_const:
n1 = *reg; n1 = *reg;
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[tptr]; n1.type = types[tptr];
n1.xoffset = offsetof(Array, nel); n1.xoffset = Array_nel;
nodconst(&n2, types[TUINT64], v); nodconst(&n2, types[TUINT64], v);
gins(optoas(OCMP, types[TUINT32]), &n1, &n2); gins(optoas(OCMP, types[TUINT32]), &n1, &n2);
p1 = gbranch(optoas(OGT, types[TUINT32]), T); p1 = gbranch(optoas(OGT, types[TUINT32]), T);
@ -2022,7 +2022,7 @@ oindex_const:
n1 = *reg; n1 = *reg;
n1.op = OINDREG; n1.op = OINDREG;
n1.type = types[tptr]; n1.type = types[tptr];
n1.xoffset = offsetof(Array, array); n1.xoffset = Array_array;
gmove(&n1, reg); gmove(&n1, reg);
} else } else

View File

@ -61,20 +61,6 @@ struct String
char s[3]; // variable char s[3]; // variable
}; };
/*
* note this is the runtime representation
* of the compilers arrays. it is probably
* insafe to use it this way, but it puts
* all the changes in one place.
*/
typedef struct Array Array;
struct Array
{ // must not move anything
uchar array[8]; // pointer to data
uchar nel[4]; // number of elements
uchar cap[4]; // allocated number of elements
};
/* /*
* note this is the runtime representation * note this is the runtime representation
* of hashmap iterator. it is probably * of hashmap iterator. it is probably

View File

@ -1873,6 +1873,8 @@ ascompat(Type *t1, Type *t2)
// if(eqtype(t2, nilptr, 0)) // if(eqtype(t2, nilptr, 0))
// return 1; // return 1;
if(issarray(t1))
return 0;
if(isnilinter(t1)) if(isnilinter(t1))
return 1; return 1;
if(isinter(t1)) { if(isinter(t1)) {