]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
dova: Fix delegates with generic return types
authorJürg Billeter <j@bitron.ch>
Sat, 10 Jul 2010 13:35:09 +0000 (15:35 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 10 Jul 2010 13:55:08 +0000 (15:55 +0200)
codegen/valadovabasemodule.vala
codegen/valadovadelegatemodule.vala
codegen/valadovamethodcallmodule.vala
vala/valalambdaexpression.vala

index 49a7759a874a5cd1d01c4fe010770215f6ce179b..94cce071306832fa6c1b714a017e74600ad35713 100644 (file)
@@ -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);
index c82f4c5534f5d50693be7d5de5a4c8c1fc9ab683..41edadea3139818789bff27fd2bcd6e858a9faf8 100644 (file)
@@ -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));
index 53817ffad4a55a0aed5f9ac1815c8eab3b0681ad..a17b84a7c9ba2f19d1fa1556001002cb455e8d97 100644 (file)
@@ -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);
index ec6b9a148dff02202e1af31643cbb1a73f759e3a..2c5d0a69c4fbf8d4e609a65b69378c5f3824b629 100644 (file)
@@ -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);