From: Juerg Billeter Date: Mon, 7 Apr 2008 19:50:22 +0000 (+0000) Subject: fix memory management when mixing pointers and strong references, fixes X-Git-Tag: VALA_0_2_0~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fde71f7952b7ee69f38a0d6a9b02dba6276169e4;p=platform%2Fupstream%2Fvala.git fix memory management when mixing pointers and strong references, fixes 2008-04-07 Juerg Billeter * 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 --- diff --git a/ChangeLog b/ChangeLog index 5e7b1c2..d845867 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2008-04-07 Jürg Billeter + * 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 + * vala/valasymbolresolver.vala: reset takes_ownership and transfers_ownership for base types of pointer types diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index 5486957..f20c6d6 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -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"); } diff --git a/vala/valamemorymanager.vala b/vala/valamemorymanager.vala index 4dd84dd..92043f5 100644 --- a/vala/valamemorymanager.vala +++ b/vala/valamemorymanager.vala @@ -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); + } } } } diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index d8b57ab..0fe7bee 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -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;