From 9884f8288b3a26dd27bccd0b58f06b89926bb143 Mon Sep 17 00:00:00 2001 From: belliash Date: Tue, 18 Sep 2018 22:11:57 +0200 Subject: [PATCH] Do not allow typecasting to unset a variable. --- engine/compiler.c | 8 ++++---- engine/lexer.c | 5 +---- engine/parser.c | 1 - include/ph7int.h | 1 - 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/engine/compiler.c b/engine/compiler.c index 05f171b..d4a0659 100644 --- a/engine/compiler.c +++ b/engine/compiler.c @@ -5328,10 +5328,10 @@ static ProcLangConstruct PH7_GenStateGetStatementHandler( */ static int PH7_IsLangConstruct(sxu32 nKeywordID) { if(nKeywordID == PH7_KEYWORD_IMPORT || nKeywordID == PH7_KEYWORD_INCLUDE || nKeywordID == PH7_KEYWORD_REQUIRE - || nKeywordID == PH7_KEYWORD_ISSET || nKeywordID == PH7_KEYWORD_UNSET || nKeywordID == PH7_KEYWORD_EVAL - || nKeywordID == PH7_KEYWORD_EMPTY || nKeywordID == PH7_KEYWORD_ARRAY || nKeywordID == PH7_KEYWORD_LIST - || nKeywordID == PH7_KEYWORD_SELF || nKeywordID == PH7_KEYWORD_PARENT || nKeywordID == PH7_KEYWORD_STATIC - || /* TICKET 1433-012 */ nKeywordID == PH7_KEYWORD_NEW || nKeywordID == PH7_KEYWORD_CLONE) { + || nKeywordID == PH7_KEYWORD_ISSET || nKeywordID == PH7_KEYWORD_EVAL || nKeywordID == PH7_KEYWORD_EMPTY + || nKeywordID == PH7_KEYWORD_ARRAY || nKeywordID == PH7_KEYWORD_LIST || nKeywordID == PH7_KEYWORD_SELF + || nKeywordID == PH7_KEYWORD_PARENT || nKeywordID == PH7_KEYWORD_STATIC || nKeywordID == PH7_KEYWORD_NEW + || nKeywordID == PH7_KEYWORD_CLONE) { return TRUE; } /* Not a language construct */ diff --git a/engine/lexer.c b/engine/lexer.c index bc3826c..668ac8c 100644 --- a/engine/lexer.c +++ b/engine/lexer.c @@ -225,7 +225,7 @@ static sxi32 TokenizeAerScript(SyStream *pStream, SyToken *pToken, void *pUserDa pTmp = (SyToken *)SySetPeek(pTokSet); if(pTmp->nType & PH7_TK_KEYWORD) { sxi32 nID = SX_PTR_TO_INT(pTmp->pUserData); - if((sxu32)nID & (PH7_KEYWORD_ARRAY | PH7_KEYWORD_INT | PH7_KEYWORD_FLOAT | PH7_KEYWORD_STRING | PH7_KEYWORD_OBJECT | PH7_KEYWORD_BOOL | PH7_KEYWORD_UNSET)) { + if((sxu32)nID & (PH7_KEYWORD_ARRAY | PH7_KEYWORD_INT | PH7_KEYWORD_FLOAT | PH7_KEYWORD_STRING | PH7_KEYWORD_OBJECT | PH7_KEYWORD_BOOL)) { pTmp = (SyToken *)SySetAt(pTokSet, pTokSet->nUsed - 2); if(pTmp->nType & PH7_TK_LPAREN) { /* Merge the three tokens '(' 'TYPE' ')' into a single one */ @@ -240,8 +240,6 @@ static sxi32 TokenizeAerScript(SyStream *pStream, SyToken *pToken, void *pUserDa zTypeCast = "(array)"; } else if(nID & PH7_KEYWORD_OBJECT) { zTypeCast = "(object)"; - } else if(nID & PH7_KEYWORD_UNSET) { - zTypeCast = "(unset)"; } /* Reflect the change */ pToken->nType = PH7_TK_OP; @@ -632,7 +630,6 @@ static sxu32 KeywordCode(const char *z, int n) { {"list", PH7_KEYWORD_LIST}, {"require", PH7_KEYWORD_REQUIRE}, {"return", PH7_KEYWORD_RETURN}, - {"unset", PH7_KEYWORD_UNSET}, /* Other keywords */ {"array", PH7_KEYWORD_ARRAY}, {"function", PH7_KEYWORD_FUNCTION}, diff --git a/engine/parser.c b/engine/parser.c index 27728cb..ca39e60 100644 --- a/engine/parser.c +++ b/engine/parser.c @@ -182,7 +182,6 @@ static const ph7_expr_op aOpTable[] = { { {"(float)", sizeof("(float)") - 1 }, EXPR_OP_TYPECAST, 4, EXPR_OP_ASSOC_RIGHT, PH7_OP_CVT_REAL }, { {"(array)", sizeof("(array)") - 1 }, EXPR_OP_TYPECAST, 4, EXPR_OP_ASSOC_RIGHT, PH7_OP_CVT_ARRAY}, { {"(object)", sizeof("(object)") - 1}, EXPR_OP_TYPECAST, 4, EXPR_OP_ASSOC_RIGHT, PH7_OP_CVT_OBJ }, - { {"(unset)", sizeof("(unset)") - 1 }, EXPR_OP_TYPECAST, 4, EXPR_OP_ASSOC_RIGHT, PH7_OP_CVT_NULL }, /* Binary operators */ /* Precedence 7,left-associative */ { {"instanceof", sizeof("instanceof") - 1}, EXPR_OP_INSTOF, 7, EXPR_OP_NON_ASSOC, PH7_OP_IS_A}, diff --git a/include/ph7int.h b/include/ph7int.h index f03d29e..29ff4b3 100644 --- a/include/ph7int.h +++ b/include/ph7int.h @@ -1608,7 +1608,6 @@ enum ph7_expr_id { #define PH7_KEYWORD_CATCH 53 /* catch */ #define PH7_KEYWORD_RETURN 54 /* return */ #define PH7_KEYWORD_BREAK 55 /* break */ -#define PH7_KEYWORD_UNSET 0x800 /* unset: MUST BE A POWER OF TWO */ #define PH7_KEYWORD_VOID 0x1000 /* void: MUST BE A POWER OF TWO */ #define PH7_KEYWORD_CHAR 0x2000 /* char: MUST BE A POWER OF TWO */ #define PH7_KEYWORD_BOOL 0x4000 /* bool: MUST BE A POWER OF TWO */