Fixed bug: crashed when parameter has same name as function
This commit is contained in:
		
							parent
							
								
									d0288b673b
								
							
						
					
					
						commit
						67cb729554
					
				
					 1 changed files with 27 additions and 14 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		
		Reference in a new issue