Port bugfix for incorrect heap deallocation on conditional operator (#627)
* Revert 4f8917ec
(experimental bugfix for heap in conditional)
* Port bugfix for incorrect heap deallocation on conditional operator (ported from compuphase upstream)
* Fix the upstream bugfix
Fixed the wrong order of heaplist nodes and the incorrect calculation of the max. heap usage.
* Add an additional pass for functions that return array if they are used before definition (inside definition (recursion) is a "before definition" situation too)
This commit is contained in:
committed by
Vincent Herbet
parent
77eb33d5f2
commit
20d917a307
@ -628,6 +628,7 @@ int pc_compile(int argc, char *argv[])
|
||||
/* reset "defined" flag of all functions and global variables */
|
||||
reduce_referrers(&glbtab);
|
||||
delete_symbols(&glbtab,0,TRUE,FALSE);
|
||||
delete_heaplisttable();
|
||||
#if !defined NO_DEFINE
|
||||
delete_substtable();
|
||||
inst_datetime_defines();
|
||||
@ -805,6 +806,7 @@ cleanup:
|
||||
free(sc_documentation);
|
||||
#endif
|
||||
delete_autolisttable();
|
||||
delete_heaplisttable();
|
||||
if (errnum!=0) {
|
||||
if (strlen(errfname)==0)
|
||||
pc_printf("\n%d Error%s.\n",errnum,(errnum>1) ? "s" : "");
|
||||
@ -5450,6 +5452,16 @@ static void doreturn(void)
|
||||
/* nothing */;
|
||||
sub=addvariable(curfunc->name,(argcount+3)*sizeof(cell),iREFARRAY,sGLOBAL,curfunc->tag,dim,numdim,idxtag);
|
||||
sub->parent=curfunc;
|
||||
/* Function that returns array can be used before it is defined, so at
|
||||
* the call point (if it is before definition) we may not know if this
|
||||
* function returns array and what is its size (for example inside the
|
||||
* conditional operator), so we don't know how many cells on the heap
|
||||
* we need. Calculating heap consumption is required for the fix of
|
||||
* incorrect heap deallocation on conditional operator. That's why we
|
||||
* need an additional pass.
|
||||
*/
|
||||
if ((curfunc->usage & uREAD)!=0)
|
||||
sc_reparse=TRUE;
|
||||
} /* if */
|
||||
/* get the hidden parameter, copy the array (the array is on the heap;
|
||||
* it stays on the heap for the moment, and it is removed -usually- at
|
||||
|
Reference in New Issue
Block a user