Fix passing variant_t parameters + fix codegen stack on Win64 (#2117)
* Fix 64-bit JIT not allocating stack space for params on stack Fix wrong cond check for passing objects by value * Fix wrong FireOutput detour proto on win64
This commit is contained in:
parent
5cb2d68fd7
commit
f08f1ef0d6
@ -787,7 +787,7 @@ inline void Write_PushObject(JitWriter *jit, const SourceHook::PassInfo *info, u
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
#elif defined PLATFORM_WINDOWS
|
#elif defined PLATFORM_WINDOWS
|
||||||
if (info->size < 64 && (info->size & (info->size - 1)) == 0)
|
if (info->size > 8 || (info->size & (info->size - 1)) != 0)
|
||||||
goto push_byref;
|
goto push_byref;
|
||||||
else {
|
else {
|
||||||
SourceHook::PassInfo podInfo;
|
SourceHook::PassInfo podInfo;
|
||||||
@ -1055,7 +1055,11 @@ void *JIT_CallCompile(CallWrapper *pWrapper, FuncAddrMethod method)
|
|||||||
int numWords;
|
int numWords;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef PLATFORM_POSIX
|
||||||
g_StackUsage = 0;
|
g_StackUsage = 0;
|
||||||
|
#elif defined PLATFORM_WINDOWS
|
||||||
|
g_StackUsage = 32; // Shadow space
|
||||||
|
#endif
|
||||||
|
|
||||||
writer.outbase = NULL;
|
writer.outbase = NULL;
|
||||||
writer.outptr = NULL;
|
writer.outptr = NULL;
|
||||||
@ -1155,8 +1159,12 @@ skip_retbuffer:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Clean up the calling stack */
|
/* Clean up the calling stack */
|
||||||
|
#ifdef PLATFORM_POSIX
|
||||||
if (hasParams && g_StackUsage)
|
if (hasParams && g_StackUsage)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
Write_RectifyStack(jit, g_StackAlign);
|
Write_RectifyStack(jit, g_StackAlign);
|
||||||
|
}
|
||||||
|
|
||||||
/* Copy the return type to the return buffer if the function is not void */
|
/* Copy the return type to the return buffer if the function is not void */
|
||||||
if (pRet && !Needs_Retbuf)
|
if (pRet && !Needs_Retbuf)
|
||||||
|
@ -73,7 +73,7 @@ bool EntityOutputManager::IsEnabled()
|
|||||||
return enabled;
|
return enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PLATFORM_WINDOWS
|
#if defined PLATFORM_WINDOWS && defined PLATFORM_X86
|
||||||
DETOUR_DECL_MEMBER8(FireOutput, void, int, what, int, the, int, hell, int, msvc, void *, variant_t, CBaseEntity *, pActivator, CBaseEntity *, pCaller, float, fDelay)
|
DETOUR_DECL_MEMBER8(FireOutput, void, int, what, int, the, int, hell, int, msvc, void *, variant_t, CBaseEntity *, pActivator, CBaseEntity *, pCaller, float, fDelay)
|
||||||
{
|
{
|
||||||
bool fireOutput = g_OutputManager.FireEventDetour((void *)this, pActivator, pCaller, fDelay);
|
bool fireOutput = g_OutputManager.FireEventDetour((void *)this, pActivator, pCaller, fDelay);
|
||||||
|
@ -311,7 +311,7 @@ static cell_t FireEntityOutput(IPluginContext *pContext, const cell_t *params)
|
|||||||
{
|
{
|
||||||
return pContext->ThrowNativeError("\"FireEntityOutput\" not supported by this mod");
|
return pContext->ThrowNativeError("\"FireEntityOutput\" not supported by this mod");
|
||||||
}
|
}
|
||||||
#ifdef PLATFORM_WINDOWS
|
#if defined PLATFORM_WINDOWS && defined PLATFORM_X86
|
||||||
int iMaxParam = 8;
|
int iMaxParam = 8;
|
||||||
//Instead of being one param, MSVC broke variant_t param into 5 params..
|
//Instead of being one param, MSVC broke variant_t param into 5 params..
|
||||||
PassInfo pass[8];
|
PassInfo pass[8];
|
||||||
|
Loading…
Reference in New Issue
Block a user