From: Juerg Billeter Date: Thu, 12 Jul 2007 09:16:14 +0000 (+0000) Subject: allow construction methods to throw exceptions, fix issue with multiple X-Git-Tag: VALA_0_1_1~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bda9e0cf4d60d596c3c6e3f23bba1237ed5825ff;p=thirdparty%2Fvala.git allow construction methods to throw exceptions, fix issue with multiple 2007-07-12 Juerg Billeter * vala/parser.y, vala/valasemanticanalyzer.vala, gobject/valacodegenerator.vala: allow construction methods to throw exceptions, fix issue with multiple catch clauses svn path=/trunk/; revision=349 --- diff --git a/ChangeLog b/ChangeLog index 052f217f8..c545f613e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-07-12 Jürg Billeter + + * vala/parser.y, vala/valasemanticanalyzer.vala, + gobject/valacodegenerator.vala: allow construction methods to throw + exceptions, fix issue with multiple catch clauses + 2007-07-12 Jürg Billeter * vala/parser.y, vala/valacodenode.vala, vala/valaenum.vala, diff --git a/gobject/valacodegenerator.vala b/gobject/valacodegenerator.vala index 955c387aa..c6e33949d 100644 --- a/gobject/valacodegenerator.vala +++ b/gobject/valacodegenerator.vala @@ -1568,9 +1568,9 @@ public class Vala.CodeGenerator : CodeVisitor { var cfrag = new CCodeFragment (); cfrag.append (stmt.body.ccodenode); - cfrag.append (new CCodeGotoStatement ("__finally%d".printf (next_try_id))); - foreach (CatchClause clause in stmt.get_catch_clauses ()) { + cfrag.append (new CCodeGotoStatement ("__finally%d".printf (next_try_id))); + cfrag.append (clause.ccodenode); } @@ -2111,6 +2111,12 @@ public class Vala.CodeGenerator : CodeVisitor { params_it = params_it.next; } + if (expr.can_fail) { + // method can fail + current_method_inner_error = true; + ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("inner_error"))); + } + if (ellipsis) { // ensure variable argument list ends with NULL ccall.add_argument (new CCodeConstant ("NULL")); diff --git a/vala/parser.y b/vala/parser.y index 49bfea40c..331a41b2d 100644 --- a/vala/parser.y +++ b/vala/parser.y @@ -2640,7 +2640,7 @@ method_header g_object_unref ($5); g_free ($6); } - | comment opt_attributes opt_access_modifier opt_modifiers identifier opt_name_specifier OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + | comment opt_attributes opt_access_modifier opt_modifiers identifier opt_name_specifier OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS opt_throws_declaration { GList *l; @@ -2662,6 +2662,14 @@ method_header } g_list_free ($8); } + + for (l = $10; l != NULL; l = l->next) { + vala_method_add_error_domain ($$, l->data); + g_object_unref (l->data); + } + if ($10 != NULL) { + g_list_free ($10); + } } ; diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index 802b1eb25..aea30a28a 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -1645,6 +1645,8 @@ public class Vala.SemanticAnalyzer : CodeVisitor { if (expr.symbol_reference != null && expr.symbol_reference.node is Method) { var m = (Method) expr.symbol_reference.node; check_arguments (expr, m.symbol, m.get_parameters (), expr.get_argument_list ()); + + expr.tree_can_fail = expr.can_fail = (m.get_error_domains ().length () > 0); } else if (type is Enum) { if (expr.get_argument_list ().length () == 0) { expr.error = true;