[vala] GError: Check the error code if available in the catch clause



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]