From: Jürg Billeter Date: Fri, 23 Jan 2009 14:20:15 +0000 (+0000) Subject: Add virtual generate_parameter method. Move array and delegate type X-Git-Tag: 0.5.7~73 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=957d11cefd3526e85bf3c1ac54479c26ef7a62bb;p=thirdparty%2Fvala.git Add virtual generate_parameter method. Move array and delegate type 2009-01-23 Jürg Billeter * gobject/valaccodearraymodule.vala: * gobject/valaccodedelegatemodule.vala: * gobject/valaccodemethodmodule.vala: Add virtual generate_parameter method. Move array and delegate type specific parameter generation to corresponding modules. svn path=/trunk/; revision=2397 --- diff --git a/ChangeLog b/ChangeLog index 762a0ebbb..182b0d9b8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-01-23 Jürg Billeter + + * gobject/valaccodearraymodule.vala: + * gobject/valaccodedelegatemodule.vala: + * gobject/valaccodemethodmodule.vala: + + Add virtual generate_parameter method. Move array and delegate type + specific parameter generation to corresponding modules. + 2009-01-20 Jürg Billeter * vapigen/valagirparser.vala: diff --git a/gobject/valaccodearraymodule.vala b/gobject/valaccodearraymodule.vala index f3f2f5154..a9c9b799d 100644 --- a/gobject/valaccodearraymodule.vala +++ b/gobject/valaccodearraymodule.vala @@ -682,4 +682,33 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { assignment.ccodenode = ccall; } + + public override void generate_parameter (FormalParameter param, Map cparam_map, Map? carg_map) { + if (!(param.parameter_type is ArrayType)) { + base.generate_parameter (param, cparam_map, carg_map); + return; + } + + var array_type = (ArrayType) param.parameter_type; + + cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode); + if (carg_map != null) { + carg_map.set (get_param_pos (param.cparameter_position), new CCodeIdentifier (param.name)); + } + + if (!param.no_array_length) { + var length_ctype = "int"; + if (param.direction != ParameterDirection.IN) { + length_ctype = "int*"; + } + + for (int dim = 1; dim <= array_type.rank; dim++) { + var cparam = new CCodeFormalParameter (head.get_array_length_cname (param.name, dim), length_ctype); + cparam_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), cparam); + if (carg_map != null) { + carg_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), new CCodeIdentifier (cparam.name)); + } + } + } + } } diff --git a/gobject/valaccodedelegatemodule.vala b/gobject/valaccodedelegatemodule.vala index 0a4fac8d1..033547938 100644 --- a/gobject/valaccodedelegatemodule.vala +++ b/gobject/valaccodedelegatemodule.vala @@ -380,4 +380,41 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule { return wrapper_name; } + + public override void generate_parameter (FormalParameter param, Map cparam_map, Map? carg_map) { + if (!(param.parameter_type is DelegateType || param.parameter_type is MethodType)) { + base.generate_parameter (param, cparam_map, carg_map); + return; + } + + cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode); + if (carg_map != null) { + carg_map.set (get_param_pos (param.cparameter_position), new CCodeIdentifier (param.name)); + } + + if (param.parameter_type is DelegateType) { + var deleg_type = (DelegateType) param.parameter_type; + var d = deleg_type.delegate_symbol; + if (d.has_target) { + var cparam = new CCodeFormalParameter (get_delegate_target_cname (param.name), "void*"); + cparam_map.set (get_param_pos (param.cdelegate_target_parameter_position), cparam); + if (carg_map != null) { + carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), new CCodeIdentifier (cparam.name)); + } + if (deleg_type.value_owned) { + cparam = new CCodeFormalParameter (get_delegate_target_destroy_notify_cname (param.name), "GDestroyNotify"); + cparam_map.set (get_param_pos (param.cdelegate_target_parameter_position + 0.01), cparam); + if (carg_map != null) { + carg_map.set (get_param_pos (param.cdelegate_target_parameter_position + 0.01), new CCodeIdentifier (cparam.name)); + } + } + } + } else if (param.parameter_type is MethodType) { + var cparam = new CCodeFormalParameter (get_delegate_target_cname (param.name), "void*"); + cparam_map.set (get_param_pos (param.cdelegate_target_parameter_position), cparam); + if (carg_map != null) { + carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), new CCodeIdentifier (cparam.name)); + } + } + } } diff --git a/gobject/valaccodemethodmodule.vala b/gobject/valaccodemethodmodule.vala index 9f7817ebe..a0d8603d3 100644 --- a/gobject/valaccodemethodmodule.vala +++ b/gobject/valaccodemethodmodule.vala @@ -515,6 +515,13 @@ public class Vala.CCodeMethodModule : CCodeStructModule { } } + public virtual void generate_parameter (FormalParameter param, Map cparam_map, Map? carg_map) { + cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode); + if (carg_map != null) { + carg_map.set (get_param_pos (param.cparameter_position), new CCodeIdentifier (param.name)); + } + } + public override void generate_cparameters (Method m, DataType creturn_type, bool in_gtypeinstance_creation_method, Map cparam_map, CCodeFunction func, CCodeFunctionDeclarator? vdeclarator = null, Map? carg_map = null, CCodeFunctionCall? vcall = null, int direction = 3) { if (m.parent_symbol is Class && m is CreationMethod) { var cl = (Class) m.parent_symbol; @@ -588,52 +595,7 @@ public class Vala.CCodeMethodModule : CCodeStructModule { } } - if (!param.no_array_length && param.parameter_type is ArrayType) { - var array_type = (ArrayType) param.parameter_type; - - var length_ctype = "int"; - if (param.direction != ParameterDirection.IN) { - length_ctype = "int*"; - } - - for (int dim = 1; dim <= array_type.rank; dim++) { - var cparam = new CCodeFormalParameter (head.get_array_length_cname (param.name, dim), length_ctype); - cparam_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), cparam); - if (carg_map != null) { - carg_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), new CCodeIdentifier (cparam.name)); - } - } - } - - cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode); - if (carg_map != null) { - carg_map.set (get_param_pos (param.cparameter_position), new CCodeIdentifier (param.name)); - } - - if (param.parameter_type is DelegateType) { - var deleg_type = (DelegateType) param.parameter_type; - var d = deleg_type.delegate_symbol; - if (d.has_target) { - var cparam = new CCodeFormalParameter (get_delegate_target_cname (param.name), "void*"); - cparam_map.set (get_param_pos (param.cdelegate_target_parameter_position), cparam); - if (carg_map != null) { - carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), new CCodeIdentifier (cparam.name)); - } - if (deleg_type.value_owned) { - cparam = new CCodeFormalParameter (get_delegate_target_destroy_notify_cname (param.name), "GDestroyNotify"); - cparam_map.set (get_param_pos (param.cdelegate_target_parameter_position + 0.01), cparam); - if (carg_map != null) { - carg_map.set (get_param_pos (param.cdelegate_target_parameter_position + 0.01), new CCodeIdentifier (cparam.name)); - } - } - } - } else if (param.parameter_type is MethodType) { - var cparam = new CCodeFormalParameter (get_delegate_target_cname (param.name), "void*"); - cparam_map.set (get_param_pos (param.cdelegate_target_parameter_position), cparam); - if (carg_map != null) { - carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), new CCodeIdentifier (cparam.name)); - } - } + generate_parameter (param, cparam_map, carg_map); } if ((direction & 2) != 0) {