[vala] dova: Fix delegates with generic return types
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] dova: Fix delegates with generic return types
- Date: Sat, 10 Jul 2010 14:02:48 +0000 (UTC)
commit 07aa404e94e3605681b3f8c85ec663634a1cc17e
Author: Jürg Billeter <j bitron ch>
Date: Sat Jul 10 15:35:09 2010 +0200
dova: Fix delegates with generic return types
codegen/valadovabasemodule.vala | 25 +++++++++++++++++++------
codegen/valadovadelegatemodule.vala | 24 ++++++++++++++++++++----
codegen/valadovamethodcallmodule.vala | 4 ++--
vala/valalambdaexpression.vala | 3 ++-
4 files changed, 43 insertions(+), 13 deletions(-)
---
diff --git a/codegen/valadovabasemodule.vala b/codegen/valadovabasemodule.vala
index 49a7759..94cce07 100644
--- a/codegen/valadovabasemodule.vala
+++ b/codegen/valadovabasemodule.vala
@@ -2285,14 +2285,27 @@ internal class Vala.DovaBaseModule : CCodeModule {
}
wrapper.block = new CCodeBlock ();
- if (d.return_type is GenericType) {
- wrapper.add_parameter (new CCodeFormalParameter ("result", "void *"));
- wrapper.block.add_statement (new CCodeExpressionStatement (call));
- } else if (d.return_type is VoidType) {
+ if (d.return_type is VoidType) {
wrapper.block.add_statement (new CCodeExpressionStatement (call));
} else {
- wrapper.return_type = d.return_type.get_cname ();
- wrapper.block.add_statement (new CCodeReturnStatement (call));
+ var method_return_type = method_type.method_symbol.return_type;
+ if (d.return_type is GenericType && !(method_return_type is GenericType)) {
+ wrapper.add_parameter (new CCodeFormalParameter ("result", method_return_type.get_cname () + "*"));
+ wrapper.block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result")), call)));
+ } else if (!(d.return_type is GenericType) && method_return_type is GenericType) {
+ wrapper.return_type = d.return_type.get_cname ();
+ var cdecl = new CCodeDeclaration (d.return_type.get_cname ());
+ cdecl.add_declarator (new CCodeVariableDeclarator ("result"));
+ call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("result")));
+ wrapper.block.add_statement (new CCodeExpressionStatement (call));
+ wrapper.block.add_statement (new CCodeReturnStatement (new CCodeIdentifier ("result")));
+ } else if (d.return_type is GenericType) {
+ wrapper.add_parameter (new CCodeFormalParameter ("result", "void *"));
+ wrapper.block.add_statement (new CCodeExpressionStatement (call));
+ } else {
+ wrapper.return_type = d.return_type.get_cname ();
+ wrapper.block.add_statement (new CCodeReturnStatement (call));
+ }
}
source_type_member_definition.append (wrapper);
diff --git a/codegen/valadovadelegatemodule.vala b/codegen/valadovadelegatemodule.vala
index c82f4c5..41edade 100644
--- a/codegen/valadovadelegatemodule.vala
+++ b/codegen/valadovadelegatemodule.vala
@@ -1,6 +1,6 @@
/* valadovadelegatemodule.vala
*
- * Copyright (C) 2006-2009 Jürg Billeter
+ * Copyright (C) 2006-2010 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -92,7 +92,7 @@ internal class Vala.DovaDelegateModule : DovaValueModule {
}
CCodeFunction generate_invoke_function (Delegate d, CCodeDeclarationSpace decl_space) {
- var function = new CCodeFunction ("%s_invoke".printf (d.get_lower_case_cname ()), d.return_type.get_cname ());
+ var function = new CCodeFunction ("%s_invoke".printf (d.get_lower_case_cname ()));
if (d.is_private_symbol ()) {
function.modifiers |= CCodeModifiers.STATIC;
@@ -113,6 +113,17 @@ internal class Vala.DovaDelegateModule : DovaValueModule {
param_list += param.parameter_type.get_cname ();
}
+ if (d.return_type is GenericType) {
+ function.add_parameter (new CCodeFormalParameter ("result", "void *"));
+
+ if (param_list != "") {
+ param_list += ", ";
+ }
+ param_list += "void *";
+ } else {
+ function.return_type = d.return_type.get_cname ();
+ }
+
function.block = new CCodeBlock ();
var get_target = new CCodeFunctionCall (new CCodeIdentifier ("dova_delegate_get_target"));
@@ -133,7 +144,7 @@ internal class Vala.DovaDelegateModule : DovaValueModule {
instance_param_list += ")";
var instance_block = new CCodeBlock ();
- var instance_call = new CCodeFunctionCall (new CCodeCastExpression (new CCodeMemberAccess.pointer (priv, "method"), "%s (*) %s".printf (d.return_type.get_cname (), instance_param_list)));
+ var instance_call = new CCodeFunctionCall (new CCodeCastExpression (new CCodeMemberAccess.pointer (priv, "method"), "%s (*) %s".printf (function.return_type, instance_param_list)));
instance_call.add_argument (new CCodeIdentifier ("target"));
@@ -146,7 +157,7 @@ internal class Vala.DovaDelegateModule : DovaValueModule {
static_param_list += ")";
var static_block = new CCodeBlock ();
- var static_call = new CCodeFunctionCall (new CCodeCastExpression (new CCodeMemberAccess.pointer (priv, "method"), "%s (*) %s".printf (d.return_type.get_cname (), static_param_list)));
+ var static_call = new CCodeFunctionCall (new CCodeCastExpression (new CCodeMemberAccess.pointer (priv, "method"), "%s (*) %s".printf (function.return_type, static_param_list)));
foreach (FormalParameter param in d.get_parameters ()) {
instance_call.add_argument (new CCodeIdentifier (param.name));
@@ -156,6 +167,11 @@ internal class Vala.DovaDelegateModule : DovaValueModule {
if (d.return_type is VoidType) {
instance_block.add_statement (new CCodeExpressionStatement (instance_call));
static_block.add_statement (new CCodeExpressionStatement (static_call));
+ } else if (d.return_type is GenericType) {
+ instance_call.add_argument (new CCodeIdentifier ("result"));
+ static_call.add_argument (new CCodeIdentifier ("result"));
+ instance_block.add_statement (new CCodeExpressionStatement (instance_call));
+ static_block.add_statement (new CCodeExpressionStatement (static_call));
} else {
instance_block.add_statement (new CCodeReturnStatement (instance_call));
static_block.add_statement (new CCodeReturnStatement (static_call));
diff --git a/codegen/valadovamethodcallmodule.vala b/codegen/valadovamethodcallmodule.vala
index 53817ff..a17b84a 100644
--- a/codegen/valadovamethodcallmodule.vala
+++ b/codegen/valadovamethodcallmodule.vala
@@ -1,6 +1,6 @@
/* valadovamethodcallmodule.vala
*
- * Copyright (C) 2006-2009 Jürg Billeter
+ * Copyright (C) 2006-2010 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -205,7 +205,7 @@ internal class Vala.DovaMethodCallModule : DovaAssignmentModule {
ellipsis = true;
}
- if (m != null && m.return_type is GenericType) {
+ if (itype.get_return_type () is GenericType) {
var ccomma = new CCodeCommaExpression ();
var temp_var = get_temp_variable (expr.value_type);
diff --git a/vala/valalambdaexpression.vala b/vala/valalambdaexpression.vala
index ec6b9a1..2c5d0a6 100644
--- a/vala/valalambdaexpression.vala
+++ b/vala/valalambdaexpression.vala
@@ -133,7 +133,8 @@ public class Vala.LambdaExpression : Expression {
}
var cb = (Delegate) ((DelegateType) target_type).delegate_symbol;
- method = new Method (get_lambda_name (analyzer), cb.return_type, source_reference);
+ var return_type = cb.return_type.get_actual_type (target_type, null, this);
+ method = new Method (get_lambda_name (analyzer), return_type, source_reference);
// track usage for flow analyzer
method.used = true;
method.check_deprecated (source_reference);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]