Use strict type hinting with all OP_*_STORE opcodes
All checks were successful
Build / AerScript (push) Successful in 37s

This commit is contained in:
2025-08-29 22:38:37 +02:00
parent b4486bf603
commit e592eded1b

View File

@@ -2936,6 +2936,7 @@ static sxi32 VmByteCodeExec(
*/ */
case PH7_OP_MUL: case PH7_OP_MUL:
case PH7_OP_MUL_STORE: { case PH7_OP_MUL_STORE: {
SyString sName;
ph7_value *pNos = &pTos[-1]; ph7_value *pNos = &pTos[-1];
/* Force the operand to be numeric */ /* Force the operand to be numeric */
if(pNos < pStack) { if(pNos < pStack) {
@@ -2974,7 +2975,10 @@ static sxi32 VmByteCodeExec(
if(pTos->nIdx == SXU32_HIGH) { if(pTos->nIdx == SXU32_HIGH) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute"); PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute");
} else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) { } else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) {
PH7_MemObjStore(pNos, pObj); if(PH7_MemObjSafeStore(pNos, pObj) != SXRET_OK) {
SyStringInitFromBuf(&sName, pInstr->p3, SyStrlen((const char *)pInstr->p3));
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot assign a value of incompatible type to variable '$%z'", &sName);
};
} }
} }
VmPopOperand(&pTos, 1); VmPopOperand(&pTos, 1);
@@ -3027,11 +3031,10 @@ static sxi32 VmByteCodeExec(
if(pTos->nIdx == SXU32_HIGH) { if(pTos->nIdx == SXU32_HIGH) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute"); PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute");
} else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) { } else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) {
if(pNos->nType != pObj->nType && PH7_CheckVarCompat(pNos, pObj->nType) != SXRET_OK) { if(PH7_MemObjSafeStore(pNos, pObj) != SXRET_OK) {
SyStringInitFromBuf(&sName, pInstr->p3, SyStrlen((const char *)pInstr->p3)); SyStringInitFromBuf(&sName, pInstr->p3, SyStrlen((const char *)pInstr->p3));
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot assign a value of incompatible type to variable '$%z'", &sName); PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot assign a value of incompatible type to variable '$%z'", &sName);
}; };
PH7_MemObjStore(pNos, pObj);
} }
} }
VmPopOperand(&pTos, 1); VmPopOperand(&pTos, 1);
@@ -3084,6 +3087,7 @@ static sxi32 VmByteCodeExec(
* and push the result back onto the stack. * and push the result back onto the stack.
*/ */
case PH7_OP_ADD_STORE: { case PH7_OP_ADD_STORE: {
SyString sName;
ph7_value *pNos = &pTos[-1]; ph7_value *pNos = &pTos[-1];
ph7_value *pObj; ph7_value *pObj;
if(pNos < pStack) { if(pNos < pStack) {
@@ -3107,7 +3111,10 @@ static sxi32 VmByteCodeExec(
if(pTos->nIdx == SXU32_HIGH) { if(pTos->nIdx == SXU32_HIGH) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute"); PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute");
} else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) { } else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) {
PH7_MemObjStore(pTos, pObj); if(PH7_MemObjSafeStore(pTos, pObj) != SXRET_OK) {
SyStringInitFromBuf(&sName, pInstr->p3, SyStrlen((const char *)pInstr->p3));
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot assign a value of incompatible type to variable '$%z'", &sName);
};
} }
/* Ticket 1433-35: Perform a stack dup */ /* Ticket 1433-35: Perform a stack dup */
PH7_MemObjStore(pTos, pNos); PH7_MemObjStore(pTos, pNos);
@@ -3160,6 +3167,7 @@ static sxi32 VmByteCodeExec(
* top of the stack) and push the result back onto the stack. * top of the stack) and push the result back onto the stack.
*/ */
case PH7_OP_SUB_STORE: { case PH7_OP_SUB_STORE: {
SyString sName;
ph7_value *pNos = &pTos[-1]; ph7_value *pNos = &pTos[-1];
ph7_value *pObj; ph7_value *pObj;
if(pNos < pStack) { if(pNos < pStack) {
@@ -3193,7 +3201,10 @@ static sxi32 VmByteCodeExec(
if(pTos->nIdx == SXU32_HIGH) { if(pTos->nIdx == SXU32_HIGH) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute"); PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute");
} else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) { } else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) {
PH7_MemObjStore(pNos, pObj); if(PH7_MemObjSafeStore(pNos, pObj) != SXRET_OK) {
SyStringInitFromBuf(&sName, pInstr->p3, SyStrlen((const char *)pInstr->p3));
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot assign a value of incompatible type to variable '$%z'", &sName);
};
} }
VmPopOperand(&pTos, 1); VmPopOperand(&pTos, 1);
break; break;
@@ -3245,6 +3256,7 @@ static sxi32 VmByteCodeExec(
* Note: Only integer arithemtic is allowed. * Note: Only integer arithemtic is allowed.
*/ */
case PH7_OP_MOD_STORE: { case PH7_OP_MOD_STORE: {
SyString sName;
ph7_value *pNos = &pTos[-1]; ph7_value *pNos = &pTos[-1];
ph7_value *pObj; ph7_value *pObj;
sxi64 a, b, r; sxi64 a, b, r;
@@ -3273,7 +3285,10 @@ static sxi32 VmByteCodeExec(
if(pTos->nIdx == SXU32_HIGH) { if(pTos->nIdx == SXU32_HIGH) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute"); PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute");
} else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) { } else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) {
PH7_MemObjStore(pNos, pObj); if(PH7_MemObjSafeStore(pNos, pObj) != SXRET_OK) {
SyStringInitFromBuf(&sName, pInstr->p3, SyStrlen((const char *)pInstr->p3));
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot assign a value of incompatible type to variable '$%z'", &sName);
};
} }
VmPopOperand(&pTos, 1); VmPopOperand(&pTos, 1);
break; break;
@@ -3322,6 +3337,7 @@ static sxi32 VmByteCodeExec(
* Note: Only floating point arithemtic is allowed. * Note: Only floating point arithemtic is allowed.
*/ */
case PH7_OP_DIV_STORE: { case PH7_OP_DIV_STORE: {
SyString sName;
ph7_value *pNos = &pTos[-1]; ph7_value *pNos = &pTos[-1];
ph7_value *pObj; ph7_value *pObj;
ph7_real a, b, r; ph7_real a, b, r;
@@ -3350,7 +3366,10 @@ static sxi32 VmByteCodeExec(
if(pTos->nIdx == SXU32_HIGH) { if(pTos->nIdx == SXU32_HIGH) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute"); PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot perform assignment on a constant class attribute");
} else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) { } else if((pObj = (ph7_value *)SySetAt(&pVm->aMemObj, pTos->nIdx)) != 0) {
PH7_MemObjStore(pNos, pObj); if(PH7_MemObjSafeStore(pNos, pObj) != SXRET_OK) {
SyStringInitFromBuf(&sName, pInstr->p3, SyStrlen((const char *)pInstr->p3));
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot assign a value of incompatible type to variable '$%z'", &sName);
};
} }
VmPopOperand(&pTos, 1); VmPopOperand(&pTos, 1);
break; break;