[vala] GError: Check the error code if available in the catch clause
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Subject: [vala] GError: Check the error code if available in the catch clause
- Date: Mon, 30 Mar 2009 17:44:36 -0400 (EDT)
commit c91aa7f0d58b15ec00a2c74c7748410ce4eeeaa4
Author: Thijs Vermeir <thijsvermeir gmail com>
Date: Tue Mar 17 14:24:37 2009 +0100
GError: Check the error code if available in the catch clause
---
gobject/valagerrormodule.vala | 23 +++++++++++++++++++----
1 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/gobject/valagerrormodule.vala b/gobject/valagerrormodule.vala
index 71770df..01b6e14 100644
--- a/gobject/valagerrormodule.vala
+++ b/gobject/valagerrormodule.vala
@@ -164,15 +164,30 @@ internal class Vala.GErrorModule : CCodeDelegateModule {
var cgoto_stmt = new CCodeGotoStatement (clause.clabel_name);
if (clause.error_type.equals (gerror_type)) {
- // general catch clause
+ // general catch clause, this should be the last one
cerror_block.add_statement (cgoto_stmt);
+ break;
} else {
- var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeMemberAccess.pointer (inner_error, "domain"), new CCodeIdentifier (clause.error_type.data_type.get_upper_case_cname ()));
-
+ var catch_type = clause.error_type as ErrorType;
var cgoto_block = new CCodeBlock ();
cgoto_block.add_statement (cgoto_stmt);
- cerror_block.add_statement (new CCodeIfStatement (ccond, cgoto_block));
+ if (catch_type.error_code != null) {
+ /* catch clause specifies a specific error code */
+ var error_match = new CCodeFunctionCall (new CCodeIdentifier ("g_error_matches"));
+ error_match.add_argument (inner_error);
+ error_match.add_argument (new CCodeIdentifier (catch_type.data_type.get_upper_case_cname ()));
+ error_match.add_argument (new CCodeIdentifier (catch_type.error_code.get_cname ()));
+
+ cerror_block.add_statement (new CCodeIfStatement (error_match, cgoto_block));
+ } else {
+ /* catch clause specifies a full error domain */
+ var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY,
+ new CCodeMemberAccess.pointer (inner_error, "domain"), new CCodeIdentifier
+ (clause.error_type.data_type.get_upper_case_cname ()));
+
+ cerror_block.add_statement (new CCodeIfStatement (ccond, cgoto_block));
+ }
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]