From: Rico Tzschichholz Date: Fri, 18 Oct 2019 22:12:26 +0000 (+0200) Subject: codegen: Use alternative for g_memdup in POSIX profile X-Git-Tag: 0.47.1~61 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6ac9b05833c369603a61b0152f04c80a39a3b42a;p=thirdparty%2Fvala.git codegen: Use alternative for g_memdup in POSIX profile --- diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 6a7ba9337..4e295c7c6 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -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