]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix memory leak when destroying generic variables
authorLuca Bruno <lucabru@src.gnome.org>
Wed, 2 Nov 2011 21:24:41 +0000 (22:24 +0100)
committerLuca Bruno <lucabru@src.gnome.org>
Wed, 2 Nov 2011 21:35:46 +0000 (22:35 +0100)
codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/methods/generics.vala [new file with mode: 0644]

index 1d2032906cb15e7640bd80daf586974149b6b912..233b666b5a551009d8ffd588a0a2f14e928f0201 100644 (file)
@@ -3083,7 +3083,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
                var cisnull = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, cvar, new CCodeConstant ("NULL"));
                if (type.type_parameter != null) {
-                       if (!(current_type_symbol is Class) || current_class.is_compact) {
+                       var parent = type.type_parameter.parent_symbol;
+                       var cl = parent as Class;
+                       if ((!(parent is Method) && !(parent is ObjectTypeSymbol)) || (cl != null && cl.is_compact)) {
                                return new CCodeConstant ("NULL");
                        }
 
index 66194551bf0feb7beee56c8351ad56b8862b0840..444dcd45addcde00a169722608adb467930a404e 100644 (file)
@@ -49,6 +49,7 @@ TESTS = \
        methods/bug653391.vala \
        methods/bug653908.vala \
        methods/bug663210.vala \
+       methods/generics.vala \
        control-flow/break.vala \
        control-flow/expressions-conditional.vala \
        control-flow/for.vala \
diff --git a/tests/methods/generics.vala b/tests/methods/generics.vala
new file mode 100644 (file)
index 0000000..b465523
--- /dev/null
@@ -0,0 +1,22 @@
+interface Foo : Object {
+       public void foo<T> (owned T bar) {
+              bar = null;
+       }
+}
+
+class Baz : Object, Foo {
+}
+
+void foo<T> (owned T bar) {
+       bar = null;
+}
+
+void main () {
+       var bar = new Object ();
+       foo<Object> (bar);
+       assert (bar.ref_count == 1);
+
+       var baz = new Baz ();
+       baz.foo<Object> (bar);
+       assert (baz.ref_count == 1);
+}