summaryrefslogtreecommitdiff
path: root/codegen/valagerrormodule.vala
diff options
context:
space:
mode:
authorJiří Zárevúcky <zarevucky.jiri@gmail.com>2009-07-28 22:32:51 +0200
committerJürg Billeter <j@bitron.ch>2009-07-28 22:32:51 +0200
commit068d310a4943b04747f0fc9ad7b645709405ff53 (patch)
tree5eaf9ba38bd60eba768ffccea9ff4eeec0dbb93f /codegen/valagerrormodule.vala
parent70eec997de972da1bc20f9879da53079cf23aa09 (diff)
downloadvala-068d310a4943b04747f0fc9ad7b645709405ff53.tar.gz
Fix jump statements in try with finally
Fixes bug 579101.
Diffstat (limited to 'codegen/valagerrormodule.vala')
-rw-r--r--codegen/valagerrormodule.vala32
1 files changed, 24 insertions, 8 deletions
diff --git a/codegen/valagerrormodule.vala b/codegen/valagerrormodule.vala
index 90e9552be..649f6dd2d 100644
--- a/codegen/valagerrormodule.vala
+++ b/codegen/valagerrormodule.vala
@@ -27,6 +27,7 @@ using Gee;
internal class Vala.GErrorModule : CCodeDelegateModule {
private int current_try_id = 0;
private int next_try_id = 0;
+ private bool is_in_catch = false;
public GErrorModule (CCodeGenerator codegen, CCodeModule? next) {
base (codegen, next);
@@ -169,7 +170,7 @@ internal class Vala.GErrorModule : CCodeDelegateModule {
CCodeStatement cerror_handler = null;
- if (current_try != null) {
+ if (current_try != null && !is_in_catch) {
// surrounding try found
var cerror_block = new CCodeBlock ();
@@ -257,8 +258,10 @@ internal class Vala.GErrorModule : CCodeDelegateModule {
var old_try = current_try;
var old_try_id = current_try_id;
+ var old_is_in_catch = is_in_catch;
current_try = stmt;
current_try_id = this_try_id;
+ is_in_catch = true;
foreach (CatchClause clause in stmt.get_catch_clauses ()) {
clause.clabel_name = "__catch%d_%s".printf (this_try_id, clause.error_type.get_lower_case_cname ());
@@ -268,25 +271,23 @@ internal class Vala.GErrorModule : CCodeDelegateModule {
stmt.finally_body.accept (codegen);
}
+ is_in_catch = false;
stmt.body.accept (codegen);
-
- current_try = old_try;
- current_try_id = old_try_id;
+ is_in_catch = true;
foreach (CatchClause clause in stmt.get_catch_clauses ()) {
clause.accept (codegen);
}
- if (stmt.finally_body != null) {
- stmt.finally_body.accept (codegen);
- }
+ current_try = old_try;
+ current_try_id = old_try_id;
+ is_in_catch = old_is_in_catch;
var cfrag = new CCodeFragment ();
cfrag.append (stmt.body.ccodenode);
foreach (CatchClause clause in stmt.get_catch_clauses ()) {
cfrag.append (new CCodeGotoStatement ("__finally%d".printf (this_try_id)));
-
cfrag.append (clause.ccodenode);
}
@@ -344,6 +345,21 @@ internal class Vala.GErrorModule : CCodeDelegateModule {
clause.ccodenode = cfrag;
}
+
+ public override void append_local_free (Symbol sym, CCodeFragment cfrag, bool stop_at_loop = false) {
+ var finally_block = (Block) null;
+ if (sym.parent_node is TryStatement) {
+ finally_block = (sym.parent_node as TryStatement).finally_body;
+ } else if (sym.parent_node is CatchClause) {
+ finally_block = (sym.parent_node.parent_node as TryStatement).finally_body;
+ }
+
+ if (finally_block != null) {
+ cfrag.append (finally_block.ccodenode);
+ }
+
+ base.append_local_free (sym, cfrag, stop_at_loop);
+ }
}
// vim:sw=8 noet