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
} 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");
}
}
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;
}
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);
+ }
}
}
}
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;