]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
fix critical on parse error in lambda expression, fixes bug 511887
authorJuerg Billeter <j@bitron.ch>
Sat, 26 Jan 2008 12:10:24 +0000 (12:10 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sat, 26 Jan 2008 12:10:24 +0000 (12:10 +0000)
2008-01-26  Juerg Billeter  <j@bitron.ch>

* vala/parser.y: fix critical on parse error in lambda expression,
  fixes bug 511887

svn path=/trunk/; revision=909

ChangeLog
vala/parser.y

index f671c0cebed1367f300efb7008c587ef9b92be68..54976067d654520b0fcb6bed42a41a3f4b0a44af 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-26  Jürg Billeter  <j@bitron.ch>
+
+       * vala/parser.y: fix critical on parse error in lambda expression,
+         fixes bug 511887
+
 2008-01-26  Jürg Billeter  <j@bitron.ch>
 
        * vala/valasemanticanalyzer.vala: fix crash with invalid invocation
index 704681d419f8e00e3c2ebd1f78540e2ba6c5c886..8676dd36e272fbcd52425957a45f27a29c144d32 100644 (file)
@@ -1523,51 +1523,71 @@ conditional_expression
 lambda_expression
        : OPEN_PARENS opt_lambda_parameter_list CLOSE_PARENS LAMBDA expression
          {
-               ValaSourceReference *src = src(@4);
-               $$ = VALA_EXPRESSION (vala_code_context_create_lambda_expression (context, $5, src));
-               if ($2 != NULL) {
-                       GList *l;
-                       for (l = $2; l != NULL; l = l->next) {
-                               vala_lambda_expression_add_parameter (VALA_LAMBDA_EXPRESSION ($$), l->data);
-                               g_free (l->data);
+               if ($5 == NULL) {
+                       // error in lambda expression
+                       $$ = NULL;
+               } else {
+                       ValaSourceReference *src = src(@4);
+                       $$ = VALA_EXPRESSION (vala_code_context_create_lambda_expression (context, $5, src));
+                       if ($2 != NULL) {
+                               GList *l;
+                               for (l = $2; l != NULL; l = l->next) {
+                                       vala_lambda_expression_add_parameter (VALA_LAMBDA_EXPRESSION ($$), l->data);
+                                       g_free (l->data);
+                               }
+                               g_list_free ($2);
                        }
-                       g_list_free ($2);
+                       g_object_unref ($5);
+                       g_object_unref (src);
                }
-               g_object_unref ($5);
-               g_object_unref (src);
          }
        | identifier LAMBDA expression
          {
-               ValaSourceReference *src = src(@2);
-               $$ = VALA_EXPRESSION (vala_code_context_create_lambda_expression (context, $3, src));
-               g_object_unref ($3);
-               g_object_unref (src);
-               vala_lambda_expression_add_parameter (VALA_LAMBDA_EXPRESSION ($$), $1);
-               g_free ($1);
+               if ($3 == NULL) {
+                       // error in lambda expression
+                       $$ = NULL;
+               } else {
+                       ValaSourceReference *src = src(@2);
+                       $$ = VALA_EXPRESSION (vala_code_context_create_lambda_expression (context, $3, src));
+                       g_object_unref ($3);
+                       g_object_unref (src);
+                       vala_lambda_expression_add_parameter (VALA_LAMBDA_EXPRESSION ($$), $1);
+                       g_free ($1);
+               }
          }
        | OPEN_PARENS opt_lambda_parameter_list CLOSE_PARENS LAMBDA block
          {
-               ValaSourceReference *src = src(@4);
-               $$ = VALA_EXPRESSION (vala_code_context_create_lambda_expression_with_statement_body (context, VALA_BLOCK ($5), src));
-               if ($2 != NULL) {
-                       GList *l;
-                       for (l = $2; l != NULL; l = l->next) {
-                               vala_lambda_expression_add_parameter (VALA_LAMBDA_EXPRESSION ($$), l->data);
-                               g_free (l->data);
+               if ($5 == NULL) {
+                       // error in lambda block
+                       $$ = NULL;
+               } else {
+                       ValaSourceReference *src = src(@4);
+                       $$ = VALA_EXPRESSION (vala_code_context_create_lambda_expression_with_statement_body (context, VALA_BLOCK ($5), src));
+                       if ($2 != NULL) {
+                               GList *l;
+                               for (l = $2; l != NULL; l = l->next) {
+                                       vala_lambda_expression_add_parameter (VALA_LAMBDA_EXPRESSION ($$), l->data);
+                                       g_free (l->data);
+                               }
+                               g_list_free ($2);
                        }
-                       g_list_free ($2);
+                       g_object_unref ($5);
+                       g_object_unref (src);
                }
-               g_object_unref ($5);
-               g_object_unref (src);
          }
        | identifier LAMBDA block
          {
-               ValaSourceReference *src = src(@2);
-               $$ = VALA_EXPRESSION (vala_code_context_create_lambda_expression_with_statement_body (context, VALA_BLOCK ($3), src));
-               g_object_unref ($3);
-               g_object_unref (src);
-               vala_lambda_expression_add_parameter (VALA_LAMBDA_EXPRESSION ($$), $1);
-               g_free ($1);
+               if ($3 == NULL) {
+                       // error in lambda block
+                       $$ = NULL;
+               } else {
+                       ValaSourceReference *src = src(@2);
+                       $$ = VALA_EXPRESSION (vala_code_context_create_lambda_expression_with_statement_body (context, VALA_BLOCK ($3), src));
+                       g_object_unref ($3);
+                       g_object_unref (src);
+                       vala_lambda_expression_add_parameter (VALA_LAMBDA_EXPRESSION ($$), $1);
+                       g_free ($1);
+               }
          }
        ;