Single variable cannot have many values of different types. This also saves some memory, because union allocates memory just for one of its members.
This commit is contained in:
@@ -39,7 +39,7 @@ static sxi64 MemObjRealToInt(ph7_value *pObj) {
|
||||
*/
|
||||
static const sxi64 maxInt = LARGEST_INT64;
|
||||
static const sxi64 minInt = SMALLEST_INT64;
|
||||
ph7_real r = pObj->rVal;
|
||||
ph7_real r = pObj->x.rVal;
|
||||
if(r < (ph7_real)minInt) {
|
||||
return minInt;
|
||||
} else if(r > (ph7_real)maxInt) {
|
||||
@@ -178,7 +178,7 @@ static ph7_real MemObjRealValue(ph7_value *pObj) {
|
||||
sxi32 iFlags;
|
||||
iFlags = pObj->iFlags;
|
||||
if(iFlags & MEMOBJ_REAL) {
|
||||
return pObj->rVal;
|
||||
return pObj->x.rVal;
|
||||
} else if(iFlags & (MEMOBJ_INT | MEMOBJ_BOOL)) {
|
||||
return (ph7_real)pObj->x.iVal;
|
||||
} else if(iFlags & MEMOBJ_STRING) {
|
||||
@@ -208,7 +208,7 @@ static ph7_real MemObjRealValue(ph7_value *pObj) {
|
||||
"__toFloat", sizeof("__toFloat") - 1, &sResult);
|
||||
if(rc == SXRET_OK && (sResult.iFlags & MEMOBJ_REAL)) {
|
||||
/* Extract method return value */
|
||||
rVal = sResult.rVal;
|
||||
rVal = sResult.x.rVal;
|
||||
}
|
||||
PH7_ClassInstanceUnref((ph7_class_instance *)pObj->x.pOther);
|
||||
PH7_MemObjRelease(&sResult);
|
||||
@@ -225,7 +225,7 @@ static ph7_real MemObjRealValue(ph7_value *pObj) {
|
||||
*/
|
||||
static sxi32 MemObjStringValue(SyBlob *pOut, ph7_value *pObj, sxu8 bStrictBool) {
|
||||
if(pObj->iFlags & MEMOBJ_REAL) {
|
||||
SyBlobFormat(&(*pOut), "%.15g", pObj->rVal);
|
||||
SyBlobFormat(&(*pOut), "%.15g", pObj->x.rVal);
|
||||
} else if(pObj->iFlags & MEMOBJ_INT) {
|
||||
SyBlobFormat(&(*pOut), "%qd", pObj->x.iVal);
|
||||
/* %qd (BSD quad) is equivalent to %lld in the libc printf */
|
||||
@@ -277,7 +277,7 @@ static sxi32 MemObjBooleanValue(ph7_value *pObj) {
|
||||
sxi32 iFlags;
|
||||
iFlags = pObj->iFlags;
|
||||
if(iFlags & MEMOBJ_REAL) {
|
||||
return pObj->rVal != 0.0 ? 1 : 0;
|
||||
return pObj->x.rVal != 0.0 ? 1 : 0;
|
||||
} else if(iFlags & MEMOBJ_INT) {
|
||||
return pObj->x.iVal ? 1 : 0;
|
||||
} else if(iFlags & MEMOBJ_STRING) {
|
||||
@@ -349,7 +349,7 @@ PH7_PRIVATE sxi32 PH7_MemObjToInteger(ph7_value *pObj) {
|
||||
PH7_PRIVATE sxi32 PH7_MemObjToReal(ph7_value *pObj) {
|
||||
if((pObj->iFlags & MEMOBJ_REAL) == 0) {
|
||||
/* Preform the conversion */
|
||||
pObj->rVal = MemObjRealValue(&(*pObj));
|
||||
pObj->x.rVal = MemObjRealValue(&(*pObj));
|
||||
/* Invalidate any prior representations */
|
||||
SyBlobRelease(&pObj->sBlob);
|
||||
MemObjSetType(pObj, MEMOBJ_REAL);
|
||||
@@ -554,7 +554,7 @@ PH7_PRIVATE sxi32 PH7_MemObjIsEmpty(ph7_value *pObj) {
|
||||
} else if(pObj->iFlags & MEMOBJ_INT) {
|
||||
return pObj->x.iVal == 0 ? TRUE : FALSE;
|
||||
} else if(pObj->iFlags & MEMOBJ_REAL) {
|
||||
return pObj->rVal == (ph7_real)0 ? TRUE : FALSE;
|
||||
return pObj->x.rVal == (ph7_real)0 ? TRUE : FALSE;
|
||||
} else if(pObj->iFlags & MEMOBJ_BOOL) {
|
||||
return !pObj->x.iVal;
|
||||
} else if(pObj->iFlags & MEMOBJ_STRING) {
|
||||
@@ -681,7 +681,7 @@ PH7_PRIVATE sxi32 PH7_MemObjInitFromReal(ph7_vm *pVm, ph7_value *pObj, ph7_real
|
||||
pObj->pVm = pVm;
|
||||
SyBlobInit(&pObj->sBlob, &pVm->sAllocator);
|
||||
/* Set the desired type */
|
||||
pObj->rVal = rVal;
|
||||
pObj->x.rVal = rVal;
|
||||
pObj->iFlags = MEMOBJ_REAL;
|
||||
return SXRET_OK;
|
||||
}
|
||||
@@ -987,11 +987,11 @@ Numeric:
|
||||
if((pObj1->iFlags & MEMOBJ_REAL) == 0) {
|
||||
PH7_MemObjToReal(pObj1);
|
||||
}
|
||||
r1 = pObj1->rVal;
|
||||
r1 = pObj1->x.rVal;
|
||||
if((pObj2->iFlags & MEMOBJ_REAL) == 0) {
|
||||
PH7_MemObjToReal(pObj2);
|
||||
}
|
||||
r2 = pObj2->rVal;
|
||||
r2 = pObj2->x.rVal;
|
||||
if(r1 > r2) {
|
||||
return 1;
|
||||
} else if(r1 < r2) {
|
||||
@@ -1037,9 +1037,9 @@ PH7_PRIVATE sxi32 PH7_MemObjAdd(ph7_value *pObj1, ph7_value *pObj2, int bAddStor
|
||||
if((pObj2->iFlags & MEMOBJ_REAL) == 0) {
|
||||
PH7_MemObjToReal(pObj2);
|
||||
}
|
||||
a = pObj1->rVal;
|
||||
b = pObj2->rVal;
|
||||
pObj1->rVal = a + b;
|
||||
a = pObj1->x.rVal;
|
||||
b = pObj2->x.rVal;
|
||||
pObj1->x.rVal = a + b;
|
||||
MemObjSetType(pObj1, MEMOBJ_REAL);
|
||||
} else {
|
||||
/* Integer arithmetic */
|
||||
|
Reference in New Issue
Block a user