]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Add support for generic array duplication
authorLuca Bruno <lethalman88@gmail.com>
Wed, 24 Mar 2010 13:05:44 +0000 (14:05 +0100)
committerJürg Billeter <j@bitron.ch>
Wed, 24 Mar 2010 20:16:05 +0000 (21:16 +0100)
Fixes bug 613745.

codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala

index df8ee4d493dada7469d7ade35e0bad18ad67a37e..093605db8263fe8cab2ca6946ea0fd5e6dcab8c6 100644 (file)
@@ -775,6 +775,11 @@ internal class Vala.CCodeArrayModule : CCodeMethodCallModule {
                function.add_parameter (new CCodeFormalParameter ("self", array_type.get_cname ()));
                // total length over all dimensions
                function.add_parameter (new CCodeFormalParameter ("length", "int"));
+               if (array_type.element_type is GenericType) {
+                       // dup function array elements
+                       string func_name = "%s_dup_func".printf (array_type.element_type.type_parameter.name.down ());
+                       function.add_parameter (new CCodeFormalParameter (func_name, "GBoxedCopyFunc"));
+               }
 
                // definition
 
index c937531ea81f7c1c150204926faadbb8b44f671b..1e7175d42d143082fc78ea7504f3cdc9448eb929 100644 (file)
@@ -2333,7 +2333,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
        }
 
        bool is_in_generic_type (DataType type) {
-               if (type.type_parameter.parent_symbol is TypeSymbol
+               if (current_symbol != null && type.type_parameter.parent_symbol is TypeSymbol
                    && (current_method == null || current_method.binding == MemberBinding.INSTANCE)) {
                        return true;
                } else {
@@ -3832,6 +3832,14 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                                }
 
                                ccall.add_argument (csizeexpr);
+
+                               if (array_type.element_type is GenericType) {
+                                       var elem_dupexpr = get_dup_func_expression (array_type.element_type, node.source_reference);
+                                       if (elem_dupexpr == null) {
+                                               elem_dupexpr = new CCodeConstant ("NULL");
+                                       }
+                                       ccall.add_argument (elem_dupexpr);
+                               }
                        }
 
                        var ccomma = new CCodeCommaExpression ();