fix memory management when mixing pointers and strong references, fixes
authorJuerg Billeter <j@bitron.ch>
Mon, 7 Apr 2008 19:50:22 +0000 (19:50 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Mon, 7 Apr 2008 19:50:22 +0000 (19:50 +0000)
2008-04-07  Juerg Billeter  <j@bitron.ch>

* vala/valamemorymanager.vala, vala/valasemanticanalyzer.vala,
  gobject/valaccodegenerator.vala: fix memory management when
  mixing pointers and strong references, fixes bug 522110

svn path=/trunk/; revision=1179

ChangeLog
gobject/valaccodegenerator.vala
vala/valamemorymanager.vala
vala/valasemanticanalyzer.vala

index 5e7b1c2..d845867 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2008-04-07  Jürg Billeter  <j@bitron.ch>
 
+       * vala/valamemorymanager.vala, vala/valasemanticanalyzer.vala,
+         gobject/valaccodegenerator.vala: fix memory management when
+         mixing pointers and strong references, fixes bug 522110
+
+2008-04-07  Jürg Billeter  <j@bitron.ch>
+
        * vala/valasymbolresolver.vala: reset takes_ownership and
          transfers_ownership for base types of pointer types
 
index 5486957..f20c6d6 100644 (file)
@@ -1220,6 +1220,9 @@ public class Vala.CCodeGenerator : CodeGenerator {
                } else if (type is ArrayType) {
                        Report.error (type.source_reference, "internal error: duplicating %s instances not yet supported".printf (type.to_string ()));
                        return null;
+               } else if (type is PointerType) {
+                       var pointer_type = (PointerType) type;
+                       return get_dup_func_expression (pointer_type.base_type);
                } else {
                        return new CCodeConstant ("NULL");
                }
index 4dd84dd..92043f5 100644 (file)
@@ -41,18 +41,17 @@ public class Vala.MemoryManager : CodeVisitor {
        }
        
        private void visit_possibly_leaked_expression (Expression! expr) {
-               if (expr.static_type != null &&
-                   expr.static_type.is_reference_type_or_type_parameter () &&
-                   expr.static_type.transfers_ownership) {
+               if (expr.static_type != null
+                   && expr.static_type.transfers_ownership) {
                        /* mark reference as leaked */
                        expr.ref_leaked = true;
                }
        }
 
        private void visit_possibly_missing_copy_expression (Expression! expr) {
-               if (expr.static_type != null &&
-                   expr.static_type.is_reference_type_or_type_parameter () &&
-                   !expr.static_type.transfers_ownership) {
+               if (expr.static_type != null
+                   && !expr.static_type.transfers_ownership
+                   && !(expr.static_type is NullType)) {
                        /* mark reference as missing */
                        expr.ref_missing = true;
                }
@@ -216,7 +215,11 @@ public class Vala.MemoryManager : CodeVisitor {
        public override void visit_array_creation_expression (ArrayCreationExpression! e) {
                if (e.initializer_list != null) {
                        foreach (Expression init in e.initializer_list.get_initializers ()) {
-                               visit_possibly_missing_copy_expression (init);
+                               if (init.static_type.is_reference_type_or_type_parameter ()) {
+                                       visit_possibly_missing_copy_expression (init);
+                               } else {
+                                       visit_possibly_leaked_expression (init);
+                               }
                        }
                }
        }
index d8b57ab..0fe7bee 100644 (file)
@@ -2500,7 +2500,8 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                        return;
                }
 
-               if (!expr.inner.static_type.takes_ownership) {
+               if (!expr.inner.static_type.takes_ownership
+                   && !(expr.inner.static_type is PointerType)) {
                        expr.error = true;
                        Report.error (expr.source_reference, "No reference to be transferred");
                        return;