mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-12-04 09:51:43 +00:00
- Allocate VM script code and constants in a single block for better locality of
reference. SVN r1924 (scripting)
This commit is contained in:
parent
e209a2f208
commit
7ea11cd169
5 changed files with 81 additions and 51 deletions
|
@ -94,9 +94,9 @@ void FState::SetAction(PSymbolActionFunction *func, bool setdefaultparams)
|
||||||
|
|
||||||
// Create a function for this state.
|
// Create a function for this state.
|
||||||
VMScriptFunction *vmfunc = new VMScriptFunction;
|
VMScriptFunction *vmfunc = new VMScriptFunction;
|
||||||
VMOP *code = vmfunc->AllocCode(sizeof(codetemplate)/sizeof(VMOP));
|
vmfunc->Alloc(sizeof(codetemplate)/sizeof(VMOP), 0, 0, 0, 2);
|
||||||
memcpy(code, codetemplate, sizeof(codetemplate));
|
memcpy(vmfunc->Code, codetemplate, sizeof(codetemplate));
|
||||||
FVoidObj *konsta = vmfunc->AllocKonstA(2);
|
FVoidObj *konsta = vmfunc->KonstA;
|
||||||
VM_ATAG *atag = vmfunc->KonstATags();
|
VM_ATAG *atag = vmfunc->KonstATags();
|
||||||
konsta[0].v = (void *)func->Function;
|
konsta[0].v = (void *)func->Function;
|
||||||
konsta[1].o = callfunc;
|
konsta[1].o = callfunc;
|
||||||
|
|
|
@ -342,10 +342,10 @@ public:
|
||||||
isresolved = true;
|
isresolved = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
FxConstant(const char *str, const FScriptPosition &pos) : FxExpression(pos)
|
FxConstant(const FString &str, const FScriptPosition &pos) : FxExpression(pos)
|
||||||
{
|
{
|
||||||
ValueType = VAL_String;
|
ValueType = VAL_String;
|
||||||
value = ExpVal(FString(str));
|
value = ExpVal(str);
|
||||||
isresolved = true;
|
isresolved = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -719,11 +719,7 @@ public:
|
||||||
VMScriptFunction();
|
VMScriptFunction();
|
||||||
~VMScriptFunction();
|
~VMScriptFunction();
|
||||||
size_t PropagateMark();
|
size_t PropagateMark();
|
||||||
VMOP *AllocCode(int numops);
|
void Alloc(int numops, int numkonstd, int numkonstf, int numkonsts, int numkonsta);
|
||||||
int *AllocKonstD(int numkonst);
|
|
||||||
double *AllocKonstF(int numkonst);
|
|
||||||
FString *AllocKonstS(int numkonst);
|
|
||||||
FVoidObj *AllocKonstA(int numkonst);
|
|
||||||
|
|
||||||
VM_ATAG *KonstATags() { return (VM_UBYTE *)(KonstA + NumKonstA); }
|
VM_ATAG *KonstATags() { return (VM_UBYTE *)(KonstA + NumKonstA); }
|
||||||
const VM_ATAG *KonstATags() const { return (VM_UBYTE *)(KonstA + NumKonstA); }
|
const VM_ATAG *KonstATags() const { return (VM_UBYTE *)(KonstA + NumKonstA); }
|
||||||
|
|
|
@ -38,26 +38,27 @@ VMScriptFunction *VMFunctionBuilder::MakeFunction()
|
||||||
{
|
{
|
||||||
VMScriptFunction *func = new VMScriptFunction;
|
VMScriptFunction *func = new VMScriptFunction;
|
||||||
|
|
||||||
|
func->Alloc(Code.Size(), NumIntConstants, NumFloatConstants, NumStringConstants, NumAddressConstants);
|
||||||
|
|
||||||
// Copy code block.
|
// Copy code block.
|
||||||
memcpy(func->AllocCode(Code.Size()), &Code[0], Code.Size() * sizeof(VMOP));
|
memcpy(func->Code, &Code[0], Code.Size() * sizeof(VMOP));
|
||||||
|
|
||||||
// Create constant tables.
|
// Create constant tables.
|
||||||
if (NumIntConstants > 0)
|
if (NumIntConstants > 0)
|
||||||
{
|
{
|
||||||
FillIntConstants(func->AllocKonstD(NumIntConstants));
|
FillIntConstants(func->KonstD);
|
||||||
}
|
}
|
||||||
if (NumFloatConstants > 0)
|
if (NumFloatConstants > 0)
|
||||||
{
|
{
|
||||||
FillFloatConstants(func->AllocKonstF(NumFloatConstants));
|
FillFloatConstants(func->KonstF);
|
||||||
}
|
}
|
||||||
if (NumAddressConstants > 0)
|
if (NumAddressConstants > 0)
|
||||||
{
|
{
|
||||||
func->AllocKonstA(NumAddressConstants);
|
|
||||||
FillAddressConstants(func->KonstA, func->KonstATags());
|
FillAddressConstants(func->KonstA, func->KonstATags());
|
||||||
}
|
}
|
||||||
if (NumStringConstants > 0)
|
if (NumStringConstants > 0)
|
||||||
{
|
{
|
||||||
FillStringConstants(func->AllocKonstS(NumStringConstants));
|
FillStringConstants(func->KonstS);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assign required register space.
|
// Assign required register space.
|
||||||
|
|
|
@ -30,46 +30,79 @@ VMScriptFunction::VMScriptFunction()
|
||||||
|
|
||||||
VMScriptFunction::~VMScriptFunction()
|
VMScriptFunction::~VMScriptFunction()
|
||||||
{
|
{
|
||||||
if (Code != NULL) M_Free(Code);
|
if (Code != NULL)
|
||||||
if (KonstD != NULL) M_Free(KonstD);
|
{
|
||||||
if (KonstF != NULL) M_Free(KonstF);
|
if (KonstS != NULL)
|
||||||
if (KonstS != NULL) delete[] KonstS;
|
{
|
||||||
if (KonstA != NULL) M_Free(KonstA);
|
for (int i = 0; i < NumKonstS; ++i)
|
||||||
|
{
|
||||||
|
KonstS[i].~FString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
M_Free(Code);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VMOP *VMScriptFunction::AllocCode(int numops)
|
void VMScriptFunction::Alloc(int numops, int numkonstd, int numkonstf, int numkonsts, int numkonsta)
|
||||||
{
|
{
|
||||||
assert(Code == NULL && numops > 0);
|
assert(Code == NULL);
|
||||||
|
assert(numops > 0);
|
||||||
|
assert(numkonstd >= 0 && numkonstd <= 255);
|
||||||
|
assert(numkonstf >= 0 && numkonstf <= 255);
|
||||||
|
assert(numkonsts >= 0 && numkonsts <= 255);
|
||||||
|
assert(numkonsta >= 0 && numkonsta <= 255);
|
||||||
|
void *mem = M_Malloc(numops * sizeof(VMOP) +
|
||||||
|
numkonstd * sizeof(int) +
|
||||||
|
numkonstf * sizeof(double) +
|
||||||
|
numkonsts * sizeof(FString) +
|
||||||
|
numkonsta * (sizeof(FVoidObj) + 1));
|
||||||
|
Code = (VMOP *)mem;
|
||||||
|
mem = (void *)((VMOP *)mem + numops);
|
||||||
|
|
||||||
|
if (numkonstd > 0)
|
||||||
|
{
|
||||||
|
KonstD = (int *)mem;
|
||||||
|
mem = (void *)((int *)mem + numkonstd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
KonstD = NULL;
|
||||||
|
}
|
||||||
|
if (numkonstf > 0)
|
||||||
|
{
|
||||||
|
KonstF = (double *)mem;
|
||||||
|
mem = (void *)((double *)mem + numkonstf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
KonstF = NULL;
|
||||||
|
}
|
||||||
|
if (numkonsts > 0)
|
||||||
|
{
|
||||||
|
KonstS = (FString *)mem;
|
||||||
|
for (int i = 0; i < numkonsts; ++i)
|
||||||
|
{
|
||||||
|
::new(&KonstS[i]) FString;
|
||||||
|
}
|
||||||
|
mem = (void *)((FString *)mem + numkonsts);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
KonstS = NULL;
|
||||||
|
}
|
||||||
|
if (numkonsta > 0)
|
||||||
|
{
|
||||||
|
KonstA = (FVoidObj *)mem;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
KonstA = NULL;
|
||||||
|
}
|
||||||
CodeSize = numops;
|
CodeSize = numops;
|
||||||
return Code = (VMOP *)M_Malloc(numops * sizeof(VMOP));
|
NumKonstD = numkonstd;
|
||||||
}
|
NumKonstF = numkonstf;
|
||||||
|
NumKonstS = numkonsts;
|
||||||
int *VMScriptFunction::AllocKonstD(int numkonst)
|
NumKonstA = numkonsta;
|
||||||
{
|
|
||||||
assert(KonstD == NULL && numkonst > 0);
|
|
||||||
NumKonstD = numkonst;
|
|
||||||
return KonstD = (int *)M_Malloc(numkonst * sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
double *VMScriptFunction::AllocKonstF(int numkonst)
|
|
||||||
{
|
|
||||||
assert(KonstF == NULL && numkonst > 0);
|
|
||||||
NumKonstF = numkonst;
|
|
||||||
return KonstF = (double *)M_Malloc(numkonst * sizeof(double));
|
|
||||||
}
|
|
||||||
|
|
||||||
FString *VMScriptFunction::AllocKonstS(int numkonst)
|
|
||||||
{
|
|
||||||
assert(KonstS == NULL && numkonst > 0);
|
|
||||||
NumKonstS = numkonst;
|
|
||||||
return KonstS = new FString[numkonst];
|
|
||||||
}
|
|
||||||
|
|
||||||
FVoidObj *VMScriptFunction::AllocKonstA(int numkonst)
|
|
||||||
{
|
|
||||||
assert(KonstA == NULL && numkonst > 0);
|
|
||||||
NumKonstA = numkonst;
|
|
||||||
return KonstA = (FVoidObj *)M_Malloc(numkonst * sizeof(FVoidObj) + numkonst);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t VMScriptFunction::PropagateMark()
|
size_t VMScriptFunction::PropagateMark()
|
||||||
|
|
Loading…
Reference in a new issue