Fixed bug: crashed when parameter has same name as function

This commit is contained in:
ceriel 1995-12-20 09:58:56 +00:00
parent d0288b673b
commit 67cb729554

View file

@ -522,49 +522,62 @@ declare_formals(idf, fp)
register struct stack_entry *se = stack_level_of(L_FORMAL1)->sl_entry;
arith f_offset = (arith)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
if (options['t'])
dumpidftab("start declare_formals", 0);
#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 */
f_offset = pointer_size;
}
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 */
if (!def || def->df_level < L_FORMAL1 ) {
if (!df || df->df_level < L_FORMAL1 ) {
se = se->next;
continue;
}
def->df_address = f_offset;
df->df_address = f_offset;
/* the alignment convention for parameters is: align on
word boundaries, i.e. take care that the following
parameter starts on a new word boundary.
*/
if (! hasproto
&& def->df_type->tp_fund == FLOAT
&& def->df_type->tp_size != double_size) {
&& df->df_type->tp_fund == FLOAT
&& df->df_type->tp_size != double_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);
RegisterAccount(def->df_address, def->df_type->tp_size,
regtype(def->df_type),
def->df_sc);
else f_offset = align(f_offset + df->df_type->tp_size, (int) word_size);
RegisterAccount(df->df_address, df->df_type->tp_size,
regtype(df->df_type),
df->df_sc);
/* 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)
strict("number of formal parameters exceeds ANSI limit");
#ifdef DBSYMTAB
if (options['g']) {
stb_string(def, FORMAL, se->se_idf->id_text);
stb_string(df, FORMAL, se->se_idf->id_text);
}
#endif /* DBSYMTAB */
se = se->next;