added the ability for the compiler to directly reference another address in a default argument (for arrays only)
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401050
This commit is contained in:
parent
cce60de20f
commit
d8d13f1920
@ -2516,15 +2516,19 @@ static int base;
|
||||
*
|
||||
* Global references: litidx (altered)
|
||||
*/
|
||||
static void initials(int ident,int tag,cell *size,int dim[],int numdim,
|
||||
constvalue *enumroot)
|
||||
static void initials2(int ident,int tag,cell *size,int dim[],int numdim,
|
||||
constvalue *enumroot, int eq_match_override)
|
||||
{
|
||||
int ctag;
|
||||
cell tablesize;
|
||||
int curlit=litidx;
|
||||
int err=0;
|
||||
|
||||
if (!matchtoken('=')) {
|
||||
if (eq_match_override == -1) {
|
||||
eq_match_override = matchtoken('=');
|
||||
}
|
||||
|
||||
if (!eq_match_override) {
|
||||
assert(ident!=iARRAY || numdim>0);
|
||||
if (ident==iARRAY && dim[numdim-1]==0) {
|
||||
/* declared as "myvar[];" which is senseless (note: this *does* make
|
||||
@ -2626,6 +2630,12 @@ static void initials(int ident,int tag,cell *size,int dim[],int numdim,
|
||||
*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);
|
||||
}
|
||||
|
||||
static cell initarray(int ident,int tag,int dim[],int numdim,int cur,
|
||||
int startlit,int counteddim[],constvalue *lastdim,
|
||||
constvalue *enumroot,int *errorfound)
|
||||
@ -4386,27 +4396,46 @@ static void doarg(char *name,int ident,int offset,int tags[],int numtags,
|
||||
arg->dim[arg->numdim - 1] = (size + sizeof(cell) - 1) / sizeof(cell);
|
||||
}
|
||||
if (matchtoken('=')) {
|
||||
lexpush(); /* initials() needs the "=" token again */
|
||||
assert(litidx==0); /* at the start of a function, this is reset */
|
||||
assert(numtags>0);
|
||||
initials(ident,tags[0],&size,arg->dim,arg->numdim,enumroot);
|
||||
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 */
|
||||
/* Check if there is a symbol */
|
||||
if (matchtoken(tSYMBOL)) {
|
||||
symbol *sym;
|
||||
char *name;
|
||||
cell val;
|
||||
tokeninfo(&val,&name);
|
||||
if ((sym=findglb(name, sGLOBAL)) == NULL) {
|
||||
error(17, name); /* undefined symbol */
|
||||
} else {
|
||||
arg->hasdefault=TRUE; /* argument as a default value */
|
||||
memset(&arg->defvalue, 0, sizeof(arg->defvalue));
|
||||
arg->defvalue.array.data=NULL;
|
||||
arg->defvalue.array.addr=sym->addr;
|
||||
arg->defvalue_tag=sym->tag;
|
||||
if (sc_status==statWRITE && (sym->usage & uREAD)==0) {
|
||||
markusage(sym, uREAD);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
initials2(ident,tags[0],&size,arg->dim,arg->numdim,enumroot, 1);
|
||||
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 */
|
||||
} else {
|
||||
if (matchtoken('=')) {
|
||||
|
@ -2174,8 +2174,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
|
||||
* first use).
|
||||
*/
|
||||
assert(string!=NULL);
|
||||
assert(size>0);
|
||||
/* check whether to dump the default array */
|
||||
assert(dataaddr!=NULL);
|
||||
if (sc_status==statWRITE && *dataaddr<0) {
|
||||
@ -2189,7 +2187,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
|
||||
* array in the data segment.
|
||||
*/
|
||||
if (fconst) {
|
||||
if (fconst || !string) {
|
||||
ldconst(*dataaddr,sPRI);
|
||||
} else {
|
||||
/* Generate the code:
|
||||
@ -2577,20 +2575,22 @@ static int nesting=0;
|
||||
arg[argidx].defvalue.array.arraysize,
|
||||
&arg[argidx].defvalue.array.addr,
|
||||
(arg[argidx].usage & uCONST)!=0);
|
||||
if ((arg[argidx].usage & uCONST)==0) {
|
||||
heapalloc+=arg[argidx].defvalue.array.arraysize;
|
||||
nest_stkusage+=arg[argidx].defvalue.array.arraysize;
|
||||
} /* if */
|
||||
/* keep the lengths of all dimensions of a multi-dimensional default array */
|
||||
assert(arg[argidx].numdim>0);
|
||||
if (arg[argidx].numdim==1) {
|
||||
append_constval(&arrayszlst,arg[argidx].name,arg[argidx].defvalue.array.arraysize,0);
|
||||
} else {
|
||||
for (level=0; level<arg[argidx].numdim; level++) {
|
||||
assert(level<sDIMEN_MAX);
|
||||
append_constval(&arrayszlst,arg[argidx].name,arg[argidx].dim[level],level);
|
||||
} /* for */
|
||||
} /* if */
|
||||
if (arg[argidx].defvalue.array.data != NULL) {
|
||||
if ((arg[argidx].usage & uCONST)==0) {
|
||||
heapalloc+=arg[argidx].defvalue.array.arraysize;
|
||||
nest_stkusage+=arg[argidx].defvalue.array.arraysize;
|
||||
} /* if */
|
||||
/* keep the lengths of all dimensions of a multi-dimensional default array */
|
||||
assert(arg[argidx].numdim>0);
|
||||
if (arg[argidx].numdim==1) {
|
||||
append_constval(&arrayszlst,arg[argidx].name,arg[argidx].defvalue.array.arraysize,0);
|
||||
} else {
|
||||
for (level=0; level<arg[argidx].numdim; level++) {
|
||||
assert(level<sDIMEN_MAX);
|
||||
append_constval(&arrayszlst,arg[argidx].name,arg[argidx].dim[level],level);
|
||||
} /* for */
|
||||
} /* if */
|
||||
}
|
||||
} else if (arg[argidx].ident==iREFERENCE) {
|
||||
setheap(arg[argidx].defvalue.val);
|
||||
/* address of the value on the heap in PRI */
|
||||
|
Loading…
Reference in New Issue
Block a user