Fixed bug: crashed when parameter has same name as function
This commit is contained in:
parent
d0288b673b
commit
67cb729554
|
@ -522,49 +522,62 @@ declare_formals(idf, fp)
|
||||||
register struct stack_entry *se = stack_level_of(L_FORMAL1)->sl_entry;
|
register struct stack_entry *se = stack_level_of(L_FORMAL1)->sl_entry;
|
||||||
arith f_offset = (arith)0;
|
arith f_offset = (arith)0;
|
||||||
register int nparams = 0;
|
register int nparams = 0;
|
||||||
int hasproto = idf->id_def->df_type->tp_proto != 0;
|
int hasproto;
|
||||||
|
struct def *df = idf->id_def;
|
||||||
|
|
||||||
|
/* When one of the formals has the same name as the function,
|
||||||
|
it hides the function def. Get it.
|
||||||
|
*/
|
||||||
|
while (se) {
|
||||||
|
if (se->se_idf == idf) {
|
||||||
|
df = df->next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hasproto = df->df_type->tp_proto != 0;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (options['t'])
|
if (options['t'])
|
||||||
dumpidftab("start declare_formals", 0);
|
dumpidftab("start declare_formals", 0);
|
||||||
#endif /* DEBUG */
|
#endif /* DEBUG */
|
||||||
if (is_struct_or_union(idf->id_def->df_type->tp_up->tp_fund)) {
|
if (is_struct_or_union(df->df_type->tp_up->tp_fund)) {
|
||||||
/* create space for address of return value */
|
/* create space for address of return value */
|
||||||
f_offset = pointer_size;
|
f_offset = pointer_size;
|
||||||
}
|
}
|
||||||
while (se) {
|
while (se) {
|
||||||
register struct def *def = se->se_idf->id_def;
|
df = se->se_idf->id_def;
|
||||||
|
|
||||||
/* this stacklevel may also contain tags. ignore them */
|
/* this stacklevel may also contain tags. ignore them */
|
||||||
if (!def || def->df_level < L_FORMAL1 ) {
|
if (!df || df->df_level < L_FORMAL1 ) {
|
||||||
se = se->next;
|
se = se->next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
def->df_address = f_offset;
|
df->df_address = f_offset;
|
||||||
/* the alignment convention for parameters is: align on
|
/* the alignment convention for parameters is: align on
|
||||||
word boundaries, i.e. take care that the following
|
word boundaries, i.e. take care that the following
|
||||||
parameter starts on a new word boundary.
|
parameter starts on a new word boundary.
|
||||||
*/
|
*/
|
||||||
if (! hasproto
|
if (! hasproto
|
||||||
&& def->df_type->tp_fund == FLOAT
|
&& df->df_type->tp_fund == FLOAT
|
||||||
&& def->df_type->tp_size != double_size) {
|
&& df->df_type->tp_size != double_size) {
|
||||||
f_offset = align(f_offset + double_size, (int) word_size);
|
f_offset = align(f_offset + double_size, (int) word_size);
|
||||||
}
|
}
|
||||||
else f_offset = align(f_offset + def->df_type->tp_size, (int) word_size);
|
else f_offset = align(f_offset + df->df_type->tp_size, (int) word_size);
|
||||||
RegisterAccount(def->df_address, def->df_type->tp_size,
|
RegisterAccount(df->df_address, df->df_type->tp_size,
|
||||||
regtype(def->df_type),
|
regtype(df->df_type),
|
||||||
def->df_sc);
|
df->df_sc);
|
||||||
/* cvt int to char or short and double to float, if necessary
|
/* cvt int to char or short and double to float, if necessary
|
||||||
*/
|
*/
|
||||||
formal_cvt(hasproto, def);
|
formal_cvt(hasproto, df);
|
||||||
|
|
||||||
def->df_level = L_FORMAL2; /* CJ */
|
df->df_level = L_FORMAL2; /* CJ */
|
||||||
if (nparams++ >= STDC_NPARAMS)
|
if (nparams++ >= STDC_NPARAMS)
|
||||||
strict("number of formal parameters exceeds ANSI limit");
|
strict("number of formal parameters exceeds ANSI limit");
|
||||||
#ifdef DBSYMTAB
|
#ifdef DBSYMTAB
|
||||||
if (options['g']) {
|
if (options['g']) {
|
||||||
stb_string(def, FORMAL, se->se_idf->id_text);
|
stb_string(df, FORMAL, se->se_idf->id_text);
|
||||||
}
|
}
|
||||||
#endif /* DBSYMTAB */
|
#endif /* DBSYMTAB */
|
||||||
se = se->next;
|
se = se->next;
|
||||||
|
|
Loading…
Reference in a new issue