From fe9beb82b68090ce8f7557c05029fb50ecccb02b Mon Sep 17 00:00:00 2001 From: Maciej Piechotka Date: Fri, 23 Aug 2013 22:54:42 +0200 Subject: [PATCH] Allow using lambdas within enums. Fixes bug 659778 --- codegen/valaccodebasemodule.vala | 12 +++++++----- codegen/valaccodemethodmodule.vala | 2 +- tests/delegates/bug659778.vala | 26 +++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 3af2c2d8c..b3680d574 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -1858,7 +1858,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { data.add_field ("Block%dData *".printf (parent_block_id), "_data%d_".printf (parent_block_id)); } else { if (get_this_type () != null) { - data.add_field ("%s *".printf (get_ccode_name (current_type_symbol)), "self"); + data.add_field (get_ccode_name (get_data_type_for_symbol (current_type_symbol)), "self"); } if (current_method != null) { @@ -2021,7 +2021,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { if (get_this_type () != null) { // assign "self" for type parameters - ccode.add_declaration ("%s *".printf (get_ccode_name (current_type_symbol)), new CCodeVariableDeclarator ("self")); + ccode.add_declaration(get_ccode_name (get_data_type_for_symbol (current_type_symbol)), new CCodeVariableDeclarator ("self")); ccode.add_assignment (new CCodeIdentifier ("self"), new CCodeMemberAccess.pointer (outer_block, "self")); } @@ -2115,9 +2115,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { ccode.add_expression (unref_call); 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) { - // reference count for self is not increased in finalizers - if (!is_in_destructor ()) { + var this_type = get_this_type (); + if (this_type != null) { + if (this_type.is_disposable () && !is_in_destructor ()) { + // reference count for self is not increased in finalizers var this_value = new GLibValue (get_data_type_for_symbol (current_type_symbol), new CCodeIdentifier ("self"), true); ccode.add_expression (destroy_value (this_value)); } @@ -5455,6 +5456,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { set_delegate_target (lambda, delegate_target); } else if (get_this_type () != null) { CCodeExpression delegate_target = get_result_cexpression ("self"); + delegate_target = convert_to_generic_pointer (delegate_target, get_this_type ()); if (expr_owned || delegate_type.is_called_once) { if (get_this_type () != null) { var ref_call = new CCodeFunctionCall (get_dup_func_expression (get_this_type (), lambda.source_reference)); diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala index 8a4333c3d..d48c03ee1 100644 --- a/codegen/valaccodemethodmodule.vala +++ b/codegen/valaccodemethodmodule.vala @@ -496,7 +496,7 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule { // as closures have block data parameter if (m.binding == MemberBinding.INSTANCE) { var cself = new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), "self"); - ccode.add_declaration ("%s *".printf (get_ccode_name (current_type_symbol)), new CCodeVariableDeclarator ("self")); + ccode.add_declaration (get_ccode_name (get_data_type_for_symbol (current_type_symbol)), new CCodeVariableDeclarator ("self")); ccode.add_assignment (new CCodeIdentifier ("self"), cself); } diff --git a/tests/delegates/bug659778.vala b/tests/delegates/bug659778.vala index 3e60386ce..e73e3c1e4 100644 --- a/tests/delegates/bug659778.vala +++ b/tests/delegates/bug659778.vala @@ -3,7 +3,28 @@ delegate G DoSomething(G g); void do_something (DoSomething f) {} enum TE { - T + T; + public void f() { + do_something ((x) => { + switch (this) { + case T: + return T; + default: + assert_not_reached (); + } + }); + } + public void g(int i) { + do_something ((x) => { + switch (this) { + case T: + i++; + return T; + default: + assert_not_reached (); + } + }); + } } class Test { @@ -22,6 +43,9 @@ class Test { } int main() { + TE t = TE.T; + t.f (); + t.g (0); Test t2 = new Test (); t2.f (); return 0; -- 2.47.2