diff options
author | Maciej Piechotka <uzytkownik2@gmail.com> | 2013-08-23 18:24:18 +0200 |
---|---|---|
committer | Maciej Piechotka <uzytkownik2@gmail.com> | 2013-12-15 14:16:36 +0100 |
commit | d7fcb230a1947bd569c3c4ea381eb608e5ab634e (patch) | |
tree | 7ee5ef05748111046338d02837c6a58cc3e0811a /codegen/valaccodedelegatemodule.vala | |
parent | 591340a3a06b9f25db7d1a5dba53270e543e55c1 (diff) | |
download | vala-d7fcb230a1947bd569c3c4ea381eb608e5ab634e.tar.gz |
Handle the integers and enums in generic closure wrapper
Handle edge-case when the one of generic parameters of delegate is an
integer in closure or method.
Diffstat (limited to 'codegen/valaccodedelegatemodule.vala')
-rw-r--r-- | codegen/valaccodedelegatemodule.vala | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/codegen/valaccodedelegatemodule.vala b/codegen/valaccodedelegatemodule.vala index cf367a52e..744f63a1d 100644 --- a/codegen/valaccodedelegatemodule.vala +++ b/codegen/valaccodedelegatemodule.vala @@ -290,6 +290,9 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule { CCodeExpression arg; if (d.has_target) { arg = new CCodeIdentifier ("self"); + if (!m.closure && m.this_parameter != null) { + arg = convert_from_generic_pointer (arg, m.this_parameter.variable_type); + } } else { // use first delegate parameter as instance if (d_params.size == 0 || m.closure) { @@ -316,6 +319,9 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule { CCodeExpression arg; arg = new CCodeIdentifier (get_variable_cname (d_params.get (i).name)); + if (d_params.get (i).variable_type is GenericType) { + arg = convert_from_generic_pointer (arg, param.variable_type); + } carg_map.set (get_param_pos (get_ccode_pos (param)), arg); // handle array arguments @@ -405,7 +411,11 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule { if (m.return_type is VoidType || m.return_type.is_real_non_null_struct_type ()) { ccode.add_expression (ccall); } else { - ccode.add_declaration (return_type_cname, new CCodeVariableDeclarator ("result", ccall)); + CCodeExpression result = ccall; + if (d.return_type is GenericType) { + result = convert_to_generic_pointer (result, m.return_type); + } + ccode.add_declaration (return_type_cname, new CCodeVariableDeclarator ("result", result)); } if (d.has_target /* TODO: && dt.value_owned */ && dt.is_called_once) { |