diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2021-01-28 12:12:53 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2021-01-28 13:00:24 +0100 |
commit | 932965b4e630e78ebff50bad95dcff6494832a19 (patch) | |
tree | e050e8037a80d66635b815574f6e2d695a1b113d /codegen/valaccodemethodmodule.vala | |
parent | 2e798fc3f8e9af25a4c231c2561894d9f0a0be50 (diff) | |
download | vala-932965b4e630e78ebff50bad95dcff6494832a19.tar.gz |
Add further support for params arrays in constructors
In addition to 98ab3da89640b8b8a6c67044b4df1194672774bb
See https://gitlab.gnome.org/GNOME/vala/issues/128
Diffstat (limited to 'codegen/valaccodemethodmodule.vala')
-rw-r--r-- | codegen/valaccodemethodmodule.vala | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala index c14d76120..ae05c917a 100644 --- a/codegen/valaccodemethodmodule.vala +++ b/codegen/valaccodemethodmodule.vala @@ -539,7 +539,7 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule { foreach (Parameter param in m.get_parameters ()) { if (param.ellipsis || param.params_array) { if (param.params_array) { - append_params_array (m.params_array_var); + append_params_array (m); } break; } @@ -885,6 +885,8 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule { cparam.modifiers = CCodeModifiers.FORMAT_ARG; } } else { + var va_list_name = "_vala_va_list"; + // Add _first_* parameter for the params array parameter if (param.params_array) { var param_type = ((ArrayType) param.variable_type).element_type; @@ -908,10 +910,12 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule { cparam = new CCodeParameter ("_first_%s".printf (get_ccode_name (param)), ctypename); cparam_map.set (get_param_pos (get_ccode_pos (param), false), cparam); + + va_list_name = "_va_list_%s".printf (get_ccode_name (param)); } if (ellipses_to_valist) { - cparam = new CCodeParameter ("_vala_va_list", "va_list"); + cparam = new CCodeParameter (va_list_name, "va_list"); } else { cparam = new CCodeParameter.with_ellipsis (); } @@ -1287,9 +1291,16 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule { } } + var carg = carg_map.get (second_last_pos); + if (carg == null) { + // params arrays have an implicit first argument, refer to the cparameter name + carg = new CCodeIdentifier (cparam_map.get (second_last_pos).name); + vcall.add_argument (carg); + } + var va_start = new CCodeFunctionCall (new CCodeIdentifier ("va_start")); va_start.add_argument (new CCodeIdentifier ("_vala_va_list_obj")); - va_start.add_argument (carg_map.get (second_last_pos)); + va_start.add_argument (carg); ccode.add_declaration ("va_list", new CCodeVariableDeclarator ("_vala_va_list_obj")); ccode.add_expression (va_start); |