forked from Mirrors/openclonk
Re-fix numeric parameter coercion
parent
14665880ae
commit
a858678248
|
@ -5483,9 +5483,11 @@ static Nillable<int> FnInt(C4AulContext *ctx, C4Real f)
|
|||
return static_cast<int>(f);
|
||||
}
|
||||
|
||||
static C4Real FnFloat(C4AulContext *ctx, int i)
|
||||
static Nillable<C4Real> FnFloat(C4AulContext *ctx, C4Value i)
|
||||
{
|
||||
return i;
|
||||
if (!i.ConvertTo(C4V_Float))
|
||||
return C4VNull;
|
||||
return i.getFloat();
|
||||
}
|
||||
|
||||
//=========================== C4Script Function Map ===================================
|
||||
|
@ -5624,7 +5626,7 @@ protected:
|
|||
#define TYPENAMES(N) typename Par##N##_t
|
||||
#define PARS(N) Par##N##_t
|
||||
#define CONV_TYPE(N) C4ValueConv<Par##N##_t>::Type()
|
||||
#define CONV_FROM_C4V(N) C4ValueConv<Par##N##_t>::_FromC4V(pPars[N])
|
||||
#define CONV_FROM_C4V(N) C4ValueConv<Par##N##_t>::FromC4V(pPars[N])
|
||||
|
||||
// N is the number of parameters pFunc needs. Templates can only have a fixed number of arguments,
|
||||
// so eleven templates are needed
|
||||
|
|
|
@ -428,24 +428,24 @@ C4ScriptOpDef C4ScriptOpMap[] =
|
|||
// | | Bytecode Result | | no second id
|
||||
// | | | Modifier | | | RetType ParType1 ParType2
|
||||
// prefix
|
||||
{ 15, "++", AB_Inc, AB_ERR, 0, 1, 0, C4V_Int, C4V_Int, C4V_Any},
|
||||
{ 15, "--", AB_Dec, AB_ERR, 0, 1, 0, C4V_Int, C4V_Int, C4V_Any},
|
||||
{ 15, "++", AB_Inc, AB_ERR, 0, 1, 0, C4V_Any, C4V_Numeric, C4V_Any},
|
||||
{ 15, "--", AB_Dec, AB_ERR, 0, 1, 0, C4V_Any, C4V_Numeric, C4V_Any},
|
||||
{ 15, "~", AB_BitNot, AB_ERR, 0, 0, 0, C4V_Int, C4V_Int, C4V_Any},
|
||||
{ 15, "!", AB_Not, AB_ERR, 0, 0, 0, C4V_Bool, C4V_Bool, C4V_Any},
|
||||
{ 15, "+", AB_ERR, AB_ERR, 0, 0, 0, C4V_Int, C4V_Int, C4V_Any},
|
||||
{ 15, "-", AB_Neg, AB_ERR, 0, 0, 0, C4V_Int, C4V_Int, C4V_Any},
|
||||
{ 15, "+", AB_ERR, AB_ERR, 0, 0, 0, C4V_Any, C4V_Numeric, C4V_Any},
|
||||
{ 15, "-", AB_Neg, AB_ERR, 0, 0, 0, C4V_Any, C4V_Numeric, C4V_Any},
|
||||
|
||||
// postfix (whithout second statement)
|
||||
{ 16, "++", AB_Inc, AB_Dec, 1, 1, 1, C4V_Int, C4V_Int, C4V_Any},
|
||||
{ 16, "--", AB_Dec, AB_Inc, 1, 1, 1, C4V_Int, C4V_Int, C4V_Any},
|
||||
{ 16, "++", AB_Inc, AB_Dec, 1, 1, 1, C4V_Int, C4V_Numeric, C4V_Any},
|
||||
{ 16, "--", AB_Dec, AB_Inc, 1, 1, 1, C4V_Int, C4V_Numeric, C4V_Any},
|
||||
|
||||
// postfix
|
||||
{ 14, "**", AB_Pow, AB_ERR, 1, 0, 0, C4V_Int, C4V_Int, C4V_Int},
|
||||
{ 13, "/", AB_Div, AB_ERR, 1, 0, 0, C4V_Any, C4V_Any, C4V_Any},
|
||||
{ 13, "*", AB_Mul, AB_ERR, 1, 0, 0, C4V_Any, C4V_Any, C4V_Any},
|
||||
{ 13, "/", AB_Div, AB_ERR, 1, 0, 0, C4V_Any, C4V_Numeric, C4V_Numeric},
|
||||
{ 13, "*", AB_Mul, AB_ERR, 1, 0, 0, C4V_Any, C4V_Numeric, C4V_Numeric},
|
||||
{ 13, "%", AB_Mod, AB_ERR, 1, 0, 0, C4V_Int, C4V_Int, C4V_Int},
|
||||
{ 12, "-", AB_Sub, AB_ERR, 1, 0, 0, C4V_Any, C4V_Any, C4V_Any},
|
||||
{ 12, "+", AB_Sum, AB_ERR, 1, 0, 0, C4V_Any, C4V_Any, C4V_Any},
|
||||
{ 12, "-", AB_Sub, AB_ERR, 1, 0, 0, C4V_Any, C4V_Numeric, C4V_Numeric},
|
||||
{ 12, "+", AB_Sum, AB_ERR, 1, 0, 0, C4V_Any, C4V_Numeric, C4V_Numeric},
|
||||
{ 11, "<<", AB_LeftShift, AB_ERR, 1, 0, 0, C4V_Int, C4V_Int, C4V_Int},
|
||||
{ 11, ">>", AB_RightShift, AB_ERR, 1, 0, 0, C4V_Int, C4V_Int, C4V_Int},
|
||||
{ 10, "<", AB_LessThan, AB_ERR, 1, 0, 0, C4V_Bool, C4V_Int, C4V_Int},
|
||||
|
|
|
@ -54,6 +54,8 @@ const char* GetC4VName(const C4V_Type Type)
|
|||
return "array";
|
||||
case C4V_PropList:
|
||||
return "proplist";
|
||||
case C4V_Numeric:
|
||||
return "any numeric";
|
||||
default:
|
||||
return "!Fehler!";
|
||||
}
|
||||
|
|
|
@ -38,6 +38,8 @@ enum C4V_Type
|
|||
C4V_String,
|
||||
C4V_Array,
|
||||
|
||||
C4V_Numeric, // any numeric value; marker in operator table
|
||||
|
||||
C4V_C4ObjectEnum, // enumerated object
|
||||
C4V_C4DefEnum // enumerated object
|
||||
};
|
||||
|
@ -234,6 +236,11 @@ public:
|
|||
|
||||
inline bool ConvertTo(C4V_Type vtToType) const // convert to dest type
|
||||
{
|
||||
if (vtToType == C4V_Numeric)
|
||||
return Type == C4V_Float || Type == C4V_Int || Type == C4V_Bool || Type == C4V_Any;
|
||||
assert(vtToType <= C4V_Last);
|
||||
if (vtToType > C4V_Last)
|
||||
return false;
|
||||
switch (C4ScriptCnvMap[Type][vtToType].Function)
|
||||
{
|
||||
case C4VCnvFn::CnvOK:
|
||||
|
@ -249,6 +256,10 @@ public:
|
|||
}
|
||||
inline static bool WarnAboutConversion(C4V_Type vtFromType, C4V_Type vtToType)
|
||||
{
|
||||
assert(vtFromType <= C4V_Last);
|
||||
assert(vtToType <= C4V_Last);
|
||||
if (vtFromType > C4V_Last || vtToType > C4V_Last)
|
||||
return false;
|
||||
return C4ScriptCnvMap[vtFromType][vtToType].Warn;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue