From 3f9e3b0664e35b36bf5faeacba010b63f325cf35 Mon Sep 17 00:00:00 2001 From: belliash Date: Wed, 28 Nov 2018 21:58:41 +0100 Subject: [PATCH] Check for compatible data types on OP_CALL & OP_STORE. --- engine/vm.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/engine/vm.c b/engine/vm.c index 14f24fb..78b1b39 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -2777,6 +2777,10 @@ static sxi32 VmByteCodeExec( } 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 { PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Cannot assign a value of incompatible type to variable '$%z'", &sName); @@ -5058,8 +5062,8 @@ static sxi32 VmByteCodeExec( } } } else if((aFormalArg[n].nType & MEMOBJ_MIXED) == 0 && (pArg->iFlags & aFormalArg[n].nType) == 0) { - if(aFormalArg[n].nType == MEMOBJ_REAL && (pArg->iFlags & MEMOBJ_INT)) { - /* Silently typecast integer value to float */ + if(PH7_CheckVarCompat(pArg, aFormalArg[n].nType) == SXRET_OK) { + /* Silently typecast compatible value to expected data type */ ProcMemObjCast xCast = PH7_MemObjCastMethod(aFormalArg[n].nType); xCast(pArg); } else {