dynamic arrays no longer use a different token
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40157
This commit is contained in:
parent
e18699c702
commit
0bdf321d67
@ -568,7 +568,7 @@ SC_FUNC int check_userop(void (*oper)(void),int tag1,int tag2,int numparam,
|
|||||||
value *lval,int *resulttag);
|
value *lval,int *resulttag);
|
||||||
SC_FUNC int matchtag(int formaltag,int actualtag,int allowcoerce);
|
SC_FUNC int matchtag(int formaltag,int actualtag,int allowcoerce);
|
||||||
SC_FUNC int checktag(int tags[],int numtags,int exprtag);
|
SC_FUNC int checktag(int tags[],int numtags,int exprtag);
|
||||||
SC_FUNC int expression(cell *val,int *tag,symbol **symptr,int chkfuncresult);
|
SC_FUNC int expression(cell *val,int *tag,symbol **symptr,int chkfuncresult,value *_lval);
|
||||||
SC_FUNC int sc_getstateid(constvalue **automaton,constvalue **state);
|
SC_FUNC int sc_getstateid(constvalue **automaton,constvalue **state);
|
||||||
SC_FUNC cell array_totalsize(symbol *sym);
|
SC_FUNC cell array_totalsize(symbol *sym);
|
||||||
SC_FUNC int matchtag_string(int ident, int tag);
|
SC_FUNC int matchtag_string(int ident, int tag);
|
||||||
|
@ -119,6 +119,8 @@ static void compound(int stmt_sameline,int starttok);
|
|||||||
static int test(int label,int parens,int invert);
|
static int test(int label,int parens,int invert);
|
||||||
static int doexpr(int comma,int chkeffect,int allowarray,int mark_endexpr,
|
static int doexpr(int comma,int chkeffect,int allowarray,int mark_endexpr,
|
||||||
int *tag,symbol **symptr,int chkfuncresult);
|
int *tag,symbol **symptr,int chkfuncresult);
|
||||||
|
static int doexpr2(int comma,int chkeffect,int allowarray,int mark_endexpr,
|
||||||
|
int *tag,symbol **symptr,int chkfuncresult,value *lval);
|
||||||
static void doassert(void);
|
static void doassert(void);
|
||||||
static void doexit(void);
|
static void doexit(void);
|
||||||
static int doif(void);
|
static int doif(void);
|
||||||
@ -1733,7 +1735,7 @@ static void declglb(char *firstname,int firsttag,int fpublic,int fstatic,int fst
|
|||||||
#endif
|
#endif
|
||||||
dim[numdim++]=(int)size;
|
dim[numdim++]=(int)size;
|
||||||
} /* while */
|
} /* while */
|
||||||
if (ident == iARRAY && tag == pc_tag_string)
|
if (ident == iARRAY && tag == pc_tag_string && dim[numdim-1])
|
||||||
dim[numdim-1] = (size + sizeof(cell)-1) / sizeof(cell);
|
dim[numdim-1] = (size + sizeof(cell)-1) / sizeof(cell);
|
||||||
assert(sc_curstates==0);
|
assert(sc_curstates==0);
|
||||||
sc_curstates=getstates(name);
|
sc_curstates=getstates(name);
|
||||||
@ -1944,7 +1946,7 @@ static int declloc(int fstatic)
|
|||||||
int idxtag[sDIMEN_MAX];
|
int idxtag[sDIMEN_MAX];
|
||||||
char name[sNAMEMAX+1];
|
char name[sNAMEMAX+1];
|
||||||
symbol *sym;
|
symbol *sym;
|
||||||
constvalue *enumroot;
|
constvalue *enumroot=NULL;
|
||||||
cell val,size;
|
cell val,size;
|
||||||
char *str;
|
char *str;
|
||||||
value lval = {0};
|
value lval = {0};
|
||||||
@ -1980,44 +1982,63 @@ static int declloc(int fstatic)
|
|||||||
if ((sym=findloc(name))!=NULL && sym->compound!=nestlevel || findglb(name,sGLOBAL)!=NULL)
|
if ((sym=findloc(name))!=NULL && sym->compound!=nestlevel || findglb(name,sGLOBAL)!=NULL)
|
||||||
error(219,name); /* variable shadows another symbol */
|
error(219,name); /* variable shadows another symbol */
|
||||||
if (matchtoken('[')) {
|
if (matchtoken('[')) {
|
||||||
do {
|
int _index;
|
||||||
ident=iARRAY;
|
cell _code;
|
||||||
if (numdim == sDIMEN_MAX) {
|
|
||||||
error(53); /* exceeding maximum number of dimensions */
|
|
||||||
return ident;
|
|
||||||
} /* if */
|
|
||||||
size=needsub(&idxtag[numdim],&enumroot); /* get size; size==0 for "var[]" */
|
|
||||||
#if INT_MAX < LONG_MAX
|
|
||||||
if (size > INT_MAX)
|
|
||||||
error(105); /* overflow, exceeding capacity */
|
|
||||||
#endif
|
|
||||||
dim[numdim++]=(int)size;
|
|
||||||
} while (matchtoken('['));
|
|
||||||
/* Change the last dimension to be based on chars instead if we have a string */
|
|
||||||
if (tag == pc_tag_string)
|
|
||||||
dim[numdim-1] = (size + sizeof(cell)-1) / sizeof(cell);
|
|
||||||
} else if (matchtoken('(')) {
|
|
||||||
int dim_ident;
|
int dim_ident;
|
||||||
symbol *dim_sym;
|
symbol *dim_sym;
|
||||||
|
value dim_val;
|
||||||
|
int all_constant = 1;
|
||||||
|
int _staging = staging;
|
||||||
|
|
||||||
|
if (!_staging)
|
||||||
|
stgset(TRUE);
|
||||||
|
stgget(&_index, &_code);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ident=iREFARRAY;
|
|
||||||
if (numdim == sDIMEN_MAX) {
|
if (numdim == sDIMEN_MAX) {
|
||||||
error(53);
|
error(53); /* exceeding maximum number of dimensions */
|
||||||
return iREFARRAY;
|
return (all_constant ? iARRAY : iREFARRAY);
|
||||||
} /* if */
|
} /* if */
|
||||||
dim_ident = doexpr(TRUE,FALSE,FALSE,FALSE,&idxtag[numdim],&dim_sym,0);
|
if (matchtoken(']')) {
|
||||||
dim[numdim] = 0;
|
dim[numdim++] = 0;
|
||||||
if (dim_ident == iVARIABLE || dim_ident == iEXPRESSION) {
|
continue;
|
||||||
|
}
|
||||||
|
dim_ident = doexpr2(TRUE,FALSE,FALSE,FALSE,&idxtag[numdim],&dim_sym,0,&dim_val);
|
||||||
|
if (dim_ident == iVARIABLE || dim_ident == iEXPRESSION || dim_ident == iARRAYCELL) {
|
||||||
|
all_constant = 0;
|
||||||
pushreg(sPRI);
|
pushreg(sPRI);
|
||||||
} else if (dim_ident == iCONSTEXPR) {
|
} else if (dim_ident == iCONSTEXPR) {
|
||||||
pushreg(sPRI);
|
pushreg(sPRI);
|
||||||
|
dim[numdim] = dim_val.constval;
|
||||||
|
/* :TODO: :URGENT: Make sure this still works */
|
||||||
|
if (dim_sym && dim_sym->usage & uENUMROOT)
|
||||||
|
enumroot = dim_sym->dim.enumlist;
|
||||||
|
idxtag[numdim] = dim_sym ? dim_sym->tag : 0;
|
||||||
|
#if INT_MAX < LONG_MAX
|
||||||
|
if (dim[numdim] > INT_MAX)
|
||||||
|
error(105); /* overflow, exceeding capacity */
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
assert(0); //:TODO: make this an error
|
error(29); /* invalid expression, assumed 0 */
|
||||||
}
|
}
|
||||||
needtoken(')');
|
|
||||||
numdim++;
|
numdim++;
|
||||||
} while (matchtoken('('));
|
needtoken(']');
|
||||||
genarray(numdim, autozero);
|
} while (matchtoken('['));
|
||||||
|
if (all_constant) {
|
||||||
|
/* Change the last dimension to be based on chars instead if we have a string */
|
||||||
|
if (tag == pc_tag_string && dim[numdim-1])
|
||||||
|
dim[numdim-1] = (size + sizeof(cell)-1) / sizeof(cell);
|
||||||
|
/* Scrap the code generated */
|
||||||
|
ident = iARRAY;
|
||||||
|
stgdel(_index, _code);
|
||||||
|
} else {
|
||||||
|
memset(dim, 0, sizeof(int)*sDIMEN_MAX);
|
||||||
|
ident = iREFARRAY;
|
||||||
|
genarray(numdim, autozero);
|
||||||
|
}
|
||||||
|
stgout(_index);
|
||||||
|
if (!_staging)
|
||||||
|
stgset(FALSE);
|
||||||
}
|
}
|
||||||
if (getstates(name))
|
if (getstates(name))
|
||||||
error(88,name); /* local variables may not have states */
|
error(88,name); /* local variables may not have states */
|
||||||
@ -3369,7 +3390,7 @@ static void funcstub(int fnative)
|
|||||||
dim[numdim++]=(int)size;
|
dim[numdim++]=(int)size;
|
||||||
} /* while */
|
} /* while */
|
||||||
|
|
||||||
if (tag == pc_tag_string)
|
if (tag == pc_tag_string && dim[numdim-1])
|
||||||
dim[numdim-1] = (size + sizeof(cell)-1) / sizeof(cell);
|
dim[numdim-1] = (size + sizeof(cell)-1) / sizeof(cell);
|
||||||
|
|
||||||
tok=lex(&val,&str);
|
tok=lex(&val,&str);
|
||||||
@ -5111,6 +5132,16 @@ static void compound(int stmt_sameline,int starttok)
|
|||||||
*/
|
*/
|
||||||
static int doexpr(int comma,int chkeffect,int allowarray,int mark_endexpr,
|
static int doexpr(int comma,int chkeffect,int allowarray,int mark_endexpr,
|
||||||
int *tag,symbol **symptr,int chkfuncresult)
|
int *tag,symbol **symptr,int chkfuncresult)
|
||||||
|
{
|
||||||
|
return doexpr2(comma,chkeffect,allowarray,mark_endexpr,tag,symptr,chkfuncresult,NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* doexpr2
|
||||||
|
*
|
||||||
|
* Global references: stgidx (referred to only)
|
||||||
|
*/
|
||||||
|
static int doexpr2(int comma,int chkeffect,int allowarray,int mark_endexpr,
|
||||||
|
int *tag,symbol **symptr,int chkfuncresult,value *lval)
|
||||||
{
|
{
|
||||||
int index,ident;
|
int index,ident;
|
||||||
int localstaging=FALSE;
|
int localstaging=FALSE;
|
||||||
@ -5128,7 +5159,7 @@ static int doexpr(int comma,int chkeffect,int allowarray,int mark_endexpr,
|
|||||||
if (index!=stgidx)
|
if (index!=stgidx)
|
||||||
markexpr(sEXPR,NULL,0);
|
markexpr(sEXPR,NULL,0);
|
||||||
sideeffect=FALSE;
|
sideeffect=FALSE;
|
||||||
ident=expression(&val,tag,symptr,chkfuncresult);
|
ident=expression(&val,tag,symptr,chkfuncresult,lval);
|
||||||
if (!allowarray && (ident==iARRAY || ident==iREFARRAY))
|
if (!allowarray && (ident==iARRAY || ident==iREFARRAY))
|
||||||
error(33,"-unknown-"); /* array must be indexed */
|
error(33,"-unknown-"); /* array must be indexed */
|
||||||
if (chkeffect && !sideeffect)
|
if (chkeffect && !sideeffect)
|
||||||
@ -5155,7 +5186,7 @@ SC_FUNC int constexpr(cell *val,int *tag,symbol **symptr)
|
|||||||
stgset(TRUE); /* start stage-buffering */
|
stgset(TRUE); /* start stage-buffering */
|
||||||
stgget(&index,&cidx); /* mark position in code generator */
|
stgget(&index,&cidx); /* mark position in code generator */
|
||||||
errorset(sEXPRMARK,0);
|
errorset(sEXPRMARK,0);
|
||||||
ident=expression(val,tag,symptr,FALSE);
|
ident=expression(val,tag,symptr,FALSE,NULL);
|
||||||
stgdel(index,cidx); /* scratch generated code */
|
stgdel(index,cidx); /* scratch generated code */
|
||||||
stgset(FALSE); /* stop stage-buffering */
|
stgset(FALSE); /* stop stage-buffering */
|
||||||
if (ident!=iCONSTEXPR) {
|
if (ident!=iCONSTEXPR) {
|
||||||
@ -5214,7 +5245,7 @@ static int test(int label,int parens,int invert)
|
|||||||
do {
|
do {
|
||||||
stgget(&index,&cidx); /* mark position (of last expression) in
|
stgget(&index,&cidx); /* mark position (of last expression) in
|
||||||
* code generator */
|
* code generator */
|
||||||
ident=expression(&constval,&tag,&sym,TRUE);
|
ident=expression(&constval,&tag,&sym,TRUE,NULL);
|
||||||
tok=matchtoken(',');
|
tok=matchtoken(',');
|
||||||
if (tok)
|
if (tok)
|
||||||
markexpr(sEXPR,NULL,0);
|
markexpr(sEXPR,NULL,0);
|
||||||
@ -5596,7 +5627,7 @@ static void doassert(void)
|
|||||||
stgset(TRUE); /* start staging */
|
stgset(TRUE); /* start staging */
|
||||||
stgget(&index,&cidx); /* mark position in code generator */
|
stgget(&index,&cidx); /* mark position in code generator */
|
||||||
do {
|
do {
|
||||||
expression(NULL,NULL,NULL,FALSE);
|
expression(NULL,NULL,NULL,FALSE,NULL);
|
||||||
stgdel(index,cidx); /* just scrap the code */
|
stgdel(index,cidx); /* just scrap the code */
|
||||||
} while (matchtoken(','));
|
} while (matchtoken(','));
|
||||||
stgset(FALSE); /* stop staging */
|
stgset(FALSE); /* stop staging */
|
||||||
|
@ -890,7 +890,7 @@ static cell calc(cell left,void (*oper)(),cell right,char *boolresult)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SC_FUNC int expression(cell *val,int *tag,symbol **symptr,int chkfuncresult)
|
SC_FUNC int expression(cell *val,int *tag,symbol **symptr,int chkfuncresult,value *_lval)
|
||||||
{
|
{
|
||||||
value lval={0};
|
value lval={0};
|
||||||
pushheaplist();
|
pushheaplist();
|
||||||
@ -908,6 +908,8 @@ SC_FUNC int expression(cell *val,int *tag,symbol **symptr,int chkfuncresult)
|
|||||||
*symptr=lval.sym;
|
*symptr=lval.sym;
|
||||||
if (chkfuncresult)
|
if (chkfuncresult)
|
||||||
checkfunction(&lval);
|
checkfunction(&lval);
|
||||||
|
if (_lval)
|
||||||
|
*_lval=lval;
|
||||||
return lval.ident;
|
return lval.ident;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2723,7 +2725,7 @@ static int constant(value *lval)
|
|||||||
* on at this point */
|
* on at this point */
|
||||||
assert(staging);
|
assert(staging);
|
||||||
stgget(&index,&cidx); /* mark position in code generator */
|
stgget(&index,&cidx); /* mark position in code generator */
|
||||||
ident=expression(&item,&tag,NULL,FALSE);
|
ident=expression(&item,&tag,NULL,FALSE,NULL);
|
||||||
stgdel(index,cidx); /* scratch generated code */
|
stgdel(index,cidx); /* scratch generated code */
|
||||||
if (ident!=iCONSTEXPR)
|
if (ident!=iCONSTEXPR)
|
||||||
error(8); /* must be constant expression */
|
error(8); /* must be constant expression */
|
||||||
|
Loading…
Reference in New Issue
Block a user