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:
parent
cd40cd2435
commit
6fa74e0973
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user