mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-15 17:02:05 +00:00
- Add a name to VMFunction so that the disassembly can be more informative.
SVN r3768 (scripting)
This commit is contained in:
parent
d85604da19
commit
644f0c0e05
7 changed files with 53 additions and 23 deletions
|
@ -550,3 +550,10 @@ xx(Inter_Strife_Lose)
|
||||||
xx(Inter_Strife_MAP03)
|
xx(Inter_Strife_MAP03)
|
||||||
xx(Inter_Strife_MAP10)
|
xx(Inter_Strife_MAP10)
|
||||||
xx(Multiplayer)
|
xx(Multiplayer)
|
||||||
|
|
||||||
|
// Decorate compatibility functions
|
||||||
|
xx(DecoRandom)
|
||||||
|
xx(DecoFRandom)
|
||||||
|
xx(DecoCallLineSpecial)
|
||||||
|
xx(DecoNameToClass)
|
||||||
|
xx(DecoFindMultiNameState)
|
||||||
|
|
|
@ -264,6 +264,7 @@ static void FinishThingdef()
|
||||||
{
|
{
|
||||||
int errorcount = StateParams.ResolveAll();
|
int errorcount = StateParams.ResolveAll();
|
||||||
unsigned i, j;
|
unsigned i, j;
|
||||||
|
int codesize = 0;
|
||||||
|
|
||||||
FILE *dump = fopen("disasm.txt", "w");
|
FILE *dump = fopen("disasm.txt", "w");
|
||||||
for (i = 0; i < StateTempCalls.Size(); ++i)
|
for (i = 0; i < StateTempCalls.Size(); ++i)
|
||||||
|
@ -316,6 +317,7 @@ static void FinishThingdef()
|
||||||
VMDumpConstants(dump, sfunc);
|
VMDumpConstants(dump, sfunc);
|
||||||
fprintf(dump, "\nDisassembly @ %p:\n", sfunc->Code);
|
fprintf(dump, "\nDisassembly @ %p:\n", sfunc->Code);
|
||||||
VMDisasm(dump, sfunc->Code, sfunc->CodeSize, sfunc);
|
VMDisasm(dump, sfunc->Code, sfunc->CodeSize, sfunc);
|
||||||
|
codesize += sfunc->CodeSize;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
for (int k = 0; k < tcall->NumStates; ++k)
|
for (int k = 0; k < tcall->NumStates; ++k)
|
||||||
|
@ -323,6 +325,9 @@ static void FinishThingdef()
|
||||||
tcall->ActorClass->OwnedStates[tcall->FirstState + k].SetAction(func);
|
tcall->ActorClass->OwnedStates[tcall->FirstState + k].SetAction(func);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if 1
|
||||||
|
fprintf(dump, "\n*************************************************************************\n%i code bytes\n", codesize * 4);
|
||||||
|
#endif
|
||||||
fclose(dump);
|
fclose(dump);
|
||||||
|
|
||||||
for (i = 0; i < PClassActor::AllActorClasses.Size(); i++)
|
for (i = 0; i < PClassActor::AllActorClasses.Size(); i++)
|
||||||
|
|
|
@ -613,7 +613,7 @@ void InitThingdef()
|
||||||
{
|
{
|
||||||
AFuncDesc *afunc = (AFuncDesc *)*probe;
|
AFuncDesc *afunc = (AFuncDesc *)*probe;
|
||||||
assert(afunc->VMPointer != NULL);
|
assert(afunc->VMPointer != NULL);
|
||||||
*(afunc->VMPointer) = new VMNativeFunction(afunc->Function);
|
*(afunc->VMPointer) = new VMNativeFunction(afunc->Function, afunc->Name);
|
||||||
AFTable.Push(*afunc);
|
AFTable.Push(*afunc);
|
||||||
}
|
}
|
||||||
AFTable.ShrinkToFit();
|
AFTable.ShrinkToFit();
|
||||||
|
|
|
@ -2487,11 +2487,11 @@ ExpEmit FxRandom::Emit(VMFunctionBuilder *build)
|
||||||
// Find the DecoRandom function. If not found, create it and install it
|
// Find the DecoRandom function. If not found, create it and install it
|
||||||
// in Actor.
|
// in Actor.
|
||||||
VMFunction *callfunc;
|
VMFunction *callfunc;
|
||||||
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol("DecoRandom", false);
|
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol(NAME_DecoRandom, false);
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
{
|
{
|
||||||
PSymbolVMFunction *symfunc = new PSymbolVMFunction("DecoRandom");
|
PSymbolVMFunction *symfunc = new PSymbolVMFunction(NAME_DecoRandom);
|
||||||
VMNativeFunction *calldec = new VMNativeFunction(DecoRandom);
|
VMNativeFunction *calldec = new VMNativeFunction(DecoRandom, NAME_DecoRandom);
|
||||||
symfunc->Function = calldec;
|
symfunc->Function = calldec;
|
||||||
sym = symfunc;
|
sym = symfunc;
|
||||||
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
||||||
|
@ -2593,11 +2593,11 @@ ExpEmit FxFRandom::Emit(VMFunctionBuilder *build)
|
||||||
// Find the DecoFRandom function. If not found, create it and install it
|
// Find the DecoFRandom function. If not found, create it and install it
|
||||||
// in Actor.
|
// in Actor.
|
||||||
VMFunction *callfunc;
|
VMFunction *callfunc;
|
||||||
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol("DecoFRandom", false);
|
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol(NAME_DecoFRandom, false);
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
{
|
{
|
||||||
PSymbolVMFunction *symfunc = new PSymbolVMFunction("DecoFRandom");
|
PSymbolVMFunction *symfunc = new PSymbolVMFunction(NAME_DecoFRandom);
|
||||||
VMNativeFunction *calldec = new VMNativeFunction(DecoFRandom);
|
VMNativeFunction *calldec = new VMNativeFunction(DecoFRandom, NAME_DecoFRandom);
|
||||||
symfunc->Function = calldec;
|
symfunc->Function = calldec;
|
||||||
sym = symfunc;
|
sym = symfunc;
|
||||||
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
||||||
|
@ -2683,11 +2683,11 @@ ExpEmit FxRandom2::Emit(VMFunctionBuilder *build)
|
||||||
// Find the DecoRandom function. If not found, create it and install it
|
// Find the DecoRandom function. If not found, create it and install it
|
||||||
// in Actor.
|
// in Actor.
|
||||||
VMFunction *callfunc;
|
VMFunction *callfunc;
|
||||||
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol("DecoRandom", false);
|
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol(NAME_DecoRandom, false);
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
{
|
{
|
||||||
PSymbolVMFunction *symfunc = new PSymbolVMFunction("DecoRandom");
|
PSymbolVMFunction *symfunc = new PSymbolVMFunction(NAME_DecoRandom);
|
||||||
VMNativeFunction *calldec = new VMNativeFunction(DecoRandom);
|
VMNativeFunction *calldec = new VMNativeFunction(DecoRandom, NAME_DecoRandom);
|
||||||
symfunc->Function = calldec;
|
symfunc->Function = calldec;
|
||||||
sym = symfunc;
|
sym = symfunc;
|
||||||
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
||||||
|
@ -3530,11 +3530,11 @@ ExpEmit FxActionSpecialCall::Emit(VMFunctionBuilder *build)
|
||||||
// Find the DecoCallLineSpecial function. If not found, create it and install it
|
// Find the DecoCallLineSpecial function. If not found, create it and install it
|
||||||
// in Actor.
|
// in Actor.
|
||||||
VMFunction *callfunc;
|
VMFunction *callfunc;
|
||||||
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol("DecoCallLineSpecial", false);
|
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol(NAME_DecoCallLineSpecial, false);
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
{
|
{
|
||||||
PSymbolVMFunction *symfunc = new PSymbolVMFunction("DecoCallLineSpecial");
|
PSymbolVMFunction *symfunc = new PSymbolVMFunction(NAME_DecoCallLineSpecial);
|
||||||
VMNativeFunction *calldec = new VMNativeFunction(DecoCallLineSpecial);
|
VMNativeFunction *calldec = new VMNativeFunction(DecoCallLineSpecial, NAME_DecoCallLineSpecial);
|
||||||
symfunc->Function = calldec;
|
symfunc->Function = calldec;
|
||||||
sym = symfunc;
|
sym = symfunc;
|
||||||
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
||||||
|
@ -3795,11 +3795,11 @@ ExpEmit FxClassTypeCast::Emit(VMFunctionBuilder *build)
|
||||||
// Find the DecoNameToClass function. If not found, create it and install it
|
// Find the DecoNameToClass function. If not found, create it and install it
|
||||||
// in Actor.
|
// in Actor.
|
||||||
VMFunction *callfunc;
|
VMFunction *callfunc;
|
||||||
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol("DecoNameToClass", false);
|
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol(NAME_DecoNameToClass, false);
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
{
|
{
|
||||||
PSymbolVMFunction *symfunc = new PSymbolVMFunction("DecoNameToClass");
|
PSymbolVMFunction *symfunc = new PSymbolVMFunction(NAME_DecoNameToClass);
|
||||||
VMNativeFunction *calldec = new VMNativeFunction(DecoNameToClass);
|
VMNativeFunction *calldec = new VMNativeFunction(DecoNameToClass, NAME_DecoNameToClass);
|
||||||
symfunc->Function = calldec;
|
symfunc->Function = calldec;
|
||||||
sym = symfunc;
|
sym = symfunc;
|
||||||
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
||||||
|
@ -3995,11 +3995,11 @@ ExpEmit FxMultiNameState::Emit(VMFunctionBuilder *build)
|
||||||
// Find the DecoFindMultiNameState function. If not found, create it and install it
|
// Find the DecoFindMultiNameState function. If not found, create it and install it
|
||||||
// in Actor.
|
// in Actor.
|
||||||
VMFunction *callfunc;
|
VMFunction *callfunc;
|
||||||
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol("DecoFindMultiNameState", false);
|
PSymbol *sym = RUNTIME_CLASS(AActor)->Symbols.FindSymbol(NAME_DecoNameToClass, false);
|
||||||
if (sym == NULL)
|
if (sym == NULL)
|
||||||
{
|
{
|
||||||
PSymbolVMFunction *symfunc = new PSymbolVMFunction("DecoFindMultiNameState");
|
PSymbolVMFunction *symfunc = new PSymbolVMFunction(NAME_DecoNameToClass);
|
||||||
VMNativeFunction *calldec = new VMNativeFunction(DecoFindMultiNameState);
|
VMNativeFunction *calldec = new VMNativeFunction(DecoFindMultiNameState, NAME_DecoNameToClass);
|
||||||
symfunc->Function = calldec;
|
symfunc->Function = calldec;
|
||||||
sym = symfunc;
|
sym = symfunc;
|
||||||
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
RUNTIME_CLASS(AActor)->Symbols.AddSymbol(sym);
|
||||||
|
|
|
@ -149,6 +149,10 @@ class VMFunction : public DObject
|
||||||
DECLARE_ABSTRACT_CLASS(VMFunction, DObject);
|
DECLARE_ABSTRACT_CLASS(VMFunction, DObject);
|
||||||
public:
|
public:
|
||||||
bool Native;
|
bool Native;
|
||||||
|
FName Name;
|
||||||
|
|
||||||
|
VMFunction() : Native(false), Name(NAME_None) {}
|
||||||
|
VMFunction(FName name) : Native(false), Name(name) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
enum EVMOpMode
|
enum EVMOpMode
|
||||||
|
@ -712,7 +716,7 @@ struct VMRegisters
|
||||||
|
|
||||||
struct VMException : public DObject
|
struct VMException : public DObject
|
||||||
{
|
{
|
||||||
DECLARE_CLASS(VMFunction, DObject);
|
DECLARE_CLASS(VMException, DObject);
|
||||||
};
|
};
|
||||||
|
|
||||||
union FVoidObj
|
union FVoidObj
|
||||||
|
@ -725,7 +729,7 @@ class VMScriptFunction : public VMFunction
|
||||||
{
|
{
|
||||||
DECLARE_CLASS(VMScriptFunction, VMFunction);
|
DECLARE_CLASS(VMScriptFunction, VMFunction);
|
||||||
public:
|
public:
|
||||||
VMScriptFunction();
|
VMScriptFunction(FName name=NAME_None);
|
||||||
~VMScriptFunction();
|
~VMScriptFunction();
|
||||||
size_t PropagateMark();
|
size_t PropagateMark();
|
||||||
void Alloc(int numops, int numkonstd, int numkonstf, int numkonsts, int numkonsta);
|
void Alloc(int numops, int numkonstd, int numkonstf, int numkonsts, int numkonsta);
|
||||||
|
@ -788,6 +792,7 @@ public:
|
||||||
|
|
||||||
VMNativeFunction() : NativeCall(NULL) { Native = true; }
|
VMNativeFunction() : NativeCall(NULL) { Native = true; }
|
||||||
VMNativeFunction(NativeCallType call) : NativeCall(call) { Native = true; }
|
VMNativeFunction(NativeCallType call) : NativeCall(call) { Native = true; }
|
||||||
|
VMNativeFunction(NativeCallType call, FName name) : VMFunction(name), NativeCall(call) { Native = true; }
|
||||||
|
|
||||||
// Return value is the number of results.
|
// Return value is the number of results.
|
||||||
NativeCallType NativeCall;
|
NativeCallType NativeCall;
|
||||||
|
|
|
@ -173,6 +173,8 @@ void VMDumpConstants(FILE *out, const VMScriptFunction *func)
|
||||||
|
|
||||||
void VMDisasm(FILE *out, const VMOP *code, int codesize, const VMScriptFunction *func)
|
void VMDisasm(FILE *out, const VMOP *code, int codesize, const VMScriptFunction *func)
|
||||||
{
|
{
|
||||||
|
VMFunction *callfunc;
|
||||||
|
const char *callname;
|
||||||
const char *name;
|
const char *name;
|
||||||
int col;
|
int col;
|
||||||
int mode;
|
int mode;
|
||||||
|
@ -212,6 +214,12 @@ void VMDisasm(FILE *out, const VMOP *code, int codesize, const VMScriptFunction
|
||||||
col = printf_wrapper(out, "%d", code[i].i24);
|
col = printf_wrapper(out, "%d", code[i].i24);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OP_CALL_K:
|
||||||
|
callfunc = (VMFunction *)func->KonstA[code[i].a].o;
|
||||||
|
callname = callfunc->Name != NAME_None ? callfunc->Name : "[anonfunc]";
|
||||||
|
col = printf_wrapper(out, "%.23s,%d,%d", callname, code[i].b, code[i].c);
|
||||||
|
break;
|
||||||
|
|
||||||
case OP_RET:
|
case OP_RET:
|
||||||
if (code[i].b != REGT_NIL)
|
if (code[i].b != REGT_NIL)
|
||||||
{
|
{
|
||||||
|
@ -308,6 +316,10 @@ void VMDisasm(FILE *out, const VMOP *code, int codesize, const VMScriptFunction
|
||||||
{
|
{
|
||||||
printf_wrapper(out, "%d\n", code[i].i24);
|
printf_wrapper(out, "%d\n", code[i].i24);
|
||||||
}
|
}
|
||||||
|
else if (code[i].op == OP_CALL_K)
|
||||||
|
{
|
||||||
|
printf_wrapper(out, "%d,%d,%d [%p]\n", code[i].a, code[i].b, code[i].c, callfunc);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf_wrapper(out, "%d,%d,%d\n", code[i].a, code[i].b, code[i].c);
|
printf_wrapper(out, "%d,%d,%d\n", code[i].a, code[i].b, code[i].c);
|
||||||
|
|
|
@ -6,9 +6,10 @@ IMPLEMENT_ABSTRACT_CLASS(VMFunction)
|
||||||
IMPLEMENT_CLASS(VMScriptFunction)
|
IMPLEMENT_CLASS(VMScriptFunction)
|
||||||
IMPLEMENT_CLASS(VMNativeFunction)
|
IMPLEMENT_CLASS(VMNativeFunction)
|
||||||
|
|
||||||
VMScriptFunction::VMScriptFunction()
|
VMScriptFunction::VMScriptFunction(FName name)
|
||||||
{
|
{
|
||||||
Native = false;
|
Native = false;
|
||||||
|
Name = name;
|
||||||
Code = NULL;
|
Code = NULL;
|
||||||
KonstD = NULL;
|
KonstD = NULL;
|
||||||
KonstF = NULL;
|
KonstF = NULL;
|
||||||
|
|
Loading…
Reference in a new issue