From 5cb19f63a502c5119cda587073b4dd6285f2c68d Mon Sep 17 00:00:00 2001 From: belliash Date: Sat, 28 Jul 2018 23:11:29 +0200 Subject: [PATCH] Get rid of alternative syntax for control structures (endif, endwhile, endfor, endforeach). Only curly brackets are allowed. --- engine/compiler.c | 67 +++++++++-------------------------------------- engine/lexer.c | 4 --- include/ph7int.h | 4 --- 3 files changed, 12 insertions(+), 63 deletions(-) diff --git a/engine/compiler.c b/engine/compiler.c index 245da82..2864c83 100644 --- a/engine/compiler.c +++ b/engine/compiler.c @@ -1712,8 +1712,7 @@ static sxi32 GenStateNextChunk(ph7_gen_state *pGen) { * message. */ static sxi32 PH7_CompileBlock( - ph7_gen_state *pGen, /* Code generator state */ - sxi32 nKeywordEnd /* EOF-keyword [i.e: endif;endfor;...]. 0 (zero) otherwise */ + ph7_gen_state *pGen /* Code generator state */ ) { sxi32 rc; if(pGen->pIn->nType & PH7_TK_OCB /* '{' */) { @@ -1748,48 +1747,6 @@ static sxi32 PH7_CompileBlock( } } GenStateLeaveBlock(&(*pGen), 0); - } else if((pGen->pIn->nType & PH7_TK_COLON /* ':' */) && nKeywordEnd > 0) { - pGen->pIn++; - rc = GenStateEnterBlock(&(*pGen), GEN_BLOCK_STD, PH7_VmInstrLength(pGen->pVm), 0, 0); - if(rc != SXRET_OK) { - return SXERR_ABORT; - } - /* Compile until we hit the EOF-keyword [i.e: endif;endfor;...] */ - for(;;) { - if(pGen->pIn >= pGen->pEnd) { - rc = GenStateNextChunk(&(*pGen)); - if(rc == SXERR_ABORT) { - return SXERR_ABORT; - } - if(rc == SXERR_EOF || pGen->pIn >= pGen->pEnd) { - /* No more token to process */ - if(rc == SXERR_EOF) { - PH7_GenCompileError(&(*pGen), E_WARNING, pGen->pEnd[-1].nLine, - "Missing 'endfor;','endwhile;','endswitch;' or 'endforeach;' keyword"); - } - break; - } - } - if(pGen->pIn->nType & PH7_TK_KEYWORD) { - sxi32 nKwrd; - /* Keyword found */ - nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData); - if(nKwrd == nKeywordEnd || - (nKeywordEnd == PH7_TKWRD_ENDIF && (nKwrd == PH7_TKWRD_ELSE || nKwrd == PH7_TKWRD_ELIF))) { - /* Delimiter keyword found,break */ - if(nKwrd != PH7_TKWRD_ELSE && nKwrd != PH7_TKWRD_ELIF) { - pGen->pIn++; /* endif;endswitch... */ - } - break; - } - } - /* Compile a single statement */ - rc = GenStateCompileChunk(&(*pGen), PH7_COMPILE_SINGLE_STMT); - if(rc == SXERR_ABORT) { - return SXERR_ABORT; - } - } - GenStateLeaveBlock(&(*pGen), 0); } else { /* Compile a single statement */ rc = GenStateCompileChunk(&(*pGen), PH7_COMPILE_SINGLE_STMT); @@ -1882,7 +1839,7 @@ static sxi32 PH7_CompileWhile(ph7_gen_state *pGen) { /* Save the instruction index so we can fix it later when the jump destination is resolved */ GenStateNewJumpFixup(pWhileBlock, PH7_OP_JZ, nFalseJump); /* Compile the loop body */ - rc = PH7_CompileBlock(&(*pGen), PH7_TKWRD_ENDWHILE); + rc = PH7_CompileBlock(&(*pGen)); if(rc == SXERR_ABORT) { return SXERR_ABORT; } @@ -1936,7 +1893,7 @@ static sxi32 PH7_CompileDoWhile(ph7_gen_state *pGen) { } /* Deffer 'continue;' jumps until we compile the block */ pDoBlock->bPostContinue = TRUE; - rc = PH7_CompileBlock(&(*pGen), 0); + rc = PH7_CompileBlock(&(*pGen)); if(rc == SXERR_ABORT) { return SXERR_ABORT; } @@ -2144,7 +2101,7 @@ static sxi32 PH7_CompileFor(ph7_gen_state *pGen) { /* Compile the loop body */ pGen->pIn = &pEnd[1]; /* Jump the trailing parenthesis ')' */ pGen->pEnd = pTmp; - rc = PH7_CompileBlock(&(*pGen), PH7_TKWRD_ENDFOR); + rc = PH7_CompileBlock(&(*pGen)); if(rc == SXERR_ABORT) { return SXERR_ABORT; } @@ -2407,7 +2364,7 @@ static sxi32 PH7_CompileForeach(ph7_gen_state *pGen) { /* Compile the loop body */ pGen->pIn = &pEnd[1]; pGen->pEnd = pTmp; - rc = PH7_CompileBlock(&(*pGen), PH7_TKWRD_END4EACH); + rc = PH7_CompileBlock(&(*pGen)); if(rc == SXERR_ABORT) { /* Don't worry about freeing memory, everything will be released shortly */ return SXERR_ABORT; @@ -2525,7 +2482,7 @@ static sxi32 PH7_CompileIf(ph7_gen_state *pGen) { /* Save the instruction index so we can fix it later when the jump destination is resolved */ GenStateNewJumpFixup(pCondBlock, PH7_OP_JZ, nJumpIdx); /* Compile the body */ - rc = PH7_CompileBlock(&(*pGen), PH7_TKWRD_ENDIF); + rc = PH7_CompileBlock(&(*pGen)); if(rc == SXERR_ABORT) { return SXERR_ABORT; } @@ -2561,7 +2518,7 @@ static sxi32 PH7_CompileIf(ph7_gen_state *pGen) { (SX_PTR_TO_INT(pGen->pIn->pUserData) & PH7_TKWRD_ELSE)) { /* Compile the else block */ pGen->pIn++; - rc = PH7_CompileBlock(&(*pGen), PH7_TKWRD_ENDIF); + rc = PH7_CompileBlock(&(*pGen)); if(rc == SXERR_ABORT) { return SXERR_ABORT; } @@ -3303,7 +3260,7 @@ static sxi32 GenStateCompileFuncBody( pInstrContainer = PH7_VmGetByteCodeContainer(pGen->pVm); PH7_VmSetByteCodeContainer(pGen->pVm, &pFunc->aByteCode); /* Compile the body */ - PH7_CompileBlock(&(*pGen), 0); + PH7_CompileBlock(&(*pGen)); /* Fix exception jumps now the destination is resolved */ GenStateFixJumps(pGen->pCurrent, PH7_OP_THROW, PH7_VmInstrLength(pGen->pVm)); /* Emit the final return if not yet done */ @@ -4773,7 +4730,7 @@ static sxi32 PH7_CompileCatch(ph7_gen_state *pGen, ph7_exception *pException) { pInstrContainer = PH7_VmGetByteCodeContainer(pGen->pVm); PH7_VmSetByteCodeContainer(pGen->pVm, &sCatch.sByteCode); /* Compile the block */ - PH7_CompileBlock(&(*pGen), 0); + PH7_CompileBlock(&(*pGen)); /* Fix forward jumps now the destination is resolved */ GenStateFixJumps(pCatch, -1, PH7_VmInstrLength(pGen->pVm)); /* Emit the DONE instruction */ @@ -4827,7 +4784,7 @@ static sxi32 PH7_CompileTry(ph7_gen_state *pGen) { GenStateNewJumpFixup(pTry, PH7_OP_LOAD_EXCEPTION, nJmpIdx); pGen->pIn++; /* Jump the 'try' keyword */ /* Compile the block */ - rc = PH7_CompileBlock(&(*pGen), 0); + rc = PH7_CompileBlock(&(*pGen)); if(rc == SXERR_ABORT) { return SXERR_ABORT; } @@ -4905,7 +4862,7 @@ static sxi32 GenStateCompileSwitchBlock(ph7_gen_state *pGen, sxu32 *pBlockStart) } } /* Compile block */ - rc = PH7_CompileBlock(&(*pGen), 0); + rc = PH7_CompileBlock(&(*pGen)); if(rc == SXERR_ABORT) { return SXERR_ABORT; } @@ -5601,7 +5558,7 @@ static sxi32 GenStateCompileChunk( } if(pGen->pIn->nType & PH7_TK_OCB /* '{' */) { /* Compile block */ - rc = PH7_CompileBlock(&(*pGen), 0); + rc = PH7_CompileBlock(&(*pGen)); if(rc == SXERR_ABORT) { break; } diff --git a/engine/lexer.c b/engine/lexer.c index c4babdb..9d0cbf3 100644 --- a/engine/lexer.c +++ b/engine/lexer.c @@ -614,9 +614,7 @@ static sxu32 KeywordCode(const char *z, int n) { {"class", PH7_TKWRD_CLASS}, {"as", PH7_TKWRD_AS}, {"continue", PH7_TKWRD_CONTINUE}, - {"endif", PH7_TKWRD_ENDIF}, {"function", PH7_TKWRD_FUNCTION}, - {"endwhile", PH7_TKWRD_ENDWHILE}, {"while", PH7_TKWRD_WHILE}, {"eval", PH7_TKWRD_EVAL}, {"do", PH7_TKWRD_DO}, @@ -627,8 +625,6 @@ static sxu32 KeywordCode(const char *z, int n) { {"empty", PH7_TKWRD_EMPTY}, {"instanceof", PH7_TKWRD_INSTANCEOF}, {"interface", PH7_TKWRD_INTERFACE}, - {"endfor", PH7_TKWRD_ENDFOR}, - {"endforeach", PH7_TKWRD_END4EACH}, {"for", PH7_TKWRD_FOR}, {"foreach", PH7_TKWRD_FOREACH}, {"isset", PH7_TKWRD_ISSET}, diff --git a/include/ph7int.h b/include/ph7int.h index 78f203f..6dc2c53 100644 --- a/include/ph7int.h +++ b/include/ph7int.h @@ -1494,13 +1494,11 @@ enum ph7_expr_id { #define PH7_TKWRD_SELF 18 /* self */ #define PH7_TKWRD_FUNCTION 19 /* function */ #define PH7_TKWRD_NAMESPACE 20 /* namespace */ -#define PH7_TKWRD_ENDIF 0x400000 /* endif: MUST BE A POWER OF TWO */ #define PH7_TKWRD_CLONE 0x80 /* clone: MUST BE A POWER OF TWO */ #define PH7_TKWRD_NEW 0x100 /* new: MUST BE A POWER OF TWO */ #define PH7_TKWRD_CONST 22 /* const */ #define PH7_TKWRD_THROW 23 /* throw */ #define PH7_TKWRD_USE 24 /* use */ -#define PH7_TKWRD_ENDWHILE 0x800000 /* endwhile: MUST BE A POWER OF TWO */ #define PH7_TKWRD_WHILE 26 /* while */ #define PH7_TKWRD_EVAL 27 /* eval */ #define PH7_TKWRD_VAR 28 /* var */ @@ -1522,8 +1520,6 @@ enum ph7_expr_id { #define PH7_TKWRD_ISSET 43 /* isset */ #define PH7_TKWRD_PARENT 44 /* parent */ #define PH7_TKWRD_PRIVATE 45 /* private */ -#define PH7_TKWRD_ENDFOR 0x1000000 /* endfor: MUST BE A POWER OF TWO */ -#define PH7_TKWRD_END4EACH 0x2000000 /* endforeach: MUST BE A POWER OF TWO */ #define PH7_TKWRD_FOR 48 /* for */ #define PH7_TKWRD_FOREACH 49 /* foreach */ #define PH7_TKWRD_PROTECTED 50 /* protected */