- Added some fudging so that A_PlayerSkinCheck creates proper code until I can rewrite the FunctionCall expression to match what the script compiler needs. The current version of this class is too much geared toward DECORATE.

This commit is contained in:
Christoph Oelckers 2016-10-14 21:15:46 +02:00
parent 784f7ed671
commit 52005214c1
2 changed files with 27 additions and 10 deletions

View file

@ -672,8 +672,8 @@ xx(DecoRandom)
xx(DecoFRandom) xx(DecoFRandom)
xx(DecoCallLineSpecial) xx(DecoCallLineSpecial)
xx(DecoNameToClass) xx(DecoNameToClass)
xx(DecoFindMultiNameState) xx(BuiltinFindMultiNameState)
xx(DecoFindSingleNameState) xx(BuiltinFindSingleNameState)
xx(DecoHandleRuntimeState) xx(DecoHandleRuntimeState)
xx(Damage) xx(Damage)

View file

@ -3632,7 +3632,10 @@ FxExpression *FxFunctionCall::Resolve(FCompileContext& ctx)
PFunction *afd = dyn_cast<PFunction>(ctx.Class->Symbols.FindSymbol(MethodName, true)); PFunction *afd = dyn_cast<PFunction>(ctx.Class->Symbols.FindSymbol(MethodName, true));
if (afd != nullptr) if (afd != nullptr)
{ {
return new FxVMFunctionCall(afd, ArgList, ScriptPosition, false); auto x = new FxVMFunctionCall(afd, ArgList, ScriptPosition, false);
ArgList = nullptr;
delete this;
return x->Resolve(ctx);
} }
for (size_t i = 0; i < countof(FxFlops); ++i) for (size_t i = 0; i < countof(FxFlops); ++i)
@ -3927,11 +3930,25 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx)
{ {
CHECKRESOLVED(); CHECKRESOLVED();
bool failed = false; bool failed = false;
auto proto = Function->Variants[0].Implementation->Proto;
auto argtypes = proto->ArgumentTypes;
int implicit;
if (Function->Flags & VARF_Action) implicit = 3;
else if (Function->Flags & VARF_Method) implicit = 1;
else implicit = 0;
if (ArgList != NULL) if (ArgList != NULL)
{ {
for (unsigned i = 0; i < ArgList->Size(); i++) for (unsigned i = 0; i < ArgList->Size(); i++)
{ {
// temporary hack to let strings get compiled as state. This will have to be done more intelligently.
if (i+implicit < argtypes.Size() && argtypes[i+implicit] == TypeState && (*ArgList)[i]->isConstant() && static_cast<FxConstant*>((*ArgList)[i])->ValueType == TypeString)
{
auto statenode = new FxMultiNameState(static_cast<FxConstant*>((*ArgList)[i])->GetValue().GetString(), ScriptPosition);
delete (*ArgList)[i];
(*ArgList)[i] = statenode;
}
(*ArgList)[i] = (*ArgList)[i]->Resolve(ctx); (*ArgList)[i] = (*ArgList)[i]->Resolve(ctx);
if ((*ArgList)[i] == NULL) failed = true; if ((*ArgList)[i] == NULL) failed = true;
} }
@ -3941,7 +3958,7 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx)
delete this; delete this;
return NULL; return NULL;
} }
TArray<PType *> &rets = Function->Variants[0].Implementation->Proto->ReturnTypes; TArray<PType *> &rets = proto->ReturnTypes;
if (rets.Size() > 0) if (rets.Size() > 0)
{ {
ValueType = rets[0]; ValueType = rets[0];
@ -5175,7 +5192,7 @@ static int DoFindState(VMFrameStack *stack, VMValue *param, int numparam, VMRetu
} }
// Find a state with any number of dots in its name. // Find a state with any number of dots in its name.
int DecoFindMultiNameState(VMFrameStack *stack, VMValue *param, int numparam, VMReturn *ret, int numret) int BuiltinFindMultiNameState(VMFrameStack *stack, VMValue *param, int numparam, VMReturn *ret, int numret)
{ {
assert(numparam > 1); assert(numparam > 1);
assert(numret == 1); assert(numret == 1);
@ -5191,7 +5208,7 @@ int DecoFindMultiNameState(VMFrameStack *stack, VMValue *param, int numparam, VM
} }
// Find a state without any dots in its name. // Find a state without any dots in its name.
int DecoFindSingleNameState(VMFrameStack *stack, VMValue *param, int numparam, VMReturn *ret, int numret) int BuiltinFindSingleNameState(VMFrameStack *stack, VMValue *param, int numparam, VMReturn *ret, int numret)
{ {
assert(numparam == 2); assert(numparam == 2);
assert(numret == 1); assert(numret == 1);
@ -5217,18 +5234,18 @@ ExpEmit FxMultiNameState::Emit(VMFunctionBuilder *build)
build->EmitParamInt(names[i]); build->EmitParamInt(names[i]);
} }
// For one name, use the DecoFindSingleNameState function. For more than // For one name, use the BuiltinFindSingleNameState function. For more than
// one name, use the DecoFindMultiNameState function. // one name, use the BuiltinFindMultiNameState function.
VMFunction *callfunc; VMFunction *callfunc;
PSymbol *sym; PSymbol *sym;
if (names.Size() == 1) if (names.Size() == 1)
{ {
sym = FindDecorateBuiltinFunction(NAME_DecoFindSingleNameState, DecoFindSingleNameState); sym = FindDecorateBuiltinFunction(NAME_BuiltinFindSingleNameState, BuiltinFindSingleNameState);
} }
else else
{ {
sym = FindDecorateBuiltinFunction(NAME_DecoFindMultiNameState, DecoFindMultiNameState); sym = FindDecorateBuiltinFunction(NAME_BuiltinFindMultiNameState, BuiltinFindMultiNameState);
} }
assert(sym->IsKindOf(RUNTIME_CLASS(PSymbolVMFunction))); assert(sym->IsKindOf(RUNTIME_CLASS(PSymbolVMFunction)));