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,10 +4396,28 @@ 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);
 | 
			
		||||
      /* 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));
 | 
			
		||||
@ -4407,6 +4435,7 @@ static void doarg(char *name,int ident,int offset,int tags[],int numtags,
 | 
			
		||||
            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,6 +2575,7 @@ static int nesting=0;
 | 
			
		||||
                    arg[argidx].defvalue.array.arraysize,
 | 
			
		||||
                    &arg[argidx].defvalue.array.addr,
 | 
			
		||||
                    (arg[argidx].usage & uCONST)!=0);
 | 
			
		||||
        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;
 | 
			
		||||
@ -2591,6 +2590,7 @@ static int nesting=0;
 | 
			
		||||
              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