Fixed a bug
git-svn-id: svn://svn.cc65.org/cc65/trunk@1269 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
@@ -215,6 +215,7 @@ void NewFunc (SymEntry* Func)
|
|||||||
{
|
{
|
||||||
int HadReturn;
|
int HadReturn;
|
||||||
int IsVoidFunc;
|
int IsVoidFunc;
|
||||||
|
SymEntry* LastParam;
|
||||||
|
|
||||||
/* Get the function descriptor from the function entry */
|
/* Get the function descriptor from the function entry */
|
||||||
FuncDesc* D = Func->V.F.Func;
|
FuncDesc* D = Func->V.F.Func;
|
||||||
@@ -225,17 +226,20 @@ void NewFunc (SymEntry* Func)
|
|||||||
/* Reenter the lexical level */
|
/* Reenter the lexical level */
|
||||||
ReenterFunctionLevel (D);
|
ReenterFunctionLevel (D);
|
||||||
|
|
||||||
|
/* Before adding more symbols, remember the last parameter for later */
|
||||||
|
LastParam = D->SymTab->SymTail;
|
||||||
|
|
||||||
/* Declare two special functions symbols: __fixargs__ and __argsize__.
|
/* Declare two special functions symbols: __fixargs__ and __argsize__.
|
||||||
* The latter is different depending on the type of the function (variadic
|
* The latter is different depending on the type of the function (variadic
|
||||||
* or not).
|
* or not).
|
||||||
*/
|
*/
|
||||||
AddConstSym ("__fixargs__", type_uint, SC_DEF | SC_CONST, D->ParamSize);
|
AddConstSym ("__fixargs__", type_uint, SC_DEF | SC_CONST, D->ParamSize);
|
||||||
if (D->Flags & FD_VARIADIC) {
|
if (D->Flags & FD_VARIADIC) {
|
||||||
/* Variadic function. The variable must be const. */
|
/* Variadic function. The variable must be const. */
|
||||||
static const type T [] = { T_UCHAR | T_QUAL_CONST, T_END };
|
static const type T [] = { T_UCHAR | T_QUAL_CONST, T_END };
|
||||||
AddLocalSym ("__argsize__", T, SC_DEF | SC_REF | SC_AUTO, 0);
|
AddLocalSym ("__argsize__", T, SC_DEF | SC_REF | SC_AUTO, 0);
|
||||||
} else {
|
} else {
|
||||||
/* Non variadic */
|
/* Non variadic */
|
||||||
AddConstSym ("__argsize__", type_uchar, SC_DEF | SC_CONST, D->ParamSize);
|
AddConstSym ("__argsize__", type_uchar, SC_DEF | SC_CONST, D->ParamSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,17 +255,13 @@ void NewFunc (SymEntry* Func)
|
|||||||
/* If this is a fastcall function, push the last parameter onto the stack */
|
/* If this is a fastcall function, push the last parameter onto the stack */
|
||||||
if (IsFastCallFunc (Func->Type) && D->ParamCount > 0) {
|
if (IsFastCallFunc (Func->Type) && D->ParamCount > 0) {
|
||||||
|
|
||||||
SymEntry* LastParam;
|
unsigned Flags;
|
||||||
unsigned Flags;
|
|
||||||
|
|
||||||
/* Fastcall functions may never have an ellipsis or the compiler is buggy */
|
/* Fastcall functions may never have an ellipsis or the compiler is buggy */
|
||||||
CHECK ((D->Flags & FD_VARIADIC) == 0);
|
CHECK ((D->Flags & FD_VARIADIC) == 0);
|
||||||
|
|
||||||
/* Get a pointer to the last parameter entry */
|
/* Generate the push */
|
||||||
LastParam = D->SymTab->SymTail;
|
if (IsTypeFunc (LastParam->Type)) {
|
||||||
|
|
||||||
/* Generate the push */
|
|
||||||
if (IsTypeFunc (LastParam->Type)) {
|
|
||||||
/* Pointer to function */
|
/* Pointer to function */
|
||||||
Flags = CF_PTR;
|
Flags = CF_PTR;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user