Merge pull request #248 from Arkshine/fix/update-compiler3
Update compiler - 3
This commit is contained in:
commit
3792e7dc20
|
@ -2190,15 +2190,36 @@ static int base;
|
||||||
*
|
*
|
||||||
* Global references: litidx (altered)
|
* Global references: litidx (altered)
|
||||||
*/
|
*/
|
||||||
static void initials(int ident,int tag,cell *size,int dim[],int numdim,
|
static void initials2(int ident,int tag,cell *size,int dim[],int numdim,
|
||||||
constvalue *enumroot)
|
constvalue *enumroot, int eq_match_override, int curlit_override)
|
||||||
{
|
{
|
||||||
int ctag;
|
int ctag;
|
||||||
cell tablesize;
|
cell tablesize;
|
||||||
int curlit=litidx;
|
int curlit=(curlit_override == -1) ? litidx : curlit_override;
|
||||||
int err=0;
|
int err=0;
|
||||||
|
|
||||||
if (!matchtoken('=')) {
|
if (eq_match_override == -1) {
|
||||||
|
eq_match_override = matchtoken('=');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numdim > 2) {
|
||||||
|
int d, hasEmpty = 0;
|
||||||
|
for (d = 0; d < numdim; d++) {
|
||||||
|
if (dim[d] == 0)
|
||||||
|
hasEmpty++;
|
||||||
|
}
|
||||||
|
/* Work around ambug 4977 where indirection vectors are computed wrong. */
|
||||||
|
if (hasEmpty && hasEmpty < numdim-1 && dim[numdim-1]) {
|
||||||
|
error(112);
|
||||||
|
/* This will assert with something like [2][][256] from a separate bug.
|
||||||
|
* To prevent this assert, automatically wipe the rest of the dims.
|
||||||
|
*/
|
||||||
|
for (d = 0; d < numdim - 1; d++)
|
||||||
|
dim[d] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!eq_match_override) {
|
||||||
assert(ident!=iARRAY || numdim>0);
|
assert(ident!=iARRAY || numdim>0);
|
||||||
if (ident==iARRAY && dim[numdim-1]==0) {
|
if (ident==iARRAY && dim[numdim-1]==0) {
|
||||||
/* declared as "myvar[];" which is senseless (note: this *does* make
|
/* declared as "myvar[];" which is senseless (note: this *does* make
|
||||||
|
@ -2248,7 +2269,7 @@ static void initials(int ident,int tag,cell *size,int dim[],int numdim,
|
||||||
/* now initialize the sub-arrays */
|
/* now initialize the sub-arrays */
|
||||||
memset(counteddim,0,sizeof counteddim);
|
memset(counteddim,0,sizeof counteddim);
|
||||||
initarray(ident,tag,dim,numdim,0,curlit,counteddim,&lastdim,enumroot,&errorfound);
|
initarray(ident,tag,dim,numdim,0,curlit,counteddim,&lastdim,enumroot,&errorfound);
|
||||||
/* check the specified array dimensions with the initialler counts */
|
/* check the specified array dimensions with the initializer counts */
|
||||||
for (idx=0; idx<numdim-1; idx++) {
|
for (idx=0; idx<numdim-1; idx++) {
|
||||||
if (dim[idx]==0) {
|
if (dim[idx]==0) {
|
||||||
dim[idx]=counteddim[idx];
|
dim[idx]=counteddim[idx];
|
||||||
|
@ -2291,6 +2312,12 @@ static void initials(int ident,int tag,cell *size,int dim[],int numdim,
|
||||||
*size=litidx-curlit; /* number of elements defined */
|
*size=litidx-curlit; /* number of elements defined */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void initials(int ident, int tag, cell *size, int dim[], int numdim,
|
||||||
|
constvalue *enumroot)
|
||||||
|
{
|
||||||
|
initials2(ident, tag, size, dim, numdim, enumroot, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
static cell initarray(int ident,int tag,int dim[],int numdim,int cur,
|
static cell initarray(int ident,int tag,int dim[],int numdim,int cur,
|
||||||
int startlit,int counteddim[],constvalue *lastdim,
|
int startlit,int counteddim[],constvalue *lastdim,
|
||||||
constvalue *enumroot,int *errorfound)
|
constvalue *enumroot,int *errorfound)
|
||||||
|
@ -3699,27 +3726,46 @@ static void doarg(char *name,int ident,int offset,int tags[],int numtags,
|
||||||
} while (matchtoken('['));
|
} while (matchtoken('['));
|
||||||
ident=iREFARRAY; /* "reference to array" (is a pointer) */
|
ident=iREFARRAY; /* "reference to array" (is a pointer) */
|
||||||
if (matchtoken('=')) {
|
if (matchtoken('=')) {
|
||||||
lexpush(); /* initials() needs the "=" token again */
|
|
||||||
assert(litidx==0); /* at the start of a function, this is reset */
|
assert(litidx==0); /* at the start of a function, this is reset */
|
||||||
assert(numtags>0);
|
assert(numtags>0);
|
||||||
initials(ident,tags[0],&size,arg->dim,arg->numdim,enumroot);
|
/* Check if there is a symbol */
|
||||||
assert(size>=litidx);
|
if (matchtoken(tSYMBOL)) {
|
||||||
/* allocate memory to hold the initial values */
|
symbol *sym;
|
||||||
arg->defvalue.array.data=(cell *)malloc(litidx*sizeof(cell));
|
char *name;
|
||||||
if (arg->defvalue.array.data!=NULL) {
|
cell val;
|
||||||
int i;
|
tokeninfo(&val,&name);
|
||||||
memcpy(arg->defvalue.array.data,litq,litidx*sizeof(cell));
|
if ((sym=findglb(name)) == NULL) {
|
||||||
arg->hasdefault=TRUE; /* argument has default value */
|
error(17, name); /* undefined symbol */
|
||||||
arg->defvalue.array.size=litidx;
|
} else {
|
||||||
arg->defvalue.array.addr=-1;
|
arg->hasdefault=TRUE; /* argument as a default value */
|
||||||
/* calulate size to reserve on the heap */
|
memset(&arg->defvalue, 0, sizeof(arg->defvalue));
|
||||||
arg->defvalue.array.arraysize=1;
|
arg->defvalue.array.data=NULL;
|
||||||
for (i=0; i<arg->numdim; i++)
|
arg->defvalue.array.addr=sym->addr;
|
||||||
arg->defvalue.array.arraysize*=arg->dim[i];
|
arg->defvalue_tag=sym->tag;
|
||||||
if (arg->defvalue.array.arraysize < arg->defvalue.array.size)
|
if (sc_status==statWRITE && (sym->usage & uREAD)==0) {
|
||||||
arg->defvalue.array.arraysize = arg->defvalue.array.size;
|
markusage(sym, uREAD);
|
||||||
} /* if */
|
}
|
||||||
litidx=0; /* reset */
|
}
|
||||||
|
} else {
|
||||||
|
initials2(ident, tags[0], &size, arg->dim, arg->numdim, enumroot, 1, 0);
|
||||||
|
assert(size >= litidx);
|
||||||
|
/* allocate memory to hold the initial values */
|
||||||
|
arg->defvalue.array.data=(cell *)malloc(litidx*sizeof(cell));
|
||||||
|
if (arg->defvalue.array.data!=NULL) {
|
||||||
|
int i;
|
||||||
|
memcpy(arg->defvalue.array.data,litq,litidx*sizeof(cell));
|
||||||
|
arg->hasdefault=TRUE; /* argument has default value */
|
||||||
|
arg->defvalue.array.size=litidx;
|
||||||
|
arg->defvalue.array.addr=-1;
|
||||||
|
/* calulate size to reserve on the heap */
|
||||||
|
arg->defvalue.array.arraysize=1;
|
||||||
|
for (i=0; i<arg->numdim; i++)
|
||||||
|
arg->defvalue.array.arraysize*=arg->dim[i];
|
||||||
|
if (arg->defvalue.array.arraysize < arg->defvalue.array.size)
|
||||||
|
arg->defvalue.array.arraysize = arg->defvalue.array.size;
|
||||||
|
} /* if */
|
||||||
|
litidx=0; /* reset */
|
||||||
|
}
|
||||||
} /* if */
|
} /* if */
|
||||||
} else {
|
} else {
|
||||||
if (matchtoken('=')) {
|
if (matchtoken('=')) {
|
||||||
|
|
|
@ -1769,8 +1769,6 @@ static void setdefarray(cell *string,cell size,cell array_sz,cell *dataaddr,int
|
||||||
* the default array data is "dumped" into the data segment only once (on the
|
* the default array data is "dumped" into the data segment only once (on the
|
||||||
* first use).
|
* first use).
|
||||||
*/
|
*/
|
||||||
assert(string!=NULL);
|
|
||||||
assert(size>0);
|
|
||||||
/* check whether to dump the default array */
|
/* check whether to dump the default array */
|
||||||
assert(dataaddr!=NULL);
|
assert(dataaddr!=NULL);
|
||||||
if (sc_status==statWRITE && *dataaddr<0) {
|
if (sc_status==statWRITE && *dataaddr<0) {
|
||||||
|
@ -1784,7 +1782,7 @@ static void setdefarray(cell *string,cell size,cell array_sz,cell *dataaddr,int
|
||||||
* does not modify the default value), directly pass the address of the
|
* does not modify the default value), directly pass the address of the
|
||||||
* array in the data segment.
|
* array in the data segment.
|
||||||
*/
|
*/
|
||||||
if (fconst) {
|
if (fconst || !string) {
|
||||||
ldconst(*dataaddr,sPRI);
|
ldconst(*dataaddr,sPRI);
|
||||||
} else {
|
} else {
|
||||||
/* Generate the code:
|
/* Generate the code:
|
||||||
|
@ -2162,20 +2160,22 @@ static int nesting=0;
|
||||||
arg[argidx].defvalue.array.arraysize,
|
arg[argidx].defvalue.array.arraysize,
|
||||||
&arg[argidx].defvalue.array.addr,
|
&arg[argidx].defvalue.array.addr,
|
||||||
(arg[argidx].usage & uCONST)!=0);
|
(arg[argidx].usage & uCONST)!=0);
|
||||||
if ((arg[argidx].usage & uCONST)==0) {
|
if (arg[argidx].defvalue.array.data != NULL) {
|
||||||
heapalloc+=arg[argidx].defvalue.array.arraysize;
|
if ((arg[argidx].usage & uCONST)==0) {
|
||||||
nest_stkusage+=arg[argidx].defvalue.array.arraysize;
|
heapalloc+=arg[argidx].defvalue.array.arraysize;
|
||||||
} /* if */
|
nest_stkusage+=arg[argidx].defvalue.array.arraysize;
|
||||||
/* keep the lengths of all dimensions of a multi-dimensional default array */
|
} /* if */
|
||||||
assert(arg[argidx].numdim>0);
|
/* keep the lengths of all dimensions of a multi-dimensional default array */
|
||||||
if (arg[argidx].numdim==1) {
|
assert(arg[argidx].numdim>0);
|
||||||
append_constval(&arrayszlst,arg[argidx].name,arg[argidx].defvalue.array.arraysize,0);
|
if (arg[argidx].numdim==1) {
|
||||||
} else {
|
append_constval(&arrayszlst,arg[argidx].name,arg[argidx].defvalue.array.arraysize,0);
|
||||||
for (level=0; level<arg[argidx].numdim; level++) {
|
} else {
|
||||||
assert(level<sDIMEN_MAX);
|
for (level=0; level<arg[argidx].numdim; level++) {
|
||||||
append_constval(&arrayszlst,arg[argidx].name,arg[argidx].dim[level],level);
|
assert(level<sDIMEN_MAX);
|
||||||
} /* for */
|
append_constval(&arrayszlst,arg[argidx].name,arg[argidx].dim[level],level);
|
||||||
} /* if */
|
} /* for */
|
||||||
|
} /* if */
|
||||||
|
}
|
||||||
} else if (arg[argidx].ident==iREFERENCE) {
|
} else if (arg[argidx].ident==iREFERENCE) {
|
||||||
setheap(arg[argidx].defvalue.val);
|
setheap(arg[argidx].defvalue.val);
|
||||||
/* address of the value on the heap in PRI */
|
/* address of the value on the heap in PRI */
|
||||||
|
|
|
@ -129,6 +129,7 @@ static char *fatalmsg[] = {
|
||||||
/*109*/ "invalid path: \"%s\"\n",
|
/*109*/ "invalid path: \"%s\"\n",
|
||||||
/*110*/ "assertion failed: %s\n",
|
/*110*/ "assertion failed: %s\n",
|
||||||
/*111*/ "user error: %s\n",
|
/*111*/ "user error: %s\n",
|
||||||
|
/*112*/ "specify either all dimensions or only the last dimension\n"
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *warnmsg[] = {
|
static char *warnmsg[] = {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user