Skip to content

Commit

Permalink
- create ScriptCall function pointer on VMScriptFunction
Browse files Browse the repository at this point in the history
  • Loading branch information
dpjudas committed Oct 9, 2018
1 parent 137ef03 commit e930dfa
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 27 deletions.
3 changes: 2 additions & 1 deletion src/scripting/vm/jit_call.cpp
Expand Up @@ -417,7 +417,8 @@ int JitCompiler::DoCall(VMFrameStack *stack, VMFunction *call, int b, int c, VMV
else
{
VMCalls[0]++;
numret = VMExec(static_cast<VMScriptFunction *>(call), param, b, returns, c);
auto sfunc = static_cast<VMScriptFunction *>(call);
numret = sfunc->ScriptCall(sfunc, param, b, returns, c);
}

return numret;
Expand Down
1 change: 0 additions & 1 deletion src/scripting/vm/vmexec.cpp
Expand Up @@ -37,7 +37,6 @@
#include "r_state.h"
#include "stats.h"
#include "vmintern.h"
#include "jit.h"
#include "types.h"

extern cycle_t VMCycles[10];
Expand Down
26 changes: 4 additions & 22 deletions src/scripting/vm/vmexec.h
Expand Up @@ -711,7 +711,8 @@ static int ExecScriptFunc(VMFrameStack *stack, VMReturn *ret, int numret)
else
{
VMCalls[0]++;
numret = Exec(static_cast<VMScriptFunction *>(call), reg.param + f->NumParam - b, b, returns, C);
auto sfunc = static_cast<VMScriptFunction *>(call);
numret = sfunc->ScriptCall(sfunc, reg.param + f->NumParam - b, b, returns, C);
}
assert(numret == C && "Number of parameters returned differs from what was expected by the caller");
f->NumParam -= B;
Expand Down Expand Up @@ -753,7 +754,8 @@ static int ExecScriptFunc(VMFrameStack *stack, VMReturn *ret, int numret)
else
{ // FIXME: Not a true tail call
VMCalls[0]++;
return Exec(static_cast<VMScriptFunction *>(call), reg.param + f->NumParam - B, B, ret, numret);
auto sfunc = static_cast<VMScriptFunction *>(call);
return sfunc->ScriptCall(sfunc, reg.param + f->NumParam - B, B, ret, numret);
}
}
NEXTOP;
Expand Down Expand Up @@ -2051,26 +2053,6 @@ static int Exec(VMScriptFunction *func, VMValue *params, int numparams, VMReturn
VMFillParams(params, newf, numparams);
try
{
if (!func->JitCompiled)
{
func->JitFunc = JitCompile(func);
func->JitCompiled = true;
}
if (func->JitFunc)
{
JitExceptionInfo exceptInfo;
exceptInfo.reason = -1;
int result = func->JitFunc(stack, ret, numret, &exceptInfo);
if (exceptInfo.reason != -1)
{
if (exceptInfo.cppException)
std::rethrow_exception(exceptInfo.cppException);
else
ThrowAbortException(func, exceptInfo.pcOnJitAbort, (EVMAbortException)exceptInfo.reason, nullptr);
}
return result;
}

numret = ExecScriptFunc(stack, ret, numret);
}
catch (...)
Expand Down
42 changes: 41 additions & 1 deletion src/scripting/vm/vmframe.cpp
Expand Up @@ -213,6 +213,45 @@ int VMScriptFunction::PCToLine(const VMOP *pc)
return -1;
}

int VMScriptFunction::FirstScriptCall(VMScriptFunction *func, VMValue *params, int numparams, VMReturn *ret, int numret)
{
func->JitFunc = JitCompile(func);
if (func->JitFunc)
func->ScriptCall = &VMScriptFunction::JitCall;
else
func->ScriptCall = VMExec;

return func->ScriptCall(func, params, numparams, ret, numret);
}

int VMScriptFunction::JitCall(VMScriptFunction *func, VMValue *params, int numparams, VMReturn *ret, int numret)
{
VMFrameStack *stack = &GlobalVMStack;
VMFrame *newf = stack->AllocFrame(func);
VMFillParams(params, newf, numparams);
try
{
JitExceptionInfo exceptInfo;
exceptInfo.reason = -1;
int result = func->JitFunc(stack, ret, numret, &exceptInfo);
if (exceptInfo.reason != -1)
{
if (exceptInfo.cppException)
std::rethrow_exception(exceptInfo.cppException);
else
ThrowAbortException(func, exceptInfo.pcOnJitAbort, (EVMAbortException)exceptInfo.reason, nullptr);
}
return result;
}
catch (...)
{
stack->PopFrame();
throw;
}
stack->PopFrame();
return numret;
}

//===========================================================================
//
// VMFrame :: InitRegS
Expand Down Expand Up @@ -464,7 +503,8 @@ int VMCall(VMFunction *func, VMValue *params, int numparams, VMReturn *results,
{
VMCycles[0].Clock();
VMCalls[0]++;
int numret = VMExec(static_cast<VMScriptFunction *>(func), params, numparams, results, numresults);
auto sfunc = static_cast<VMScriptFunction *>(func);
int numret = sfunc->ScriptCall(sfunc, params, numparams, results, numresults);
VMCycles[0].Unclock();
return numret;
}
Expand Down
8 changes: 6 additions & 2 deletions src/scripting/vm/vmintern.h
Expand Up @@ -478,11 +478,15 @@ class VMScriptFunction : public VMFunction
VM_UBYTE NumArgs; // Number of arguments this function takes
TArray<FTypeAndOffset> SpecialInits; // list of all contents on the extra stack which require construction and destruction

bool JitCompiled = false;
JitFuncPtr JitFunc = nullptr;
int(*ScriptCall)(VMScriptFunction *func, VMValue *params, int numparams, VMReturn *ret, int numret) = &VMScriptFunction::FirstScriptCall;

void InitExtra(void *addr);
void DestroyExtra(void *addr);
int AllocExtraStack(PType *type);
int PCToLine(const VMOP *pc);

private:
static int FirstScriptCall(VMScriptFunction *func, VMValue *params, int numparams, VMReturn *ret, int numret);
static int JitCall(VMScriptFunction *func, VMValue *params, int numparams, VMReturn *ret, int numret);
JitFuncPtr JitFunc = nullptr;
};

0 comments on commit e930dfa

Please sign in to comment.