diff --git a/engine/vm.c b/engine/vm.c index 9c29c18..4de2669 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -2852,17 +2852,14 @@ static sxi32 VmByteCodeExec( if(pTos < pStack) { goto Abort; } - if((pTos->nType & (MEMOBJ_HASHMAP | MEMOBJ_OBJ | MEMOBJ_RES)) == 0) { + if(pTos->nType & (MEMOBJ_INT | MEMOBJ_REAL) && (pTos->nType & MEMOBJ_HASHMAP) == 0) { if(pTos->nIdx != SXU32_HIGH) { ph7_value *pObj; if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) { - /* Force a numeric cast */ - PH7_MemObjToNumeric(pObj); if(pObj->nType & MEMOBJ_REAL) { pObj->x.rVal++; } else { pObj->x.iVal++; - MemObjSetType(pTos, MEMOBJ_INT); } if(pInstr->iP1) { /* Pre-increment */ @@ -2871,8 +2868,6 @@ static sxi32 VmByteCodeExec( } } else { if(pInstr->iP1) { - /* Force a numeric cast */ - PH7_MemObjToNumeric(pTos); /* Pre-increment */ if(pTos->nType & MEMOBJ_REAL) { pTos->x.rVal++; @@ -2882,6 +2877,9 @@ static sxi32 VmByteCodeExec( } } } + } else { + PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, + "Increment operator cannot be applied to a non-numeric operand"); } break; /* @@ -2895,19 +2893,14 @@ static sxi32 VmByteCodeExec( if(pTos < pStack) { goto Abort; } - if((pTos->nType & (MEMOBJ_HASHMAP | MEMOBJ_OBJ | MEMOBJ_RES | MEMOBJ_NULL)) == 0) { - /* Force a numeric cast */ - PH7_MemObjToNumeric(pTos); + if(pTos->nType & (MEMOBJ_INT | MEMOBJ_REAL) && (pTos->nType & MEMOBJ_HASHMAP) == 0) { if(pTos->nIdx != SXU32_HIGH) { ph7_value *pObj; if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) { - /* Force a numeric cast */ - PH7_MemObjToNumeric(pObj); if(pObj->nType & MEMOBJ_REAL) { pObj->x.rVal--; } else { pObj->x.iVal--; - MemObjSetType(pTos, MEMOBJ_INT); } if(pInstr->iP1) { /* Pre-decrement */ @@ -2925,6 +2918,9 @@ static sxi32 VmByteCodeExec( } } } + } else { + PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, + "Decrement operator cannot be applied to a non-numeric operand"); } break; /*