From: Maciej Piechotka Date: Sun, 24 Apr 2011 20:01:31 +0000 (+0200) Subject: Fix creation of lambdas inside interface methods X-Git-Tag: 0.12.1~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c8beb70a16587c501bded302428da49271b5300;p=thirdparty%2Fvala.git Fix creation of lambdas inside interface methods Fixes bug 648320. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index c466ef9b4..b759d632c 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -1712,7 +1712,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { } else { if (in_constructor || (current_method != null && current_method.binding == MemberBinding.INSTANCE) || (current_property_accessor != null && current_property_accessor.prop.binding == MemberBinding.INSTANCE)) { - data.add_field ("%s *".printf (current_class.get_cname ()), "self"); + data.add_field ("%s *".printf (current_type_symbol.get_cname ()), "self"); } if (current_method != null) { @@ -1776,7 +1776,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { if (in_constructor || (current_method != null && current_method.binding == MemberBinding.INSTANCE && (!(current_method is CreationMethod) || current_method.body != b)) || (current_property_accessor != null && current_property_accessor.prop.binding == MemberBinding.INSTANCE)) { - var ref_call = new CCodeFunctionCall (get_dup_func_expression (new ObjectType (current_class), b.source_reference)); + 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); @@ -1865,7 +1865,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { (current_property_accessor != null && current_property_accessor.prop.binding == MemberBinding.INSTANCE)) { var ma = new MemberAccess.simple ("this"); ma.symbol_reference = current_class; - ccode.add_expression (get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), "self"), new ObjectType (current_class), ma)); + ccode.add_expression (get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), "self"), get_data_type_for_symbol (current_type_symbol), ma)); } } diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala index 0b8c81af8..e8c65e917 100644 --- a/codegen/valaccodemethodmodule.vala +++ b/codegen/valaccodemethodmodule.vala @@ -401,7 +401,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 (current_class.get_cname ()), new CCodeVariableDeclarator ("self")); + ccode.add_declaration ("%s *".printf (current_type_symbol.get_cname ()), new CCodeVariableDeclarator ("self")); ccode.add_assignment (new CCodeIdentifier ("self"), cself); } diff --git a/tests/Makefile.am b/tests/Makefile.am index f4bb5c12e..ef71b559b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -35,6 +35,7 @@ TESTS = \ methods/bug613483.vala \ methods/bug620673.vala \ methods/bug646345.vala \ + methods/bug648320.vala \ control-flow/break.vala \ control-flow/expressions-conditional.vala \ control-flow/for.vala \ diff --git a/tests/methods/bug648320.vala b/tests/methods/bug648320.vala new file mode 100644 index 000000000..e94c14ebc --- /dev/null +++ b/tests/methods/bug648320.vala @@ -0,0 +1,11 @@ +public interface Foo : Object { + public abstract int i { get; set; } + + public void foo () { + int j = 0; + SourceFunc bar = () => j == i; + } +} + +void main() { +}