diff options
author | Jürg Billeter <j@bitron.ch> | 2012-06-02 15:49:32 +0200 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2012-06-23 17:27:31 +0200 |
commit | 855f52bfc87eeb6a0a79bbdd60b26fc74b80b39a (patch) | |
tree | 468381f87211b2d0a11b565cc1c3748a2663208b | |
parent | daef7d45f5a7b6c3afd1aea0918f77bf364a8a5c (diff) | |
download | vala-855f52bfc87eeb6a0a79bbdd60b26fc74b80b39a.tar.gz |
codegen: Fix infinite recursion when using lambda in destructor
Fixes bug 677261.
-rw-r--r-- | codegen/valaccodebasemodule.vala | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 9d9341c62..55af6c51e 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -1847,7 +1847,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { var ref_call = new CCodeFunctionCall (get_dup_func_expression (get_data_type_for_symbol (current_type_symbol), b.source_reference)); ref_call.add_argument (get_result_cexpression ("self")); - ccode.add_assignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), "self"), ref_call); + // never increase reference count for self in finalizers to avoid infinite recursion on following unref + var instance = (is_in_destructor () ? (CCodeExpression) new CCodeIdentifier ("self") : (CCodeExpression) ref_call); + + ccode.add_assignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), "self"), instance); } if (current_method != null) { @@ -2033,8 +2036,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { ccode.add_assignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), "_data%d_".printf (parent_block_id)), new CCodeConstant ("NULL")); } else { if (get_this_type () != null) { - var this_value = new GLibValue (get_data_type_for_symbol (current_type_symbol), new CCodeIdentifier ("self"), true); - ccode.add_expression (destroy_value (this_value)); + // reference count for self is not increased in finalizers + if (!is_in_destructor ()) { + var this_value = new GLibValue (get_data_type_for_symbol (current_type_symbol), new CCodeIdentifier ("self"), true); + ccode.add_expression (destroy_value (this_value)); + } } } |