mirror of
https://github.com/reactos/reactos.git
synced 2025-04-22 13:10:39 +00:00
[SPEC2DEF]
* Support thiscall and float specifiers. By Samuel Serapion. See issue #6539 for more details. svn path=/trunk/; revision=54021
This commit is contained in:
parent
1c23f7c0ef
commit
da997a7c0e
1 changed files with 16 additions and 1 deletions
|
@ -54,6 +54,7 @@ enum
|
||||||
CC_STDCALL,
|
CC_STDCALL,
|
||||||
CC_CDECL,
|
CC_CDECL,
|
||||||
CC_FASTCALL,
|
CC_FASTCALL,
|
||||||
|
CC_THISCALL,
|
||||||
CC_EXTERN,
|
CC_EXTERN,
|
||||||
CC_STUB,
|
CC_STUB,
|
||||||
};
|
};
|
||||||
|
@ -65,7 +66,8 @@ enum
|
||||||
ARG_STR,
|
ARG_STR,
|
||||||
ARG_WSTR,
|
ARG_WSTR,
|
||||||
ARG_DBL,
|
ARG_DBL,
|
||||||
ARG_INT64
|
ARG_INT64,
|
||||||
|
ARG_FLOAT
|
||||||
};
|
};
|
||||||
|
|
||||||
char* astrCallingConventions[] =
|
char* astrCallingConventions[] =
|
||||||
|
@ -73,6 +75,7 @@ char* astrCallingConventions[] =
|
||||||
"STDCALL",
|
"STDCALL",
|
||||||
"CDECL",
|
"CDECL",
|
||||||
"FASTCALL",
|
"FASTCALL",
|
||||||
|
"THISCALL",
|
||||||
"EXTERN"
|
"EXTERN"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -189,6 +192,7 @@ OutputLine_stub(FILE *file, EXPORT *pexp)
|
||||||
case ARG_STR: fprintf(file, "char*"); break;
|
case ARG_STR: fprintf(file, "char*"); break;
|
||||||
case ARG_WSTR: fprintf(file, "wchar_t*"); break;
|
case ARG_WSTR: fprintf(file, "wchar_t*"); break;
|
||||||
case ARG_DBL: case ARG_INT64 : fprintf(file, "__int64"); break;
|
case ARG_DBL: case ARG_INT64 : fprintf(file, "__int64"); break;
|
||||||
|
case ARG_FLOAT: fprintf(file, "float"); break;
|
||||||
}
|
}
|
||||||
fprintf(file, " a%d", i);
|
fprintf(file, " a%d", i);
|
||||||
}
|
}
|
||||||
|
@ -206,6 +210,7 @@ OutputLine_stub(FILE *file, EXPORT *pexp)
|
||||||
case ARG_WSTR: fprintf(file, "'%%ws'"); break;
|
case ARG_WSTR: fprintf(file, "'%%ws'"); break;
|
||||||
case ARG_DBL: fprintf(file, "%%f"); break;
|
case ARG_DBL: fprintf(file, "%%f"); break;
|
||||||
case ARG_INT64: fprintf(file, "%%\"PRix64\""); break;
|
case ARG_INT64: fprintf(file, "%%\"PRix64\""); break;
|
||||||
|
case ARG_FLOAT: fprintf(file, "%%f"); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(file, ")\\n\"");
|
fprintf(file, ")\\n\"");
|
||||||
|
@ -221,6 +226,7 @@ OutputLine_stub(FILE *file, EXPORT *pexp)
|
||||||
case ARG_WSTR: fprintf(file, "(wchar_t*)a%d", i); break;
|
case ARG_WSTR: fprintf(file, "(wchar_t*)a%d", i); break;
|
||||||
case ARG_DBL: fprintf(file, "(double)a%d", i); break;
|
case ARG_DBL: fprintf(file, "(double)a%d", i); break;
|
||||||
case ARG_INT64: fprintf(file, "(__int64)a%d", i); break;
|
case ARG_INT64: fprintf(file, "(__int64)a%d", i); break;
|
||||||
|
case ARG_FLOAT: fprintf(file, "(float)a%d", i); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(file, ");\n");
|
fprintf(file, ");\n");
|
||||||
|
@ -452,6 +458,10 @@ ParseFile(char* pcStart, FILE *fileDest, PFNOUTLINE OutputLine)
|
||||||
{
|
{
|
||||||
exp.nCallingConvention = CC_FASTCALL;
|
exp.nCallingConvention = CC_FASTCALL;
|
||||||
}
|
}
|
||||||
|
else if (CompareToken(pc, "thiscall"))
|
||||||
|
{
|
||||||
|
exp.nCallingConvention = CC_THISCALL;
|
||||||
|
}
|
||||||
else if (CompareToken(pc, "extern"))
|
else if (CompareToken(pc, "extern"))
|
||||||
{
|
{
|
||||||
exp.nCallingConvention = CC_EXTERN;
|
exp.nCallingConvention = CC_EXTERN;
|
||||||
|
@ -590,6 +600,11 @@ ParseFile(char* pcStart, FILE *fileDest, PFNOUTLINE OutputLine)
|
||||||
exp.nStackBytes += 8;
|
exp.nStackBytes += 8;
|
||||||
exp.anArgs[exp.nArgCount] = ARG_INT64;
|
exp.anArgs[exp.nArgCount] = ARG_INT64;
|
||||||
}
|
}
|
||||||
|
else if (CompareToken(pc, "float"))
|
||||||
|
{
|
||||||
|
exp.nStackBytes += 4;
|
||||||
|
exp.anArgs[exp.nArgCount] = ARG_FLOAT;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
fprintf(stderr, "error: line %d, expected type, got: %.10s\n", nLine, pc);
|
fprintf(stderr, "error: line %d, expected type, got: %.10s\n", nLine, pc);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue