From 5c1e0f0cce5308cd67a4bf77062d90f1e065c51d Mon Sep 17 00:00:00 2001 From: belliash Date: Tue, 30 Apr 2019 23:59:02 +0200 Subject: [PATCH] Simplify the foreach() loop implementation. --- engine/compiler.c | 2 -- engine/vm.c | 33 ++++++++------------------------- include/ph7int.h | 13 +++---------- 3 files changed, 11 insertions(+), 37 deletions(-) diff --git a/engine/compiler.c b/engine/compiler.c index 3fb00c7..6173e2f 100644 --- a/engine/compiler.c +++ b/engine/compiler.c @@ -1840,8 +1840,6 @@ static sxi32 PH7_CompileForeach(ph7_gen_state *pGen) { } /* Zero the structure */ SyZero(pInfo, sizeof(ph7_foreach_info)); - /* Initialize structure fields */ - SySetInit(&pInfo->aStep, &pGen->pVm->sAllocator, sizeof(ph7_foreach_step *)); pCur = pGen->pIn; while(pCur < pEnd && (pCur->nType & PH7_TK_ARRAY_OP) == 0) { diff --git a/engine/vm.c b/engine/vm.c index e0ef2cf..9dfe418 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -4057,24 +4057,13 @@ static sxi32 VmByteCodeExec( } pc = pInstr->iP2 - 1; } else { - ph7_foreach_step *pStep; - pStep = (ph7_foreach_step *)SyMemBackendPoolAlloc(&pVm->sAllocator, sizeof(ph7_foreach_step)); - if(pStep == 0) { - PH7_VmMemoryError(&(*pVm)); - } else { - /* Zero the structure */ - SyZero(pStep, sizeof(ph7_foreach_step)); - /* 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)); - } + /* Prepare the hashmap */ + ph7_hashmap *pMap = (ph7_hashmap *)pTos->x.pOther; + /* Reset the internal loop cursor */ + PH7_HashmapResetLoopCursor(pMap); + /* Store an array in a loop pointer */ + pInfo->pMap = pMap; + pMap->iRef++; } VmPopOperand(&pTos, 1); break; @@ -4085,18 +4074,14 @@ static sxi32 VmByteCodeExec( */ case PH7_OP_FOREACH_STEP: { ph7_foreach_info *pInfo = (ph7_foreach_info *)pInstr->p3; - ph7_foreach_step **apStep, *pStep; ph7_value *pValue; VmFrame *pFrame; - /* Peek the last step */ - apStep = (ph7_foreach_step **)SySetBasePtr(&pInfo->aStep); - pStep = apStep[SySetUsed(&pInfo->aStep) - 1]; pFrame = pVm->pFrame; while(pFrame->pParent && (pFrame->iFlags & VM_FRAME_EXCEPTION)) { /* Safely ignore the exception frame */ pFrame = pFrame->pParent; } - ph7_hashmap *pMap = pStep->xIter.pMap; + ph7_hashmap *pMap = pInfo->pMap; ph7_hashmap_node *pNode; /* Extract the current node value */ pNode = PH7_HashmapGetNextEntry(pMap); @@ -4106,8 +4091,6 @@ static sxi32 VmByteCodeExec( /* Automatically reset the loop cursor */ PH7_HashmapResetLoopCursor(pMap); /* Cleanup the mess left behind */ - SyMemBackendPoolFree(&pVm->sAllocator, pStep); - SySetPop(&pInfo->aStep); PH7_HashmapUnref(pMap); } else { if(SyStringLength(&pInfo->sKey) > 0) { diff --git a/include/ph7int.h b/include/ph7int.h index c7aa980..d4bc4a3 100644 --- a/include/ph7int.h +++ b/include/ph7int.h @@ -789,16 +789,9 @@ struct ph7_hashmap { struct ph7_foreach_info { SyString sKey; /* Key name. Empty otherwise*/ SyString sValue; /* Value name */ - SySet aStep; /* Stack of steps [i.e: ph7_foreach_step instance] */ -}; -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; + ph7_hashmap *pMap; /* Hashmap [i.e: array in the PHP jargon] iteration + * Ex: foreach(array(1,2,3) as $key=>$value){} + */ }; /* * Each PH7 engine is identified by an instance of the following structure.