Simplify the foreach() loop implementation.
The build was successful. Details

This commit is contained in:
Rafal Kupiec 2019-04-30 23:59:02 +02:00
parent 4d8d92092e
commit 5c1e0f0cce
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
3 changed files with 11 additions and 37 deletions

View File

@ -1840,8 +1840,6 @@ static sxi32 PH7_CompileForeach(ph7_gen_state *pGen) {
} }
/* Zero the structure */ /* Zero the structure */
SyZero(pInfo, sizeof(ph7_foreach_info)); SyZero(pInfo, sizeof(ph7_foreach_info));
/* Initialize structure fields */
SySetInit(&pInfo->aStep, &pGen->pVm->sAllocator, sizeof(ph7_foreach_step *));
pCur = pGen->pIn; pCur = pGen->pIn;
while(pCur < pEnd && (pCur->nType & PH7_TK_ARRAY_OP) == 0) { while(pCur < pEnd && (pCur->nType & PH7_TK_ARRAY_OP) == 0) {

View File

@ -4057,24 +4057,13 @@ static sxi32 VmByteCodeExec(
} }
pc = pInstr->iP2 - 1; pc = pInstr->iP2 - 1;
} else { } else {
ph7_foreach_step *pStep; /* Prepare the hashmap */
pStep = (ph7_foreach_step *)SyMemBackendPoolAlloc(&pVm->sAllocator, sizeof(ph7_foreach_step)); ph7_hashmap *pMap = (ph7_hashmap *)pTos->x.pOther;
if(pStep == 0) { /* Reset the internal loop cursor */
PH7_VmMemoryError(&(*pVm)); PH7_HashmapResetLoopCursor(pMap);
} else { /* Store an array in a loop pointer */
/* Zero the structure */ pInfo->pMap = pMap;
SyZero(pStep, sizeof(ph7_foreach_step)); pMap->iRef++;
/* Prepare the step */
ph7_hashmap *pMap = (ph7_hashmap *)pTos->x.pOther;
/* Reset the internal loop cursor */
PH7_HashmapResetLoopCursor(pMap);
/* Mark the step */
pStep->xIter.pMap = pMap;
pMap->iRef++;
}
if(SXRET_OK != SySetPut(&pInfo->aStep, (const void *)&pStep)) {
PH7_VmMemoryError(&(*pVm));
}
} }
VmPopOperand(&pTos, 1); VmPopOperand(&pTos, 1);
break; break;
@ -4085,18 +4074,14 @@ static sxi32 VmByteCodeExec(
*/ */
case PH7_OP_FOREACH_STEP: { case PH7_OP_FOREACH_STEP: {
ph7_foreach_info *pInfo = (ph7_foreach_info *)pInstr->p3; ph7_foreach_info *pInfo = (ph7_foreach_info *)pInstr->p3;
ph7_foreach_step **apStep, *pStep;
ph7_value *pValue; ph7_value *pValue;
VmFrame *pFrame; VmFrame *pFrame;
/* Peek the last step */
apStep = (ph7_foreach_step **)SySetBasePtr(&pInfo->aStep);
pStep = apStep[SySetUsed(&pInfo->aStep) - 1];
pFrame = pVm->pFrame; pFrame = pVm->pFrame;
while(pFrame->pParent && (pFrame->iFlags & VM_FRAME_EXCEPTION)) { while(pFrame->pParent && (pFrame->iFlags & VM_FRAME_EXCEPTION)) {
/* Safely ignore the exception frame */ /* Safely ignore the exception frame */
pFrame = pFrame->pParent; pFrame = pFrame->pParent;
} }
ph7_hashmap *pMap = pStep->xIter.pMap; ph7_hashmap *pMap = pInfo->pMap;
ph7_hashmap_node *pNode; ph7_hashmap_node *pNode;
/* Extract the current node value */ /* Extract the current node value */
pNode = PH7_HashmapGetNextEntry(pMap); pNode = PH7_HashmapGetNextEntry(pMap);
@ -4106,8 +4091,6 @@ static sxi32 VmByteCodeExec(
/* Automatically reset the loop cursor */ /* Automatically reset the loop cursor */
PH7_HashmapResetLoopCursor(pMap); PH7_HashmapResetLoopCursor(pMap);
/* Cleanup the mess left behind */ /* Cleanup the mess left behind */
SyMemBackendPoolFree(&pVm->sAllocator, pStep);
SySetPop(&pInfo->aStep);
PH7_HashmapUnref(pMap); PH7_HashmapUnref(pMap);
} else { } else {
if(SyStringLength(&pInfo->sKey) > 0) { if(SyStringLength(&pInfo->sKey) > 0) {

View File

@ -789,16 +789,9 @@ struct ph7_hashmap {
struct ph7_foreach_info { struct ph7_foreach_info {
SyString sKey; /* Key name. Empty otherwise*/ SyString sKey; /* Key name. Empty otherwise*/
SyString sValue; /* Value name */ SyString sValue; /* Value name */
SySet aStep; /* Stack of steps [i.e: ph7_foreach_step instance] */ ph7_hashmap *pMap; /* Hashmap [i.e: array in the PHP jargon] iteration
}; * Ex: foreach(array(1,2,3) as $key=>$value){}
struct ph7_foreach_step { */
/* Iterate on those values */
union {
ph7_hashmap *pMap; /* Hashmap [i.e: array in the PHP jargon] iteration
* Ex: foreach(array(1,2,3) as $key=>$value){}
*/
ph7_class_instance *pThis; /* Class instance [i.e: object] iteration */
} xIter;
}; };
/* /*
* Each PH7 engine is identified by an instance of the following structure. * Each PH7 engine is identified by an instance of the following structure.