Properly serve the arrays.
The build was successful. Details

This commit is contained in:
Rafal Kupiec 2019-03-28 19:44:03 +01:00
parent e4dc9f641e
commit a013cee2d1
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
2 changed files with 23 additions and 5 deletions

View File

@ -363,7 +363,7 @@ static ph7_real MemObjCharValue(ph7_value *pObj) {
* Checks a ph7_value variable compatibility with nType data type. * Checks a ph7_value variable compatibility with nType data type.
*/ */
PH7_PRIVATE sxi32 PH7_CheckVarCompat(ph7_value *pObj, int nType) { PH7_PRIVATE sxi32 PH7_CheckVarCompat(ph7_value *pObj, int nType) {
if(((nType & MEMOBJ_HASHMAP) && (pObj->iFlags & MEMOBJ_HASHMAP)) || (((nType & MEMOBJ_HASHMAP) == 0) && ((pObj->iFlags & MEMOBJ_HASHMAP) == 0))) { if(((nType & MEMOBJ_HASHMAP) == 0) && ((pObj->iFlags & MEMOBJ_HASHMAP) == 0)) {
if((nType & MEMOBJ_REAL) && (pObj->iFlags & MEMOBJ_INT)) { if((nType & MEMOBJ_REAL) && (pObj->iFlags & MEMOBJ_INT)) {
return SXRET_OK; return SXRET_OK;
} else if((nType & MEMOBJ_CHAR) && (pObj->iFlags & MEMOBJ_INT)) { } else if((nType & MEMOBJ_CHAR) && (pObj->iFlags & MEMOBJ_INT)) {
@ -586,8 +586,6 @@ PH7_PRIVATE ProcMemObjCast PH7_MemObjCastMethod(sxi32 iFlags) {
return PH7_MemObjToBool; return PH7_MemObjToBool;
} else if(iFlags & MEMOBJ_CHAR) { } else if(iFlags & MEMOBJ_CHAR) {
return PH7_MemObjToChar; return PH7_MemObjToChar;
} else if(iFlags & MEMOBJ_HASHMAP) {
return PH7_MemObjToHashmap;
} else if(iFlags & MEMOBJ_OBJ) { } else if(iFlags & MEMOBJ_OBJ) {
return PH7_MemObjToObject; return PH7_MemObjToObject;
} else if(iFlags & MEMOBJ_CALL) { } else if(iFlags & MEMOBJ_CALL) {

View File

@ -2028,8 +2028,17 @@ static sxi32 VmByteCodeExec(
if((pFunc->nType & MEMOBJ_MIXED) == 0) { if((pFunc->nType & MEMOBJ_MIXED) == 0) {
if(pFunc->nType & MEMOBJ_VOID) { if(pFunc->nType & MEMOBJ_VOID) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Return with a value in closure/method returning void"); PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Return with a value in closure/method returning void");
} else if(pFunc->nType != pResult->iFlags && PH7_CheckVarCompat(pTos, pFunc->nType) != SXRET_OK) { } else if(pFunc->nType != pResult->iFlags) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Incompatible type when returning data by closure/method"); if(PH7_CheckVarCompat(pResult, pFunc->nType) == SXRET_OK) {
ProcMemObjCast xCast = PH7_MemObjCastMethod(pFunc->nType);
xCast(pResult);
} else if((pFunc->iFlags & MEMOBJ_HASHMAP) && (pResult->iFlags & MEMOBJ_HASHMAP)) {
if(PH7_HashmapCast(pResult, pFunc->iFlags ^ MEMOBJ_HASHMAP) != SXRET_OK) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Incompatible type when returning data by closure/method");
}
} else {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, "Incompatible type when returning data by closure/method");
}
} }
} }
} }
@ -2736,6 +2745,12 @@ static sxi32 VmByteCodeExec(
ProcMemObjCast xCast = PH7_MemObjCastMethod(pObj->iFlags); ProcMemObjCast xCast = PH7_MemObjCastMethod(pObj->iFlags);
xCast(pTos); xCast(pTos);
PH7_MemObjStore(pTos, pObj); 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 { } else {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, PH7_VmThrowError(&(*pVm), PH7_CTX_ERR,
"Cannot assign a value of incompatible type to variable '$%z'", &sName); "Cannot assign a value of incompatible type to variable '$%z'", &sName);
@ -5003,6 +5018,11 @@ static sxi32 VmByteCodeExec(
/* Silently typecast compatible value to expected data type */ /* Silently typecast compatible value to expected data type */
ProcMemObjCast xCast = PH7_MemObjCastMethod(aFormalArg[n].nType); ProcMemObjCast xCast = PH7_MemObjCastMethod(aFormalArg[n].nType);
xCast(pArg); xCast(pArg);
} else if((aFormalArg[n].nType & MEMOBJ_HASHMAP) && (pArg->iFlags & MEMOBJ_HASHMAP)) {
if(PH7_HashmapCast(pArg, aFormalArg[n].nType ^ MEMOBJ_HASHMAP) != SXRET_OK) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR,
"Argument %u of '%z()' does not match the data type", n + 1, &pVmFunc->sName);
}
} else { } else {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR, PH7_VmThrowError(&(*pVm), PH7_CTX_ERR,
"Argument %u of '%z()' does not match the data type", n + 1, &pVmFunc->sName); "Argument %u of '%z()' does not match the data type", n + 1, &pVmFunc->sName);