]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use alternative for g_new0 in POSIX profile
authorRico Tzschichholz <ricotz@ubuntu.com>
Fri, 18 Oct 2019 22:12:26 +0000 (00:12 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 19 Oct 2019 08:20:52 +0000 (10:20 +0200)
codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala

index e71f41d70e8ba0ff1182d04999cb42ef32843aad..2d122035f98aafd9d2cb7a9f4d68b80bedd81d20 100644 (file)
@@ -519,8 +519,14 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
 
                if (requires_copy (array_type.element_type)) {
                        var cvardecl = new CCodeVariableDeclarator ("result");
-                       var gnew = new CCodeFunctionCall (new CCodeIdentifier ("g_new0"));
-                       gnew.add_argument (new CCodeIdentifier (get_ccode_name (array_type.element_type)));
+                       CCodeFunctionCall gnew;
+                       if (context.profile == Profile.POSIX) {
+                               cfile.add_include ("stdlib.h");
+                               gnew = new CCodeFunctionCall (new CCodeIdentifier ("calloc"));
+                       } else {
+                               gnew = new CCodeFunctionCall (new CCodeIdentifier ("g_new0"));
+                               gnew.add_argument (new CCodeIdentifier (get_ccode_name (array_type.element_type)));
+                       }
 
                        CCodeExpression length_expr = new CCodeIdentifier ("length");
                        // add extra item to have array NULL-terminated for all reference types
@@ -529,6 +535,12 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        }
                        gnew.add_argument (length_expr);
 
+                       if (context.profile == Profile.POSIX) {
+                               var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
+                               csizeof.add_argument (new CCodeIdentifier (get_ccode_name (array_type.element_type)));
+                               gnew.add_argument (csizeof);
+                       }
+
                        ccode.add_declaration (get_ccode_name (array_type), cvardecl);
                        ccode.add_assignment (new CCodeIdentifier ("result"), gnew);
 
index d3f4f416db7f2087ab89aefdae6cf1a721e7b7e9..cc737edd8158fc58cb8ac8fd3eb44b95eedf7ef7 100644 (file)
@@ -3040,9 +3040,19 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                } else {
                        ccode.add_declaration (get_ccode_name (value_type), new CCodeVariableDeclarator ("dup"));
 
-                       var creation_call = new CCodeFunctionCall (new CCodeIdentifier ("g_new0"));
-                       creation_call.add_argument (new CCodeConstant (get_ccode_name (value_type.type_symbol)));
-                       creation_call.add_argument (new CCodeConstant ("1"));
+                       CCodeFunctionCall creation_call;
+                       if (context.profile == Profile.POSIX) {
+                               cfile.add_include ("stdlib.h");
+                               creation_call = new CCodeFunctionCall (new CCodeIdentifier ("calloc"));
+                               creation_call.add_argument (new CCodeConstant ("1"));
+                               var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
+                               csizeof.add_argument (new CCodeIdentifier (get_ccode_name (value_type.type_symbol)));
+                               creation_call.add_argument (csizeof);
+                       } else {
+                               creation_call = new CCodeFunctionCall (new CCodeIdentifier ("g_new0"));
+                               creation_call.add_argument (new CCodeIdentifier (get_ccode_name (value_type.type_symbol)));
+                               creation_call.add_argument (new CCodeConstant ("1"));
+                       }
                        ccode.add_assignment (new CCodeIdentifier ("dup"), creation_call);
 
                        var st = value_type.type_symbol as Struct;