]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use alternative for g_memdup 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

index 6a7ba933748298c2e0efb9b6a2ae6a5501aa7b65..4e295c7c67a717bcdd1b4c4c00413c7e579489d8 100644 (file)
@@ -555,14 +555,34 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
 
                        ccode.add_return (new CCodeIdentifier ("result"));
                } else {
-                       var dup_call = new CCodeFunctionCall (new CCodeIdentifier ("g_memdup"));
-                       dup_call.add_argument (new CCodeIdentifier ("self"));
-
                        var sizeof_call = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
                        sizeof_call.add_argument (new CCodeIdentifier (get_ccode_name (array_type.element_type)));
-                       dup_call.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeIdentifier ("length"), sizeof_call));
+                       var length_expr = new CCodeIdentifier ("length");
+
+                       if (context.profile == Profile.POSIX) {
+                               cfile.add_include ("stdlib.h");
+                               var alloc = new CCodeFunctionCall (new CCodeIdentifier ("calloc"));
+                               alloc.add_argument (length_expr);
+                               alloc.add_argument (sizeof_call);
 
-                       ccode.add_return (dup_call);
+                               var cvardecl = new CCodeVariableDeclarator ("result");
+                               ccode.add_declaration (get_ccode_name (array_type), cvardecl);
+                               ccode.add_assignment (new CCodeIdentifier ("result"), alloc);
+
+                               var dup_call = new CCodeFunctionCall (new CCodeIdentifier ("memcpy"));
+                               dup_call.add_argument (new CCodeIdentifier ("result"));
+                               dup_call.add_argument (new CCodeIdentifier ("self"));
+                               dup_call.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, length_expr, sizeof_call));
+                               ccode.add_expression (dup_call);
+
+                               ccode.add_return (new CCodeIdentifier ("result"));
+                       } else {
+                               var dup_call = new CCodeFunctionCall (new CCodeIdentifier ("g_memdup"));
+                               dup_call.add_argument (new CCodeIdentifier ("self"));
+                               dup_call.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, length_expr, sizeof_call));
+
+                               ccode.add_return (dup_call);
+                       }
                }
 
                // append to file