This commit is contained in:
parent
e794ffd97b
commit
d819820798
|
@ -1008,12 +1008,6 @@ PH7_PRIVATE sxi32 PH7_HashmapDup(ph7_hashmap *pSrc, ph7_hashmap *pDest) {
|
||||||
ph7_value sKey, *pVal;
|
ph7_value sKey, *pVal;
|
||||||
sxi32 rc;
|
sxi32 rc;
|
||||||
sxu32 n;
|
sxu32 n;
|
||||||
if(pSrc == pDest) {
|
|
||||||
/* Same map. This can easily happen since hashmaps are passed by reference.
|
|
||||||
* Unlike the zend engine.
|
|
||||||
*/
|
|
||||||
return SXRET_OK;
|
|
||||||
}
|
|
||||||
/* Point to the first inserted entry in the source */
|
/* Point to the first inserted entry in the source */
|
||||||
pEntry = pSrc->pFirst;
|
pEntry = pSrc->pFirst;
|
||||||
/* Perform the duplication */
|
/* Perform the duplication */
|
||||||
|
|
|
@ -880,23 +880,27 @@ PH7_PRIVATE sxi32 PH7_MemObjStringFormat(ph7_value *pObj, const char *zFormat, v
|
||||||
*/
|
*/
|
||||||
PH7_PRIVATE sxi32 PH7_MemObjStore(ph7_value *pSrc, ph7_value *pDest) {
|
PH7_PRIVATE sxi32 PH7_MemObjStore(ph7_value *pSrc, ph7_value *pDest) {
|
||||||
ph7_class_instance *pObj = 0;
|
ph7_class_instance *pObj = 0;
|
||||||
ph7_hashmap *pMap = 0;
|
ph7_hashmap *pSrcMap = 0;
|
||||||
sxi32 rc;
|
sxi32 rc;
|
||||||
if(pSrc->x.pOther) {
|
if(pSrc->x.pOther) {
|
||||||
if(pSrc->iFlags & MEMOBJ_HASHMAP) {
|
if(pSrc->iFlags & MEMOBJ_HASHMAP) {
|
||||||
/* Increment reference count */
|
/* Dump source hashmap */
|
||||||
((ph7_hashmap *)pSrc->x.pOther)->iRef++;
|
pSrcMap = (ph7_hashmap *)pSrc->x.pOther;
|
||||||
} else if(pSrc->iFlags & MEMOBJ_OBJ) {
|
} else if(pSrc->iFlags & MEMOBJ_OBJ) {
|
||||||
/* Increment reference count */
|
/* Increment reference count */
|
||||||
((ph7_class_instance *)pSrc->x.pOther)->iRef++;
|
((ph7_class_instance *)pSrc->x.pOther)->iRef++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(pDest->iFlags & MEMOBJ_HASHMAP) {
|
if(pDest->iFlags & MEMOBJ_OBJ) {
|
||||||
pMap = (ph7_hashmap *)pDest->x.pOther;
|
|
||||||
} else if(pDest->iFlags & MEMOBJ_OBJ) {
|
|
||||||
pObj = (ph7_class_instance *)pDest->x.pOther;
|
pObj = (ph7_class_instance *)pDest->x.pOther;
|
||||||
}
|
}
|
||||||
SyMemcpy((const void *) & (*pSrc), &(*pDest), sizeof(ph7_value) - (sizeof(ph7_vm *) + sizeof(SyBlob) + sizeof(sxu32)));
|
SyMemcpy((const void *) & (*pSrc), &(*pDest), sizeof(ph7_value) - (sizeof(ph7_vm *) + sizeof(SyBlob) + sizeof(sxu32)));
|
||||||
|
if(pSrcMap) {
|
||||||
|
ph7_hashmap *pMap;
|
||||||
|
pMap = PH7_NewHashmap(&(*pDest->pVm), 0, 0);
|
||||||
|
PH7_HashmapDup(pSrcMap, pMap);
|
||||||
|
pDest->x.pOther = pMap;
|
||||||
|
}
|
||||||
rc = SXRET_OK;
|
rc = SXRET_OK;
|
||||||
if(SyBlobLength(&pSrc->sBlob) > 0) {
|
if(SyBlobLength(&pSrc->sBlob) > 0) {
|
||||||
SyBlobReset(&pDest->sBlob);
|
SyBlobReset(&pDest->sBlob);
|
||||||
|
@ -906,9 +910,7 @@ PH7_PRIVATE sxi32 PH7_MemObjStore(ph7_value *pSrc, ph7_value *pDest) {
|
||||||
SyBlobRelease(&pDest->sBlob);
|
SyBlobRelease(&pDest->sBlob);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(pMap) {
|
if(pObj) {
|
||||||
PH7_HashmapUnref(pMap);
|
|
||||||
} else if(pObj) {
|
|
||||||
PH7_ClassInstanceUnref(pObj);
|
PH7_ClassInstanceUnref(pObj);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
|
|
Loading…
Reference in New Issue