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; 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;