From 2c25e8d6f2dc334cfbd34b72a3dd866085d6b68c Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrg=20Billeter?= Date: Mon, 12 Oct 2009 21:25:49 +0200 Subject: [PATCH] posix: Fix array creation and destruction in POSIX profile Based on patch by pancake. --- codegen/valaccodearraymodule.vala | 17 +++++++++++++++-- codegen/valaccodebasemodule.vala | 12 ++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index da08cdff5..0d745b0dc 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -65,8 +65,15 @@ internal class Vala.CCodeArrayModule : CCodeMethodCallModule { return; } - var gnew = new CCodeFunctionCall (new CCodeIdentifier ("g_new0")); - gnew.add_argument (new CCodeIdentifier (expr.element_type.get_cname ())); + CCodeFunctionCall gnew; + if (context.profile == Profile.POSIX) { + source_declarations.add_include ("stdlib.h"); + gnew = new CCodeFunctionCall (new CCodeIdentifier ("calloc")); + } else { + gnew = new CCodeFunctionCall (new CCodeIdentifier ("g_new0")); + gnew.add_argument (new CCodeIdentifier (expr.element_type.get_cname ())); + } + bool first = true; CCodeExpression cexpr = null; @@ -99,6 +106,12 @@ internal class Vala.CCodeArrayModule : CCodeMethodCallModule { gnew.add_argument (cexpr); + if (context.profile == Profile.POSIX) { + var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof")); + csizeof.add_argument (new CCodeIdentifier (expr.element_type.get_cname ())); + gnew.add_argument (csizeof); + } + if (expr.initializer_list != null) { var ce = new CCodeCommaExpression (); var temp_var = get_temp_variable (expr.value_type, true, expr); diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 5d440e794..f88bc27d6 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -2470,9 +2470,17 @@ internal class Vala.CCodeBaseModule : CCodeModule { return new CCodeIdentifier (func_name); } } else if (type is ArrayType) { - return new CCodeIdentifier ("g_free"); + if (context.profile == Profile.POSIX) { + return new CCodeIdentifier ("free"); + } else { + return new CCodeIdentifier ("g_free"); + } } else if (type is PointerType) { - return new CCodeIdentifier ("g_free"); + if (context.profile == Profile.POSIX) { + return new CCodeIdentifier ("free"); + } else { + return new CCodeIdentifier ("g_free"); + } } else { return new CCodeConstant ("NULL"); } -- 2.47.3