From 01f193223012ee1baeca65a4351e9c45c11a5f30 Mon Sep 17 00:00:00 2001 From: belliash Date: Fri, 29 Mar 2019 09:21:58 +0100 Subject: [PATCH] Respect the class attribute data type. --- engine/vm.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/engine/vm.c b/engine/vm.c index 9f91505..3bfbae2 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -2716,7 +2716,25 @@ static sxi32 VmByteCodeExec( pObj = (ph7_value *)SySetAt(&pVm->aMemObj, nIdx); if(pObj) { /* Perform the store operation */ - PH7_MemObjStore(pTos, pObj); + if(pObj->iFlags == pTos->iFlags) { + PH7_MemObjStore(pTos, pObj); + } else if(pObj->iFlags & MEMOBJ_MIXED) { + PH7_MemObjStore(pTos, pObj); + pObj->iFlags |= MEMOBJ_MIXED; + } else if(PH7_CheckVarCompat(pTos, pObj->iFlags) == SXRET_OK) { + ProcMemObjCast xCast = PH7_MemObjCastMethod(pObj->iFlags); + xCast(pTos); + PH7_MemObjStore(pTos, pObj); + } else if((pObj->iFlags & MEMOBJ_HASHMAP) && (pTos->iFlags & MEMOBJ_HASHMAP)) { + if(PH7_HashmapCast(pTos, pObj->iFlags ^ MEMOBJ_HASHMAP) != SXRET_OK) { + PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, + "Cannot assign a value of incompatible type to variable '$%z'", &sName); + } + PH7_MemObjStore(pTos, pObj); + } else { + PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, + "Cannot assign a value of incompatible type to variable '$%z'", &sName); + } } } break;