Branch: refs/heads/master Author: Colomban Wendling ban@herbesfolles.org Committer: Colomban Wendling ban@herbesfolles.org Date: Tue, 02 Dec 2014 14:02:13 UTC Commit: 69a15cf2c1c8def91ffd7bc51ca8a1bfd2df563d https://github.com/geany/geany/commit/69a15cf2c1c8def91ffd7bc51ca8a1bfd2df56...
Log Message: ----------- javascript: Stop using longjmp() and friends
Fixes some memory leaks with malformed or partial files.
Modified Paths: -------------- tagmanager/ctags/js.c
Modified: tagmanager/ctags/js.c 77 lines changed, 28 insertions(+), 49 deletions(-) =================================================================== @@ -19,7 +19,6 @@ #include "general.h" /* must always come first */ #include <ctype.h> /* to define isalpha () */ #include <string.h> -#include <setjmp.h> #include <mio/mio.h> #ifdef DEBUG #include <stdio.h> @@ -41,8 +40,6 @@ * DATA DECLARATIONS */
-typedef enum eException { ExceptionNone, ExceptionEOF } exception_t; - /* * Tracks class and function names already created */ @@ -85,6 +82,7 @@ typedef struct sKeywordDesc {
typedef enum eTokenType { TOKEN_UNDEFINED, + TOKEN_EOF, TOKEN_CHARACTER, TOKEN_CLOSE_PAREN, TOKEN_SEMICOLON, @@ -126,8 +124,6 @@ static tokenType LastTokenType;
static langType Lang_js;
-static jmp_buf Exception; - typedef enum { JSTAG_FUNCTION, JSTAG_CLASS, @@ -458,7 +454,7 @@ static void readTokenFull (tokenInfo *const token, boolean include_newlines, vSt
switch (c) { - case EOF: longjmp (Exception, (int)ExceptionEOF); break; + case EOF: token->type = TOKEN_EOF; break; case '(': token->type = TOKEN_OPEN_PAREN; break; case ')': token->type = TOKEN_CLOSE_PAREN; break; case ';': token->type = TOKEN_SEMICOLON; break; @@ -669,32 +665,18 @@ static void skipArgumentList (tokenInfo *const token, boolean include_newlines, { int nest_level = 0;
- /* - * Other databases can have arguments with fully declared - * datatypes: - * ( name varchar(30), text binary(10) ) - * So we must check for nested open and closing parantheses - */ - if (isType (token, TOKEN_OPEN_PAREN)) /* arguments? */ { nest_level++; if (repr) vStringPut (repr, '('); - while (! (isType (token, TOKEN_CLOSE_PAREN) && (nest_level == 0))) + while (nest_level > 0 && ! isType (token, TOKEN_EOF)) { readTokenFull (token, FALSE, repr); if (isType (token, TOKEN_OPEN_PAREN)) - { nest_level++; - } - if (isType (token, TOKEN_CLOSE_PAREN)) - { - if (nest_level > 0) - { - nest_level--; - } - } + else if (isType (token, TOKEN_CLOSE_PAREN)) + nest_level--; } readTokenFull (token, include_newlines, NULL); } @@ -713,20 +695,13 @@ static void skipArrayList (tokenInfo *const token, boolean include_newlines) if (isType (token, TOKEN_OPEN_SQUARE)) /* arguments? */ { nest_level++; - while (! (isType (token, TOKEN_CLOSE_SQUARE) && (nest_level == 0))) + while (nest_level > 0 && ! isType (token, TOKEN_EOF)) { readToken (token); if (isType (token, TOKEN_OPEN_SQUARE)) - { nest_level++; - } - if (isType (token, TOKEN_CLOSE_SQUARE)) - { - if (nest_level > 0) - { - nest_level--; - } - } + else if (isType (token, TOKEN_CLOSE_SQUARE)) + nest_level--; } readTokenFull (token, include_newlines, NULL); } @@ -762,8 +737,9 @@ static boolean findCmdTerm (tokenInfo *const token, boolean include_newlines) * Read until we find either a semicolon or closing brace. * Any nested braces will be handled within. */ - while (! ( isType (token, TOKEN_SEMICOLON) || - isType (token, TOKEN_CLOSE_CURLY) ) ) + while (! isType (token, TOKEN_SEMICOLON) && + ! isType (token, TOKEN_CLOSE_CURLY) && + ! isType (token, TOKEN_EOF)) { /* Handle nested blocks */ if ( isType (token, TOKEN_OPEN_CURLY)) @@ -1132,7 +1108,8 @@ static boolean parseBlock (tokenInfo *const token, tokenInfo *const orig_parent) * If we find a statement without a terminator consider the * block finished, otherwise the stack will be off by one. */ - } while (! isType (token, TOKEN_CLOSE_CURLY) && read_next_token ); + } while (! isType (token, TOKEN_EOF) && + ! isType (token, TOKEN_CLOSE_CURLY) && read_next_token); }
deleteToken (parent); @@ -1209,7 +1186,8 @@ static boolean parseMethods (tokenInfo *const token, tokenInfo *const class)
/* skip whatever is the value */ while (! isType (token, TOKEN_COMMA) && - ! isType (token, TOKEN_CLOSE_CURLY)) + ! isType (token, TOKEN_CLOSE_CURLY) && + ! isType (token, TOKEN_EOF)) { if (isType (token, TOKEN_OPEN_CURLY)) { @@ -1329,7 +1307,8 @@ static boolean parseStatement (tokenInfo *const token, tokenInfo *const parent,
while (! isType (token, TOKEN_CLOSE_CURLY) && ! isType (token, TOKEN_SEMICOLON) && - ! isType (token, TOKEN_EQUAL_SIGN) ) + ! isType (token, TOKEN_EQUAL_SIGN) && + ! isType (token, TOKEN_EOF)) { if (isType (token, TOKEN_OPEN_CURLY)) parseBlock (token, parent); @@ -1403,9 +1382,10 @@ static boolean parseStatement (tokenInfo *const token, tokenInfo *const parent, readToken (method_body_token); vStringCopy (method_body_token->scope, token->scope);
- while (! ( isType (method_body_token, TOKEN_SEMICOLON) || - isType (method_body_token, TOKEN_CLOSE_CURLY) || - isType (method_body_token, TOKEN_OPEN_CURLY)) ) + while (! isType (method_body_token, TOKEN_SEMICOLON) && + ! isType (method_body_token, TOKEN_CLOSE_CURLY) && + ! isType (method_body_token, TOKEN_OPEN_CURLY) && + ! isType (method_body_token, TOKEN_EOF)) { if ( isType (method_body_token, TOKEN_OPEN_PAREN) ) skipArgumentList(method_body_token, FALSE, @@ -1728,7 +1708,7 @@ static boolean parseStatement (tokenInfo *const token, tokenInfo *const parent,
if (parenDepth > 0) { - while (parenDepth > 0) + while (parenDepth > 0 && ! isType (token, TOKEN_EOF)) { if (isType (token, TOKEN_OPEN_PAREN)) parenDepth++; @@ -1795,7 +1775,8 @@ static void parseUI5 (tokenInfo *const token) if (isType (token, TOKEN_PERIOD)) { readToken (token); - while (! isType (token, TOKEN_OPEN_PAREN) ) + while (! isType (token, TOKEN_OPEN_PAREN) && + ! isType (token, TOKEN_EOF)) { readToken (token); } @@ -1813,7 +1794,8 @@ static void parseUI5 (tokenInfo *const token) do { parseMethods (token, name); - } while (! isType (token, TOKEN_CLOSE_CURLY) ); + } while (! isType (token, TOKEN_CLOSE_CURLY) && + ! isType (token, TOKEN_EOF)); }
deleteToken (name); @@ -1884,7 +1866,7 @@ static void parseJsFile (tokenInfo *const token) parseUI5 (token); else parseLine (token, token, FALSE); - } while (TRUE); + } while (! isType (token, TOKEN_EOF)); }
static void initialize (const langType language) @@ -1897,15 +1879,12 @@ static void initialize (const langType language) static void findJsTags (void) { tokenInfo *const token = newToken (); - exception_t exception;
ClassNames = stringListNew (); FunctionNames = stringListNew (); LastTokenType = TOKEN_UNDEFINED;
- exception = (exception_t) (setjmp (Exception)); - while (exception == ExceptionNone) - parseJsFile (token); + parseJsFile (token);
stringListDelete (ClassNames); stringListDelete (FunctionNames);
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).