Query the top active as well as all loop frames.
All checks were successful
The build was successful.
All checks were successful
The build was successful.
This commit is contained in:
parent
661158d249
commit
1b248a17e7
29
engine/vm.c
29
engine/vm.c
@ -1414,8 +1414,24 @@ static ph7_value *VmExtractMemObj(
|
|||||||
/* Check the superglobals table first */
|
/* Check the superglobals table first */
|
||||||
pEntry = SyHashGet(&pVm->hSuper, (const void *)pName->zString, pName->nByte);
|
pEntry = SyHashGet(&pVm->hSuper, (const void *)pName->zString, pName->nByte);
|
||||||
if(pEntry == 0) {
|
if(pEntry == 0) {
|
||||||
/* Query the top active frame */
|
for(;;) {
|
||||||
pEntry = SyHashGet(&pFrame->hVar, (const void *)pName->zString, pName->nByte);
|
/* Query the top active/loop frame(s) */
|
||||||
|
pEntry = SyHashGet(&pFrame->hVar, (const void *)pName->zString, pName->nByte);
|
||||||
|
if(pEntry) {
|
||||||
|
/* Extract variable contents */
|
||||||
|
nIdx = (sxu32)SX_PTR_TO_INT(pEntry->pUserData);
|
||||||
|
pObj = (ph7_value *)SySetAt(&pVm->aMemObj, nIdx);
|
||||||
|
if(bNullify && pObj) {
|
||||||
|
PH7_MemObjRelease(pObj);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(pFrame->iFlags & VM_FRAME_LOOP && pFrame->pParent) {
|
||||||
|
pFrame = pFrame->pParent;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if(pEntry == 0) {
|
if(pEntry == 0) {
|
||||||
if(!bCreate) {
|
if(!bCreate) {
|
||||||
/* Do not create the variable, return NULL instead */
|
/* Do not create the variable, return NULL instead */
|
||||||
@ -1425,16 +1441,9 @@ static ph7_value *VmExtractMemObj(
|
|||||||
* it in the current frame.
|
* it in the current frame.
|
||||||
*/
|
*/
|
||||||
pObj = VmCreateMemObj(pVm, pName, bDup);
|
pObj = VmCreateMemObj(pVm, pName, bDup);
|
||||||
} else {
|
|
||||||
/* Extract variable contents */
|
|
||||||
nIdx = (sxu32)SX_PTR_TO_INT(pEntry->pUserData);
|
|
||||||
pObj = (ph7_value *)SySetAt(&pVm->aMemObj, nIdx);
|
|
||||||
if(bNullify && pObj) {
|
|
||||||
PH7_MemObjRelease(pObj);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Superglobal */
|
/* Extract from superglobal */
|
||||||
nIdx = (sxu32)SX_PTR_TO_INT(pEntry->pUserData);
|
nIdx = (sxu32)SX_PTR_TO_INT(pEntry->pUserData);
|
||||||
pObj = (ph7_value *)SySetAt(&pVm->aMemObj, nIdx);
|
pObj = (ph7_value *)SySetAt(&pVm->aMemObj, nIdx);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user