]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix creation of lambdas inside interface methods
authorMaciej Piechotka <uzytkownik2@gmail.com>
Sun, 24 Apr 2011 20:01:31 +0000 (22:01 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 29 May 2011 09:16:23 +0000 (11:16 +0200)
Fixes bug 648320.

codegen/valaccodebasemodule.vala
codegen/valaccodemethodmodule.vala
tests/Makefile.am
tests/methods/bug648320.vala [new file with mode: 0644]

index c466ef9b45bd2d739087f0ed56fb6ca9ebb4ead8..b759d632c641ba90b7a2fffffec27708053edeee 100644 (file)
@@ -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));
                                }
                        }
 
index 0b8c81af8a0969c4b1e4a3cff57f93336c6ca37b..e8c65e91753e52649b1f2c2ed7a16fb7924e8910 100644 (file)
@@ -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);
                                        }
 
index f4bb5c12ed1ba7899cb221a0ad3b8eb98e86a6ff..ef71b559bda082bbd8af40920b59cce010298b1f 100644 (file)
@@ -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 (file)
index 0000000..e94c14e
--- /dev/null
@@ -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() {
+}