diff --git a/engine/vm.c b/engine/vm.c index 978ac30..89252ac 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -2182,6 +2182,23 @@ static sxi32 VmByteCodeExec( VmPopOperand(&pTos, 1); } break; + case PH7_OP_JMPLFB: { + VmFrame *pFrame; + /* Enter the jump loop frame */ + rc = VmEnterFrame(&(*pVm), pVm->pFrame->pUserData, pVm->pFrame->pThis, &pFrame); + if(rc != SXRET_OK) { + PH7_VmMemoryError(&(*pVm)); + } + pFrame->iFlags = VM_FRAME_LOOP; + break; + } + case PH7_OP_JMPLFE: { + /* Leave the jump loop frame */ + if(pVm->pFrame->iFlags & VM_FRAME_LOOP) { + VmLeaveFrame(&(*pVm)); + } + break; + } /* * NOOP: * * * * @@ -5405,6 +5422,12 @@ static const char *VmInstrToString(sxi32 nOp) { case PH7_OP_JMPNZ: zOp = "JMPNZ"; break; + case PH7_OP_JMPLFB: + zOp = "JMPLFB"; + break; + case PH7_OP_JMPLFE: + zOp = "JMPLFB"; + break; case PH7_OP_POP: zOp = "POP"; break; diff --git a/include/ph7int.h b/include/ph7int.h index 59e8772..6d012d4 100644 --- a/include/ph7int.h +++ b/include/ph7int.h @@ -1399,6 +1399,8 @@ enum ph7_vm_op { PH7_OP_JMP, /* Unconditional jump */ PH7_OP_JMPZ, /* Jump on zero (FALSE jump) */ PH7_OP_JMPNZ, /* Jump on non-zero (TRUE jump) */ + PH7_OP_JMPLFB, /* Jump loop frame begin */ + PH7_OP_JMPLFE, /* Jump loop frame end */ PH7_OP_POP, /* Stack POP */ PH7_OP_CVT_INT, /* Integer cast */ PH7_OP_CVT_STR, /* String cast */