diff --git a/sourcepawn/compiler/sc1.c b/sourcepawn/compiler/sc1.c index 0119a844..3af5f8ed 100644 --- a/sourcepawn/compiler/sc1.c +++ b/sourcepawn/compiler/sc1.c @@ -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; inumdim; 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; inumdim; 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('=')) { diff --git a/sourcepawn/compiler/sc3.c b/sourcepawn/compiler/sc3.c index 768c0ffe..5ff02707 100644 --- a/sourcepawn/compiler/sc3.c +++ b/sourcepawn/compiler/sc3.c @@ -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; level0); + if (arg[argidx].numdim==1) { + append_constval(&arrayszlst,arg[argidx].name,arg[argidx].defvalue.array.arraysize,0); + } else { + for (level=0; level