Re-fix numeric parameter coercion

floating-point
Nicolas Hake 2011-01-06 01:09:59 +01:00
parent 14665880ae
commit a858678248
4 changed files with 28 additions and 13 deletions

View File

@ -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

View File

@ -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},

View File

@ -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!";
}

View File

@ -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;
}