mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-25 05:21:02 +00:00
- Gave FxExpression a type identifier field so that certain combinations that are easy to optimize can be detected.
This commit is contained in:
parent
32d33618ea
commit
ccabb6f9bd
2 changed files with 129 additions and 81 deletions
|
@ -435,7 +435,7 @@ ExpEmit FxConstant::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxBoolCast::FxBoolCast(FxExpression *x)
|
||||
: FxExpression(x->ScriptPosition)
|
||||
: FxExpression(EFX_BoolCast, x->ScriptPosition)
|
||||
{
|
||||
basex = x;
|
||||
ValueType = TypeBool;
|
||||
|
@ -533,7 +533,7 @@ ExpEmit FxBoolCast::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxIntCast::FxIntCast(FxExpression *x, bool nowarn)
|
||||
: FxExpression(x->ScriptPosition)
|
||||
: FxExpression(EFX_IntCast, x->ScriptPosition)
|
||||
{
|
||||
basex=x;
|
||||
ValueType = TypeSInt32;
|
||||
|
@ -632,7 +632,7 @@ ExpEmit FxIntCast::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxFloatCast::FxFloatCast(FxExpression *x)
|
||||
: FxExpression(x->ScriptPosition)
|
||||
: FxExpression(EFX_FloatCast, x->ScriptPosition)
|
||||
{
|
||||
basex = x;
|
||||
ValueType = TypeFloat64;
|
||||
|
@ -723,7 +723,7 @@ ExpEmit FxFloatCast::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxNameCast::FxNameCast(FxExpression *x)
|
||||
: FxExpression(x->ScriptPosition)
|
||||
: FxExpression(EFX_NameCast, x->ScriptPosition)
|
||||
{
|
||||
basex = x;
|
||||
ValueType = TypeName;
|
||||
|
@ -801,7 +801,7 @@ ExpEmit FxNameCast::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxStringCast::FxStringCast(FxExpression *x)
|
||||
: FxExpression(x->ScriptPosition)
|
||||
: FxExpression(EFX_StringCast, x->ScriptPosition)
|
||||
{
|
||||
basex = x;
|
||||
ValueType = TypeString;
|
||||
|
@ -898,7 +898,7 @@ ExpEmit FxStringCast::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxColorCast::FxColorCast(FxExpression *x)
|
||||
: FxExpression(x->ScriptPosition)
|
||||
: FxExpression(EFX_ColorCast, x->ScriptPosition)
|
||||
{
|
||||
basex = x;
|
||||
ValueType = TypeColor;
|
||||
|
@ -977,7 +977,7 @@ ExpEmit FxColorCast::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxSoundCast::FxSoundCast(FxExpression *x)
|
||||
: FxExpression(x->ScriptPosition)
|
||||
: FxExpression(EFX_SoundCast, x->ScriptPosition)
|
||||
{
|
||||
basex = x;
|
||||
ValueType = TypeSound;
|
||||
|
@ -1056,7 +1056,7 @@ ExpEmit FxSoundCast::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxTypeCast::FxTypeCast(FxExpression *x, PType *type, bool nowarn)
|
||||
: FxExpression(x->ScriptPosition)
|
||||
: FxExpression(EFX_TypeCast, x->ScriptPosition)
|
||||
{
|
||||
basex = x;
|
||||
ValueType = type;
|
||||
|
@ -1241,7 +1241,7 @@ ExpEmit FxTypeCast::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxPlusSign::FxPlusSign(FxExpression *operand)
|
||||
: FxExpression(operand->ScriptPosition)
|
||||
: FxExpression(EFX_PlusSign, operand->ScriptPosition)
|
||||
{
|
||||
Operand=operand;
|
||||
}
|
||||
|
@ -1295,7 +1295,7 @@ ExpEmit FxPlusSign::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxMinusSign::FxMinusSign(FxExpression *operand)
|
||||
: FxExpression(operand->ScriptPosition)
|
||||
: FxExpression(EFX_MinusSign, operand->ScriptPosition)
|
||||
{
|
||||
Operand=operand;
|
||||
}
|
||||
|
@ -1375,7 +1375,7 @@ ExpEmit FxMinusSign::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxUnaryNotBitwise::FxUnaryNotBitwise(FxExpression *operand)
|
||||
: FxExpression(operand->ScriptPosition)
|
||||
: FxExpression(EFX_UnaryNotBitwise, operand->ScriptPosition)
|
||||
{
|
||||
Operand=operand;
|
||||
}
|
||||
|
@ -1455,7 +1455,7 @@ ExpEmit FxUnaryNotBitwise::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxUnaryNotBoolean::FxUnaryNotBoolean(FxExpression *operand)
|
||||
: FxExpression(operand->ScriptPosition)
|
||||
: FxExpression(EFX_UnaryNotBoolean, operand->ScriptPosition)
|
||||
{
|
||||
Operand=operand;
|
||||
}
|
||||
|
@ -1525,7 +1525,7 @@ ExpEmit FxUnaryNotBoolean::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxSizeAlign::FxSizeAlign(FxExpression *operand, int which)
|
||||
: FxExpression(operand->ScriptPosition)
|
||||
: FxExpression(EFX_SizeAlign, operand->ScriptPosition)
|
||||
{
|
||||
Operand = operand;
|
||||
Which = which;
|
||||
|
@ -1586,7 +1586,7 @@ ExpEmit FxSizeAlign::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxPreIncrDecr::FxPreIncrDecr(FxExpression *base, int token)
|
||||
: FxExpression(base->ScriptPosition), Token(token), Base(base)
|
||||
: FxExpression(EFX_PreIncrDecr, base->ScriptPosition), Token(token), Base(base)
|
||||
{
|
||||
AddressRequested = false;
|
||||
AddressWritable = false;
|
||||
|
@ -1680,7 +1680,7 @@ ExpEmit FxPreIncrDecr::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxPostIncrDecr::FxPostIncrDecr(FxExpression *base, int token)
|
||||
: FxExpression(base->ScriptPosition), Token(token), Base(base)
|
||||
: FxExpression(EFX_PostIncrDecr, base->ScriptPosition), Token(token), Base(base)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -1762,7 +1762,7 @@ ExpEmit FxPostIncrDecr::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxAssign::FxAssign(FxExpression *base, FxExpression *right)
|
||||
: FxExpression(base->ScriptPosition), Base(base), Right(right)
|
||||
: FxExpression(EFX_Assign, base->ScriptPosition), Base(base), Right(right)
|
||||
{
|
||||
AddressRequested = false;
|
||||
AddressWritable = false;
|
||||
|
@ -1915,7 +1915,7 @@ ExpEmit FxAssign::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxAssignSelf::FxAssignSelf(const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_AssignSelf, pos)
|
||||
{
|
||||
Assignment = nullptr;
|
||||
}
|
||||
|
@ -1955,7 +1955,7 @@ ExpEmit FxAssignSelf::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxBinary::FxBinary(int o, FxExpression *l, FxExpression *r)
|
||||
: FxExpression(l->ScriptPosition)
|
||||
: FxExpression(EFX_Binary, l->ScriptPosition)
|
||||
{
|
||||
Operator=o;
|
||||
left=l;
|
||||
|
@ -2842,7 +2842,7 @@ ExpEmit FxLtGtEq::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxBinaryLogical::FxBinaryLogical(int o, FxExpression *l, FxExpression *r)
|
||||
: FxExpression(l->ScriptPosition)
|
||||
: FxExpression(EFX_BinaryLogical, l->ScriptPosition)
|
||||
{
|
||||
Operator=o;
|
||||
left=l;
|
||||
|
@ -3020,7 +3020,7 @@ ExpEmit FxBinaryLogical::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxConditional::FxConditional(FxExpression *c, FxExpression *t, FxExpression *f)
|
||||
: FxExpression(c->ScriptPosition)
|
||||
: FxExpression(EFX_Conditional, c->ScriptPosition)
|
||||
{
|
||||
condition = c;
|
||||
truex=t;
|
||||
|
@ -3185,7 +3185,7 @@ ExpEmit FxConditional::Emit(VMFunctionBuilder *build)
|
|||
//
|
||||
//==========================================================================
|
||||
FxAbs::FxAbs(FxExpression *v)
|
||||
: FxExpression(v->ScriptPosition)
|
||||
: FxExpression(EFX_Abs, v->ScriptPosition)
|
||||
{
|
||||
val = v;
|
||||
ValueType = v->ValueType;
|
||||
|
@ -3275,7 +3275,7 @@ ExpEmit FxAbs::Emit(VMFunctionBuilder *build)
|
|||
//
|
||||
//==========================================================================
|
||||
FxATan2::FxATan2(FxExpression *y, FxExpression *x, const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_ATan2, pos)
|
||||
{
|
||||
yval = y;
|
||||
xval = x;
|
||||
|
@ -3368,7 +3368,7 @@ ExpEmit FxATan2::ToReg(VMFunctionBuilder *build, FxExpression *val)
|
|||
//
|
||||
//==========================================================================
|
||||
FxMinMax::FxMinMax(TArray<FxExpression*> &expr, FName type, const FScriptPosition &pos)
|
||||
: FxExpression(pos), Type(type)
|
||||
: FxExpression(EFX_MinMax, pos), Type(type)
|
||||
{
|
||||
assert(expr.Size() > 0);
|
||||
assert(type == NAME_Min || type == NAME_Max);
|
||||
|
@ -3586,7 +3586,7 @@ ExpEmit FxMinMax::Emit(VMFunctionBuilder *build)
|
|||
//
|
||||
//==========================================================================
|
||||
FxRandom::FxRandom(FRandom * r, FxExpression *mi, FxExpression *ma, const FScriptPosition &pos, bool nowarn)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_Random, pos)
|
||||
{
|
||||
EmitTail = false;
|
||||
if (mi != NULL && ma != NULL)
|
||||
|
@ -3719,7 +3719,7 @@ ExpEmit FxRandom::Emit(VMFunctionBuilder *build)
|
|||
//
|
||||
//==========================================================================
|
||||
FxRandomPick::FxRandomPick(FRandom *r, TArray<FxExpression*> &expr, bool floaty, const FScriptPosition &pos, bool nowarn)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_RandomPick, pos)
|
||||
{
|
||||
assert(expr.Size() > 0);
|
||||
choices.Resize(expr.Size());
|
||||
|
@ -3891,6 +3891,7 @@ FxFRandom::FxFRandom(FRandom *r, FxExpression *mi, FxExpression *ma, const FScri
|
|||
max = new FxFloatCast(ma);
|
||||
}
|
||||
ValueType = TypeFloat64;
|
||||
ExprType = EFX_FRandom;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
@ -3965,7 +3966,7 @@ ExpEmit FxFRandom::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxRandom2::FxRandom2(FRandom *r, FxExpression *m, const FScriptPosition &pos, bool nowarn)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_Random2, pos)
|
||||
{
|
||||
EmitTail = false;
|
||||
rng = r;
|
||||
|
@ -4051,7 +4052,7 @@ ExpEmit FxRandom2::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxIdentifier::FxIdentifier(FName name, const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_Identifier, pos)
|
||||
{
|
||||
Identifier = name;
|
||||
}
|
||||
|
@ -4195,6 +4196,7 @@ FxMemberIdentifier::FxMemberIdentifier(FxExpression *left, FName name, const FSc
|
|||
: FxIdentifier(name, pos)
|
||||
{
|
||||
Object = left;
|
||||
ExprType = EFX_MemberIdentifier;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
@ -4295,7 +4297,7 @@ FxExpression *FxMemberIdentifier::Resolve(FCompileContext& ctx)
|
|||
//==========================================================================
|
||||
|
||||
FxLocalVariable::FxLocalVariable(FxLocalVariableDeclaration *var, const FScriptPosition &sc)
|
||||
: FxExpression(sc)
|
||||
: FxExpression(EFX_LocalVariable, sc)
|
||||
{
|
||||
Variable = var;
|
||||
ValueType = var->ValueType;
|
||||
|
@ -4330,7 +4332,7 @@ ExpEmit FxLocalVariable::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxSelf::FxSelf(const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_Self, pos)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -4373,7 +4375,7 @@ ExpEmit FxSelf::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxClassMember::FxClassMember(FxExpression *x, PField* mem, const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_ClassMember, pos)
|
||||
{
|
||||
classx = x;
|
||||
membervar = mem;
|
||||
|
@ -4471,7 +4473,7 @@ ExpEmit FxClassMember::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxArrayElement::FxArrayElement(FxExpression *base, FxExpression *_index)
|
||||
:FxExpression(base->ScriptPosition)
|
||||
:FxExpression(EFX_ArrayElement, base->ScriptPosition)
|
||||
{
|
||||
Array=base;
|
||||
index = _index;
|
||||
|
@ -4650,7 +4652,7 @@ ExpEmit FxArrayElement::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxFunctionCall::FxFunctionCall(FName methodname, FName rngname, FArgumentList *args, const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_FunctionCall, pos)
|
||||
{
|
||||
MethodName = methodname;
|
||||
RNG = nullptr;
|
||||
|
@ -4888,7 +4890,7 @@ FxExpression *FxFunctionCall::Resolve(FCompileContext& ctx)
|
|||
//==========================================================================
|
||||
|
||||
FxMemberFunctionCall::FxMemberFunctionCall(FxExpression *self, FName methodname, FArgumentList *args, const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_MemberFunctionCall, pos)
|
||||
{
|
||||
Self = self;
|
||||
MethodName = methodname;
|
||||
|
@ -4991,7 +4993,7 @@ FxExpression *FxMemberFunctionCall::Resolve(FCompileContext& ctx)
|
|||
//==========================================================================
|
||||
|
||||
FxActionSpecialCall::FxActionSpecialCall(FxExpression *self, int special, FArgumentList *args, const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_ActionSpecialCall, pos)
|
||||
{
|
||||
Self = self;
|
||||
Special = special;
|
||||
|
@ -5157,7 +5159,7 @@ ExpEmit FxActionSpecialCall::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxVMFunctionCall::FxVMFunctionCall(FxExpression *self, PFunction *func, FArgumentList *args, const FScriptPosition &pos, bool novirtual)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_VMFunctionCall, pos)
|
||||
{
|
||||
Self = self;
|
||||
Function = func;
|
||||
|
@ -5391,7 +5393,7 @@ bool FxVMFunctionCall::CheckEmitCast(VMFunctionBuilder *build, bool returnit, Ex
|
|||
//==========================================================================
|
||||
|
||||
FxFlopFunctionCall::FxFlopFunctionCall(size_t index, FArgumentList *args, const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_FlopFunctionCall, pos)
|
||||
{
|
||||
assert(index < countof(FxFlops) && "FLOP index out of range");
|
||||
Index = (int)index;
|
||||
|
@ -5612,7 +5614,7 @@ bool FxCompoundStatement::CheckLocalVariable(FName name)
|
|||
|
||||
FxIfStatement::FxIfStatement(FxExpression *cond, FxExpression *true_part,
|
||||
FxExpression *false_part, const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
: FxExpression(EFX_IfStatement, pos)
|
||||
{
|
||||
Condition = cond;
|
||||
WhenTrue = true_part;
|
||||
|
@ -5764,7 +5766,7 @@ void FxLoopStatement::Backpatch(VMFunctionBuilder *build, size_t loopstart, size
|
|||
//==========================================================================
|
||||
|
||||
FxWhileLoop::FxWhileLoop(FxExpression *condition, FxExpression *code, const FScriptPosition &pos)
|
||||
: FxLoopStatement(pos), Condition(condition), Code(code)
|
||||
: FxLoopStatement(EFX_WhileLoop, pos), Condition(condition), Code(code)
|
||||
{
|
||||
ValueType = TypeVoid;
|
||||
}
|
||||
|
@ -5850,7 +5852,7 @@ ExpEmit FxWhileLoop::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxDoWhileLoop::FxDoWhileLoop(FxExpression *condition, FxExpression *code, const FScriptPosition &pos)
|
||||
: FxLoopStatement(pos), Condition(condition), Code(code)
|
||||
: FxLoopStatement(EFX_DoWhileLoop, pos), Condition(condition), Code(code)
|
||||
{
|
||||
ValueType = TypeVoid;
|
||||
}
|
||||
|
@ -5938,7 +5940,7 @@ ExpEmit FxDoWhileLoop::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxForLoop::FxForLoop(FxExpression *init, FxExpression *condition, FxExpression *iteration, FxExpression *code, const FScriptPosition &pos)
|
||||
: FxLoopStatement(pos), Init(init), Condition(condition), Iteration(iteration), Code(code)
|
||||
: FxLoopStatement(EFX_ForLoop, pos), Init(init), Condition(condition), Iteration(iteration), Code(code)
|
||||
{
|
||||
ValueType = TypeVoid;
|
||||
}
|
||||
|
@ -6050,7 +6052,7 @@ ExpEmit FxForLoop::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxJumpStatement::FxJumpStatement(int token, const FScriptPosition &pos)
|
||||
: FxExpression(pos), Token(token)
|
||||
: FxExpression(EFX_JumpStatement, pos), Token(token)
|
||||
{
|
||||
ValueType = TypeVoid;
|
||||
}
|
||||
|
@ -6084,7 +6086,7 @@ ExpEmit FxJumpStatement::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxReturnStatement::FxReturnStatement(FxExpression *value, const FScriptPosition &pos)
|
||||
: FxExpression(pos), Value(value)
|
||||
: FxExpression(EFX_ReturnStatement, pos), Value(value)
|
||||
{
|
||||
ValueType = TypeVoid;
|
||||
}
|
||||
|
@ -6162,7 +6164,7 @@ VMFunction *FxReturnStatement::GetDirectFunction()
|
|||
//==========================================================================
|
||||
|
||||
FxClassTypeCast::FxClassTypeCast(PClassPointer *dtype, FxExpression *x)
|
||||
: FxExpression(x->ScriptPosition)
|
||||
: FxExpression(EFX_ClassTypeCast, x->ScriptPosition)
|
||||
{
|
||||
ValueType = dtype;
|
||||
desttype = dtype->ClassRestriction;
|
||||
|
@ -6348,7 +6350,7 @@ FxExpression *FxStateByIndex::Resolve(FCompileContext &ctx)
|
|||
//==========================================================================
|
||||
|
||||
FxRuntimeStateIndex::FxRuntimeStateIndex(FxExpression *index)
|
||||
: FxExpression(index->ScriptPosition), Index(index)
|
||||
: FxExpression(EFX_RuntimeStateIndex, index->ScriptPosition), Index(index)
|
||||
{
|
||||
EmitTail = false;
|
||||
ValueType = TypeState;
|
||||
|
@ -6468,7 +6470,7 @@ ExpEmit FxRuntimeStateIndex::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxMultiNameState::FxMultiNameState(const char *_statestring, const FScriptPosition &pos)
|
||||
:FxExpression(pos)
|
||||
:FxExpression(EFX_MultiNameState, pos)
|
||||
{
|
||||
FName scopename;
|
||||
FString statestring = _statestring;
|
||||
|
@ -6645,7 +6647,7 @@ ExpEmit FxMultiNameState::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxDamageValue::FxDamageValue(FxExpression *v)
|
||||
: FxExpression(v->ScriptPosition)
|
||||
: FxExpression(EFX_DamageValue, v->ScriptPosition)
|
||||
{
|
||||
val = v;
|
||||
ValueType = TypeVoid;
|
||||
|
@ -6696,7 +6698,7 @@ ExpEmit FxDamageValue::Emit(VMFunctionBuilder *build)
|
|||
//==========================================================================
|
||||
|
||||
FxLocalVariableDeclaration::FxLocalVariableDeclaration(PType *type, FName name, FxExpression *initval, int varflags, const FScriptPosition &p)
|
||||
:FxExpression(p)
|
||||
:FxExpression(EFX_LocalVariableDeclaration, p)
|
||||
{
|
||||
ValueType = type;
|
||||
VarFlags = varflags;
|
||||
|
|
|
@ -202,6 +202,68 @@ struct ExpEmit
|
|||
BYTE RegNum, RegType, Konst:1, Fixed:1, Final:1, Target:1;
|
||||
};
|
||||
|
||||
enum EFxType
|
||||
{
|
||||
EFX_Expression,
|
||||
EFX_Identifier,
|
||||
EFX_MemberIdentifier,
|
||||
EFX_ClassDefaults,
|
||||
EFX_Constant,
|
||||
EFX_BoolCast,
|
||||
EFX_IntCast,
|
||||
EFX_FloatCast,
|
||||
EFX_NameCast,
|
||||
EFX_StringCast,
|
||||
EFX_ColorCast,
|
||||
EFX_SoundCast,
|
||||
EFX_TypeCast,
|
||||
EFX_PlusSign,
|
||||
EFX_MinusSign,
|
||||
EFX_UnaryNotBitwise,
|
||||
EFX_UnaryNotBoolean,
|
||||
EFX_SizeAlign,
|
||||
EFX_PreIncrDecr,
|
||||
EFX_PostIncrDecr,
|
||||
EFX_Assign,
|
||||
EFX_AssignSelf,
|
||||
EFX_Binary, // one token fits all, the operator is enough to distinguish them.
|
||||
EFX_BinaryLogical,
|
||||
EFX_Conditional,
|
||||
EFX_Abs,
|
||||
EFX_ATan2,
|
||||
EFX_MinMax,
|
||||
EFX_Random,
|
||||
EFX_RandomPick,
|
||||
EFX_FRandom,
|
||||
EFX_Random2,
|
||||
EFX_ClassMember,
|
||||
EFX_LocalVariable,
|
||||
EFX_Self,
|
||||
EFX_ArrayElement,
|
||||
EFX_FunctionCall,
|
||||
EFX_MemberFunctionCall,
|
||||
EFX_ActionSpecialCall,
|
||||
EFX_FlopFunctionCall,
|
||||
EFX_VMFunctionCall,
|
||||
EFX_Sequence,
|
||||
EFX_CompoundStatement,
|
||||
EFX_IfStatement,
|
||||
EFX_LoopStatement,
|
||||
EFX_WhileLoop,
|
||||
EFX_DoWhileLoop,
|
||||
EFX_ForLoop,
|
||||
EFX_JumpStatement,
|
||||
EFX_ReturnStatement,
|
||||
EFX_ClassTypeCast,
|
||||
EFX_StateByIndex,
|
||||
EFX_RuntimeStateIndex,
|
||||
EFX_MultiNameState,
|
||||
EFX_DamageValue,
|
||||
EFX_Nop,
|
||||
EFX_LocalVariableDeclaration,
|
||||
EFX_COUNT
|
||||
};
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
|
@ -211,8 +273,8 @@ struct ExpEmit
|
|||
class FxExpression
|
||||
{
|
||||
protected:
|
||||
FxExpression(const FScriptPosition &pos)
|
||||
: ScriptPosition(pos)
|
||||
FxExpression(EFxType type, const FScriptPosition &pos)
|
||||
: ScriptPosition(pos), ExprType(type)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -235,6 +297,7 @@ public:
|
|||
PType *ValueType = nullptr;
|
||||
|
||||
bool isresolved = false;
|
||||
EFxType ExprType;
|
||||
};
|
||||
|
||||
//==========================================================================
|
||||
|
@ -270,23 +333,6 @@ public:
|
|||
};
|
||||
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// FxDotIdentifier
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
class FxDotIdentifier : public FxExpression
|
||||
{
|
||||
FxExpression *container;
|
||||
FName Identifier;
|
||||
|
||||
public:
|
||||
FxDotIdentifier(FxExpression*, FName, const FScriptPosition &);
|
||||
~FxDotIdentifier();
|
||||
FxExpression *Resolve(FCompileContext&);
|
||||
};
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// FxClassDefaults
|
||||
|
@ -315,70 +361,70 @@ class FxConstant : public FxExpression
|
|||
ExpVal value;
|
||||
|
||||
public:
|
||||
FxConstant(bool val, const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxConstant(bool val, const FScriptPosition &pos) : FxExpression(EFX_Constant, pos)
|
||||
{
|
||||
ValueType = value.Type = TypeBool;
|
||||
value.Int = val;
|
||||
isresolved = true;
|
||||
}
|
||||
|
||||
FxConstant(int val, const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxConstant(int val, const FScriptPosition &pos) : FxExpression(EFX_Constant, pos)
|
||||
{
|
||||
ValueType = value.Type = TypeSInt32;
|
||||
value.Int = val;
|
||||
isresolved = true;
|
||||
}
|
||||
|
||||
FxConstant(double val, const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxConstant(double val, const FScriptPosition &pos) : FxExpression(EFX_Constant, pos)
|
||||
{
|
||||
ValueType = value.Type = TypeFloat64;
|
||||
value.Float = val;
|
||||
isresolved = true;
|
||||
}
|
||||
|
||||
FxConstant(FSoundID val, const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxConstant(FSoundID val, const FScriptPosition &pos) : FxExpression(EFX_Constant, pos)
|
||||
{
|
||||
ValueType = value.Type = TypeSound;
|
||||
value.Int = val;
|
||||
isresolved = true;
|
||||
}
|
||||
|
||||
FxConstant(FName val, const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxConstant(FName val, const FScriptPosition &pos) : FxExpression(EFX_Constant, pos)
|
||||
{
|
||||
ValueType = value.Type = TypeName;
|
||||
value.Int = val;
|
||||
isresolved = true;
|
||||
}
|
||||
|
||||
FxConstant(const FString &str, const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxConstant(const FString &str, const FScriptPosition &pos) : FxExpression(EFX_Constant, pos)
|
||||
{
|
||||
ValueType = TypeString;
|
||||
value = ExpVal(str);
|
||||
isresolved = true;
|
||||
}
|
||||
|
||||
FxConstant(ExpVal cv, const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxConstant(ExpVal cv, const FScriptPosition &pos) : FxExpression(EFX_Constant, pos)
|
||||
{
|
||||
value = cv;
|
||||
ValueType = cv.Type;
|
||||
isresolved = true;
|
||||
}
|
||||
|
||||
FxConstant(PClass *val, PClassPointer *valtype, const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxConstant(PClass *val, PClassPointer *valtype, const FScriptPosition &pos) : FxExpression(EFX_Constant, pos)
|
||||
{
|
||||
value.pointer = (void*)val;
|
||||
value.Type = ValueType = valtype;
|
||||
isresolved = true;
|
||||
}
|
||||
|
||||
FxConstant(FState *state, const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxConstant(FState *state, const FScriptPosition &pos) : FxExpression(EFX_Constant, pos)
|
||||
{
|
||||
value.pointer = state;
|
||||
ValueType = value.Type = TypeState;
|
||||
isresolved = true;
|
||||
}
|
||||
|
||||
FxConstant(const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxConstant(const FScriptPosition &pos) : FxExpression(EFX_Constant, pos)
|
||||
{
|
||||
value.pointer = nullptr;
|
||||
ValueType = value.Type = TypeNullPtr;
|
||||
|
@ -1175,7 +1221,7 @@ class FxSequence : public FxExpression
|
|||
TDeletingArray<FxExpression *> Expressions;
|
||||
|
||||
public:
|
||||
FxSequence(const FScriptPosition &pos) : FxExpression(pos) {}
|
||||
FxSequence(const FScriptPosition &pos) : FxExpression(EFX_Sequence, pos) {}
|
||||
FxExpression *Resolve(FCompileContext&);
|
||||
ExpEmit Emit(VMFunctionBuilder *build);
|
||||
void Add(FxExpression *expr) { if (expr != NULL) Expressions.Push(expr); }
|
||||
|
@ -1232,8 +1278,8 @@ public:
|
|||
class FxLoopStatement : public FxExpression
|
||||
{
|
||||
protected:
|
||||
FxLoopStatement(const FScriptPosition &pos)
|
||||
: FxExpression(pos)
|
||||
FxLoopStatement(EFxType etype, const FScriptPosition &pos)
|
||||
: FxExpression(etype, pos)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -1367,7 +1413,7 @@ class FxStateByIndex : public FxExpression
|
|||
|
||||
public:
|
||||
|
||||
FxStateByIndex(int i, const FScriptPosition &pos) : FxExpression(pos)
|
||||
FxStateByIndex(int i, const FScriptPosition &pos) : FxExpression(EFX_StateByIndex, pos)
|
||||
{
|
||||
index = i;
|
||||
}
|
||||
|
@ -1440,7 +1486,7 @@ class FxNop : public FxExpression
|
|||
{
|
||||
public:
|
||||
FxNop(const FScriptPosition &p)
|
||||
: FxExpression(p)
|
||||
: FxExpression(EFX_Nop, p)
|
||||
{
|
||||
isresolved = true;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue