forked from Mirrors/openclonk
C4Value: Fix float to boolean conversion (initialize floats correctly on 64 bit systems)
parent
c82a71269f
commit
d3f37e5cfd
|
@ -55,7 +55,7 @@ const char* GetC4VName(const C4V_Type Type);
|
||||||
|
|
||||||
union C4V_Data
|
union C4V_Data
|
||||||
{
|
{
|
||||||
C4Real::StorageType Float;
|
C4Real::StorageType Float; // beware! this is a 4 byte value where all other values are 8 byte on 64bit systems. Take care when setting so bool conversion stays valid
|
||||||
intptr_t Int;
|
intptr_t Int;
|
||||||
void * Ptr;
|
void * Ptr;
|
||||||
C4PropList * PropList;
|
C4PropList * PropList;
|
||||||
|
@ -82,7 +82,7 @@ public:
|
||||||
explicit C4Value(int32_t data): NextRef(NULL), Type(C4V_Int)
|
explicit C4Value(int32_t data): NextRef(NULL), Type(C4V_Int)
|
||||||
{ Data.Int = data; }
|
{ Data.Int = data; }
|
||||||
explicit C4Value(C4Real data): NextRef(NULL), Type(C4V_Float)
|
explicit C4Value(C4Real data): NextRef(NULL), Type(C4V_Float)
|
||||||
{ Data.Float = data; AddDataRef(); }
|
{ Data.Int = 0; Data.Float = data; AddDataRef(); }
|
||||||
explicit C4Value(C4Object *pObj);
|
explicit C4Value(C4Object *pObj);
|
||||||
explicit C4Value(C4String *pStr): NextRef(NULL), Type(pStr ? C4V_String : C4V_Nil)
|
explicit C4Value(C4String *pStr): NextRef(NULL), Type(pStr ? C4V_String : C4V_Nil)
|
||||||
{ Data.Str = pStr; AddDataRef(); }
|
{ Data.Str = pStr; AddDataRef(); }
|
||||||
|
@ -140,7 +140,15 @@ public:
|
||||||
void Set(const C4Value &nValue) { Set(nValue.Data, nValue.Type); }
|
void Set(const C4Value &nValue) { Set(nValue.Data, nValue.Type); }
|
||||||
|
|
||||||
void SetInt(int i) { C4V_Data d; d.Int = i; Set(d, C4V_Int); }
|
void SetInt(int i) { C4V_Data d; d.Int = i; Set(d, C4V_Int); }
|
||||||
void SetFloat(C4Real f) { C4V_Data d; d.Float = f; if(d.Int == 0x80000000) d.Int = 0; Set(d, C4V_Float); }
|
void SetFloat(C4Real f)
|
||||||
|
{
|
||||||
|
C4V_Data d;
|
||||||
|
d.Float = f;
|
||||||
|
d.Int = 0; // make sure the upper bits are 0ed on 64 bit systems
|
||||||
|
d.Float = f;
|
||||||
|
if(d.Int == (int)0x80000000) d.Int = 0; // Don't store -0.0
|
||||||
|
Set(d, C4V_Float);
|
||||||
|
}
|
||||||
void SetBool(bool b) { C4V_Data d; d.Int = b; Set(d, C4V_Bool); }
|
void SetBool(bool b) { C4V_Data d; d.Int = b; Set(d, C4V_Bool); }
|
||||||
void SetString(C4String * Str) { C4V_Data d; d.Str = Str; Set(d, C4V_String); }
|
void SetString(C4String * Str) { C4V_Data d; d.Str = Str; Set(d, C4V_String); }
|
||||||
void SetArray(C4ValueArray * Array) { C4V_Data d; d.Array = Array; Set(d, C4V_Array); }
|
void SetArray(C4ValueArray * Array) { C4V_Data d; d.Array = Array; Set(d, C4V_Array); }
|
||||||
|
@ -230,7 +238,7 @@ public:
|
||||||
break;
|
break;
|
||||||
case C4V_Float:
|
case C4V_Float:
|
||||||
nrv.Data.Int = Data.Int ^ 0x80000000;
|
nrv.Data.Int = Data.Int ^ 0x80000000;
|
||||||
if(nrv.Data.Int == 0x80000000) nrv.Data.Int = 0;
|
if(nrv.Data.Int == (int)0x80000000) nrv.Data.Int = 0;
|
||||||
nrv.Type = C4V_Float;
|
nrv.Type = C4V_Float;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue