vala r2429 - in trunk: . gobject
- From: ryanl svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r2429 - in trunk: . gobject
- Date: Wed, 11 Feb 2009 13:14:15 +0000 (UTC)
Author: ryanl
Date: Wed Feb 11 13:14:15 2009
New Revision: 2429
URL: http://svn.gnome.org/viewvc/vala?rev=2429&view=rev
Log:
2009-02-11 Ryan Lortie <desrt desrt ca>
Bug 566363 â yielding functions that throw don't work
* gobject/valagerrormodule.vala:
* gobject/valagasyncmodule.vala:
Refactor GErrorModule to remove some common code and introduce a
separate (virtual) function 'return_with_exception' to create
the code for returning exceptions from functions.
In GAsyncModule, override the new virtual function to call
g_simple_async_report_gerror_in_idle().
Modified:
trunk/ChangeLog
trunk/gobject/valagasyncmodule.vala
trunk/gobject/valagerrormodule.vala
Modified: trunk/gobject/valagasyncmodule.vala
==============================================================================
--- trunk/gobject/valagasyncmodule.vala (original)
+++ trunk/gobject/valagasyncmodule.vala Wed Feb 11 13:14:15 2009
@@ -275,4 +275,46 @@
temp_vars.clear ();
temp_ref_vars.clear ();
}
+
+ public override CCodeStatement return_with_exception (CCodeExpression error_expr)
+ {
+ if (!current_method.coroutine) {
+ return base.return_with_exception (error_expr);
+ }
+
+ var block = new CCodeBlock ();
+ var cl = current_method.parent_symbol as Class;
+
+ var report_idle = new CCodeFunctionCall (new CCodeIdentifier ("g_simple_async_report_gerror_in_idle"));
+
+ if (current_method.binding == MemberBinding.INSTANCE &&
+ cl != null && cl.is_subtype_of (gobject_type)) {
+ report_idle.add_argument (new CCodeIdentifier ("self"));
+ } else {
+ var object_creation = new CCodeFunctionCall (new CCodeIdentifier ("g_object_newv"));
+ object_creation.add_argument (new CCodeConstant ("G_TYPE_OBJECT"));
+ object_creation.add_argument (new CCodeConstant ("0"));
+ object_creation.add_argument (new CCodeConstant ("NULL"));
+ report_idle.add_argument (object_creation);
+ }
+
+ report_idle.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "callback"));
+ report_idle.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "user_data"));
+ report_idle.add_argument (error_expr);
+ block.add_statement (new CCodeExpressionStatement (report_idle));
+
+ var free_error = new CCodeFunctionCall (new CCodeIdentifier ("g_error_free"));
+ free_error.add_argument (error_expr);
+ block.add_statement (new CCodeExpressionStatement (free_error));
+
+ var free_locals = new CCodeFragment ();
+ append_local_free (current_symbol, free_locals, false);
+ block.add_statement (free_locals);
+
+ block.add_statement (new CCodeReturnStatement ());
+
+ return block;
+ }
}
+
+// vim:sw=8 noet
Modified: trunk/gobject/valagerrormodule.vala
==============================================================================
--- trunk/gobject/valagerrormodule.vala (original)
+++ trunk/gobject/valagerrormodule.vala Wed Feb 11 13:14:15 2009
@@ -86,20 +86,46 @@
create_temp_decl (stmt, stmt.error_expression.temp_vars);
}
+ public virtual CCodeStatement return_with_exception (CCodeExpression error_expr)
+ {
+ var cpropagate = new CCodeFunctionCall (new CCodeIdentifier ("g_propagate_error"));
+ cpropagate.add_argument (get_variable_cexpression ("error"));
+ cpropagate.add_argument (error_expr);
+
+ var cerror_block = new CCodeBlock ();
+ cerror_block.add_statement (new CCodeExpressionStatement (cpropagate));
+
+ // free local variables
+ var free_frag = new CCodeFragment ();
+ append_local_free (current_symbol, free_frag, false);
+ cerror_block.add_statement (free_frag);
+
+ if (current_return_type is VoidType) {
+ cerror_block.add_statement (new CCodeReturnStatement ());
+ } else {
+ cerror_block.add_statement (new CCodeReturnStatement (default_value_for_type (current_return_type, false)));
+ }
+
+ return cerror_block;
+ }
+
public override void add_simple_check (CodeNode node, CCodeFragment cfrag) {
current_method_inner_error = true;
+ var inner_error = get_variable_cexpression ("inner_error");
var cprint_frag = new CCodeFragment ();
var ccritical = new CCodeFunctionCall (new CCodeIdentifier ("g_critical"));
ccritical.add_argument (new CCodeConstant ("\"file %s: line %d: uncaught error: %s\""));
ccritical.add_argument (new CCodeConstant ("__FILE__"));
ccritical.add_argument (new CCodeConstant ("__LINE__"));
- ccritical.add_argument (new CCodeMemberAccess.pointer (get_variable_cexpression ("inner_error"), "message"));
+ ccritical.add_argument (new CCodeMemberAccess.pointer (inner_error, "message"));
cprint_frag.append (new CCodeExpressionStatement (ccritical));
var cclear = new CCodeFunctionCall (new CCodeIdentifier ("g_clear_error"));
- cclear.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression ("inner_error")));
+ cclear.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, inner_error));
cprint_frag.append (new CCodeExpressionStatement (cclear));
+ CCodeStatement cerror_handler;
+
if (current_try != null) {
// surrounding try found
@@ -118,47 +144,25 @@
// general catch clause
cerror_block.add_statement (cgoto_stmt);
} else {
- var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeMemberAccess.pointer (get_variable_cexpression ("inner_error"), "domain"), new CCodeIdentifier (clause.error_type.data_type.get_upper_case_cname ()));
+ var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, new CCodeMemberAccess.pointer (inner_error, "domain"), new CCodeIdentifier (clause.error_type.data_type.get_upper_case_cname ()));
var cgoto_block = new CCodeBlock ();
cgoto_block.add_statement (cgoto_stmt);
cerror_block.add_statement (new CCodeIfStatement (ccond, cgoto_block));
}
+
}
// go to finally clause if no catch clause matches
cerror_block.add_statement (new CCodeGotoStatement ("__finally%d".printf (current_try_id)));
- // check error domain if expression failed
- var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, get_variable_cexpression ("inner_error"), new CCodeConstant ("NULL"));
-
- cfrag.append (new CCodeIfStatement (ccond, cerror_block));
+ cerror_handler = cerror_block;
} else if (current_method != null && current_method.get_error_types ().size > 0) {
// current method can fail, propagate error
// TODO ensure one of the error domains matches
- var cpropagate = new CCodeFunctionCall (new CCodeIdentifier ("g_propagate_error"));
- cpropagate.add_argument (get_variable_cexpression ("error"));
- cpropagate.add_argument (get_variable_cexpression ("inner_error"));
-
- var cerror_block = new CCodeBlock ();
- cerror_block.add_statement (new CCodeExpressionStatement (cpropagate));
-
- // free local variables
- var free_frag = new CCodeFragment ();
- append_local_free (current_symbol, free_frag, false);
- cerror_block.add_statement (free_frag);
-
- if (current_return_type is VoidType) {
- cerror_block.add_statement (new CCodeReturnStatement ());
- } else {
- cerror_block.add_statement (new CCodeReturnStatement (default_value_for_type (current_return_type, false)));
- }
-
- var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, get_variable_cexpression ("inner_error"), new CCodeConstant ("NULL"));
-
- cfrag.append (new CCodeIfStatement (ccond, cerror_block));
+ cerror_handler = return_with_exception (inner_error);
} else {
// unhandled error
@@ -178,11 +182,11 @@
cerror_block.add_statement (new CCodeReturnStatement (default_value_for_type (current_return_type, false)));
}
- // check error domain if expression failed
- var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, get_variable_cexpression ("inner_error"), new CCodeConstant ("NULL"));
-
- cfrag.append (new CCodeIfStatement (ccond, cerror_block));
+ cerror_handler = cerror_block;
}
+
+ var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, inner_error, new CCodeConstant ("NULL"));
+ cfrag.append (new CCodeIfStatement (ccond, cerror_handler));
}
public override void visit_try_statement (TryStatement stmt) {
@@ -271,3 +275,5 @@
clause.ccodenode = cfrag;
}
}
+
+// vim:sw=8 noet
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]