fix invalid free on syntax error
[m6w6/ext-psi] / src / parser_proc.c
index 6b8b81714bc991535ffc6e1b5526f3af2b476c6c..75c81060110cf8f80822f0768f46be51dbe91fc1 100644 (file)
@@ -7581,19 +7581,19 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct psi_parser
 
     case 248: /* impl_type_token  */
 #line 393 "src/parser_proc_grammar.y" /* glr.c:851  */
-      {psi_token_free(&(*(struct psi_token **)(&(*yyvaluep))));}
+      {}
 #line 7586 "src/parser_proc.c" /* glr.c:851  */
         break;
 
     case 249: /* impl_type_restricted_token  */
 #line 393 "src/parser_proc_grammar.y" /* glr.c:851  */
-      {psi_token_free(&(*(struct psi_token **)(&(*yyvaluep))));}
+      {}
 #line 7592 "src/parser_proc.c" /* glr.c:851  */
         break;
 
     case 250: /* impl_type_extended_token  */
 #line 393 "src/parser_proc_grammar.y" /* glr.c:851  */
-      {psi_token_free(&(*(struct psi_token **)(&(*yyvaluep))));}
+      {}
 #line 7598 "src/parser_proc.c" /* glr.c:851  */
         break;
 
@@ -7653,7 +7653,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct psi_parser
 
     case 260: /* let_func_token  */
 #line 393 "src/parser_proc_grammar.y" /* glr.c:851  */
-      {psi_token_free(&(*(struct psi_token **)(&(*yyvaluep))));}
+      {}
 #line 7658 "src/parser_proc.c" /* glr.c:851  */
         break;
 
@@ -7671,7 +7671,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct psi_parser
 
     case 263: /* callback_rval  */
 #line 393 "src/parser_proc_grammar.y" /* glr.c:851  */
-      {psi_token_free(&(*(struct psi_token **)(&(*yyvaluep))));}
+      {}
 #line 7676 "src/parser_proc.c" /* glr.c:851  */
         break;
 
@@ -7725,7 +7725,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct psi_parser
 
     case 272: /* set_func_token  */
 #line 393 "src/parser_proc_grammar.y" /* glr.c:851  */
-      {psi_token_free(&(*(struct psi_token **)(&(*yyvaluep))));}
+      {}
 #line 7730 "src/parser_proc.c" /* glr.c:851  */
         break;
 
@@ -7749,7 +7749,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct psi_parser
 
     case 276: /* assert_stmt_token  */
 #line 393 "src/parser_proc_grammar.y" /* glr.c:851  */
-      {psi_token_free(&(*(struct psi_token **)(&(*yyvaluep))));}
+      {}
 #line 7754 "src/parser_proc.c" /* glr.c:851  */
         break;
 
@@ -9442,7 +9442,7 @@ static int psi_parser_proc_lex(YYSTYPE *lvalp, struct psi_parser *P, struct psi_
 #if PSI_DEBUG_LEX
        PSI_DEBUG_PRINT(P, "PSI: LEX index %4zu ", *index);
 #endif
-       if (psi_plist_get(tokens, (*index)++, &token)) {
+       if (psi_plist_get(tokens, (*index)++, &token) && token) {
 #if PSI_DEBUG_LEX      
                PSI_DEBUG_DUMP(P, psi_token_dump, token);
 #endif
@@ -9475,11 +9475,22 @@ static void psi_parser_proc_error(struct psi_parser *P, struct psi_plist *tokens
                
                P->error(PSI_DATA(P), T, PSI_WARNING, "PSI %s at col %u", msg, T->col);
                while (i <= last || T->type != PSI_T_EOS) {
+                       const char *pos;
+                       
                        if (!psi_plist_get(tokens, i++, &T)) {
                                break;
                        }
+                       
+                       if (i < last + 1) {
+                               pos = "preceding";
+                       } else if (i > last + 1) {
+                               pos = "following";
+                       } else {
+                               pos = "offending";
+                       }
+                       
                        P->error(PSI_DATA(P), T, PSI_WARNING, "PSI %s token '%s' at col %u", 
-                                       i<last+1?"preceding":i>last+1?"following":"offending", T->text->val, T->col);
+                                       pos, T ? T->text->val : "<deleted>", T ? T->col : 0);
                }
        } else {
                P->error(PSI_DATA(P), NULL, PSI_WARNING, "PSI %s", msg);