summaryrefslogtreecommitdiff
path: root/codegen/valaccodedelegatemodule.vala
diff options
context:
space:
mode:
authorMaciej Piechotka <uzytkownik2@gmail.com>2013-08-23 18:24:18 +0200
committerMaciej Piechotka <uzytkownik2@gmail.com>2013-12-15 14:16:36 +0100
commitd7fcb230a1947bd569c3c4ea381eb608e5ab634e (patch)
tree7ee5ef05748111046338d02837c6a58cc3e0811a /codegen/valaccodedelegatemodule.vala
parent591340a3a06b9f25db7d1a5dba53270e543e55c1 (diff)
downloadvala-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.vala12
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) {