mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-12-15 15:11:32 +00:00
Add a PSymbolConstString class
- Constants can be strings, but the existing PSymbolConst couldn't handle them. The old PSymbolConst is now PSymbolConstNumeric, and the new PSymbolConst is a now a baseclass for it and PSymbolConstString.
This commit is contained in:
parent
33e835b58d
commit
2ab3974752
4 changed files with 47 additions and 23 deletions
|
@ -2287,6 +2287,8 @@ CCMD(typetable)
|
||||||
|
|
||||||
IMPLEMENT_ABSTRACT_CLASS(PSymbol);
|
IMPLEMENT_ABSTRACT_CLASS(PSymbol);
|
||||||
IMPLEMENT_CLASS(PSymbolConst);
|
IMPLEMENT_CLASS(PSymbolConst);
|
||||||
|
IMPLEMENT_CLASS(PSymbolConstNumeric);
|
||||||
|
IMPLEMENT_CLASS(PSymbolConstString);
|
||||||
IMPLEMENT_POINTY_CLASS(PSymbolVMFunction)
|
IMPLEMENT_POINTY_CLASS(PSymbolVMFunction)
|
||||||
DECLARE_POINTER(Function)
|
DECLARE_POINTER(Function)
|
||||||
END_POINTERS
|
END_POINTERS
|
||||||
|
|
|
@ -32,23 +32,6 @@ protected:
|
||||||
PSymbol(FName name) { SymbolName = name; }
|
PSymbol(FName name) { SymbolName = name; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// A constant value ---------------------------------------------------------
|
|
||||||
|
|
||||||
class PSymbolConst : public PSymbol
|
|
||||||
{
|
|
||||||
DECLARE_CLASS(PSymbolConst, PSymbol);
|
|
||||||
public:
|
|
||||||
class PType *ValueType;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
int Value;
|
|
||||||
double Float;
|
|
||||||
};
|
|
||||||
|
|
||||||
PSymbolConst(FName name) : PSymbol(name) {}
|
|
||||||
PSymbolConst() : PSymbol(NAME_None) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
// An action function -------------------------------------------------------
|
// An action function -------------------------------------------------------
|
||||||
|
|
||||||
struct FState;
|
struct FState;
|
||||||
|
@ -654,4 +637,44 @@ extern PStatePointer *TypeState;
|
||||||
extern PFixed *TypeFixed;
|
extern PFixed *TypeFixed;
|
||||||
extern PAngle *TypeAngle;
|
extern PAngle *TypeAngle;
|
||||||
|
|
||||||
|
// A constant value ---------------------------------------------------------
|
||||||
|
|
||||||
|
class PSymbolConst : public PSymbol
|
||||||
|
{
|
||||||
|
DECLARE_CLASS(PSymbolConst, PSymbol);
|
||||||
|
public:
|
||||||
|
PType *ValueType;
|
||||||
|
|
||||||
|
PSymbolConst(FName name, PType *type=NULL) : PSymbol(name), ValueType(type) {}
|
||||||
|
PSymbolConst() : PSymbol(NAME_None), ValueType(NULL) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
// A constant numeric value -------------------------------------------------
|
||||||
|
|
||||||
|
class PSymbolConstNumeric : public PSymbolConst
|
||||||
|
{
|
||||||
|
DECLARE_CLASS(PSymbolConstNumeric, PSymbolConst);
|
||||||
|
public:
|
||||||
|
union
|
||||||
|
{
|
||||||
|
int Value;
|
||||||
|
double Float;
|
||||||
|
};
|
||||||
|
|
||||||
|
PSymbolConstNumeric(FName name, PType *type=NULL) : PSymbolConst(name, type) {}
|
||||||
|
PSymbolConstNumeric() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
// A constant string value --------------------------------------------------
|
||||||
|
|
||||||
|
class PSymbolConstString : public PSymbolConst
|
||||||
|
{
|
||||||
|
DECLARE_CLASS(PSymbolConstString, PSymbolConst);
|
||||||
|
public:
|
||||||
|
FString Str;
|
||||||
|
|
||||||
|
PSymbolConstString(FName name, FString &str) : PSymbolConst(name, TypeString), Str(str) {}
|
||||||
|
PSymbolConstString() {}
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -294,7 +294,7 @@ ExpEmit FxParameter::Emit(VMFunctionBuilder *build)
|
||||||
FxExpression *FxConstant::MakeConstant(PSymbol *sym, const FScriptPosition &pos)
|
FxExpression *FxConstant::MakeConstant(PSymbol *sym, const FScriptPosition &pos)
|
||||||
{
|
{
|
||||||
FxExpression *x;
|
FxExpression *x;
|
||||||
PSymbolConst *csym = dyn_cast<PSymbolConst>(sym);
|
PSymbolConstNumeric *csym = dyn_cast<PSymbolConstNumeric>(sym);
|
||||||
if (csym != NULL)
|
if (csym != NULL)
|
||||||
{
|
{
|
||||||
if (csym->ValueType->IsA(RUNTIME_CLASS(PInt)))
|
if (csym->ValueType->IsA(RUNTIME_CLASS(PInt)))
|
||||||
|
|
|
@ -202,15 +202,15 @@ static void ParseConstant (FScanner &sc, PSymbolTable *symt, PClassActor *cls)
|
||||||
{
|
{
|
||||||
ExpVal val = static_cast<FxConstant *>(expr)->GetValue();
|
ExpVal val = static_cast<FxConstant *>(expr)->GetValue();
|
||||||
delete expr;
|
delete expr;
|
||||||
PSymbolConst *sym = new PSymbolConst(symname);
|
PSymbolConstNumeric *sym;
|
||||||
if (type == TK_Int)
|
if (type == TK_Int)
|
||||||
{
|
{
|
||||||
sym->ValueType = TypeSInt32;
|
sym = new PSymbolConstNumeric(symname, TypeSInt32);
|
||||||
sym->Value = val.GetInt();
|
sym->Value = val.GetInt();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sym->ValueType = TypeFloat64;
|
sym = new PSymbolConstNumeric(symname, TypeFloat64);
|
||||||
sym->Float = val.GetFloat();
|
sym->Float = val.GetFloat();
|
||||||
}
|
}
|
||||||
if (symt->AddSymbol (sym) == NULL)
|
if (symt->AddSymbol (sym) == NULL)
|
||||||
|
@ -260,8 +260,7 @@ static void ParseEnum (FScanner &sc, PSymbolTable *symt, PClassActor *cls)
|
||||||
}
|
}
|
||||||
delete expr;
|
delete expr;
|
||||||
}
|
}
|
||||||
PSymbolConst *sym = new PSymbolConst(symname);
|
PSymbolConstNumeric *sym = new PSymbolConstNumeric(symname, TypeSInt32);
|
||||||
sym->ValueType = TypeSInt32;
|
|
||||||
sym->Value = currvalue;
|
sym->Value = currvalue;
|
||||||
if (symt->AddSymbol (sym) == NULL)
|
if (symt->AddSymbol (sym) == NULL)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue