]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
GValue: Support implicit conversion to nullable GValue
authorFrederik Sdun <frederik.sdun@googlemail.com>
Tue, 28 Jul 2009 13:28:40 +0000 (15:28 +0200)
committerJürg Billeter <j@bitron.ch>
Tue, 28 Jul 2009 13:29:55 +0000 (15:29 +0200)
Fixes bug 589155.

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/structs/gvalue.test [new file with mode: 0644]

index 572fbb8627a67fce0ca0101a02853b9853d4c6ae..2ac63ba47bcc4b6c29bfbdb4d92fe421a1fe8b54 100644 (file)
@@ -3683,13 +3683,31 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 
                        var ccomma = new CCodeCommaExpression ();
 
+                       if (target_type.nullable) {
+                               var newcall = new CCodeFunctionCall (new CCodeIdentifier ("g_new0"));
+                               newcall.add_argument (new CCodeConstant ("GValue"));
+                               newcall.add_argument (new CCodeConstant ("1"));
+                               var newassignment = new CCodeAssignment (get_variable_cexpression (decl.name), newcall);
+                               ccomma.append_expression (newassignment);
+                       }
+
                        var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_init"));
-                       ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (decl.name)));
+                       if (target_type.nullable) {
+                               ccall.add_argument (get_variable_cexpression (decl.name));
+                       }
+                       else {
+                               ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (decl.name)));
+                       }
                        ccall.add_argument (new CCodeIdentifier (expression_type.get_type_id ()));
                        ccomma.append_expression (ccall);
 
                        ccall = new CCodeFunctionCall (get_value_setter_function (expression_type));
-                       ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (decl.name)));
+                       if (target_type.nullable) {
+                               ccall.add_argument (get_variable_cexpression (decl.name));
+                       }
+                       else {
+                               ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression (decl.name)));
+                       }
                        ccall.add_argument (cexpr);
                        ccomma.append_expression (ccall);
 
index 2d69f96d5a33ac401a229e7cf537a7ac653f8c12..c5599ab3acdf55342f657579449f8a47c5324701 100644 (file)
@@ -29,6 +29,7 @@ TESTS = \
        control-flow/sideeffects.test \
        enums/enums.test \
        structs/structs.test \
+       structs/gvalue.test \
        delegates/delegates.test \
        objects/classes.test \
        objects/fields.test \
diff --git a/tests/structs/gvalue.test b/tests/structs/gvalue.test
new file mode 100644 (file)
index 0000000..8bd7c42
--- /dev/null
@@ -0,0 +1,59 @@
+
+Program: test
+
+void test_value () {
+       Value v1 = 1;
+       assert (v1.get_int() == 1);
+
+       string s = "hello";
+       Value v2 = s;
+       assert (v2.get_string () == s);
+}
+
+void test_value_array () {
+       int[] iarray = {1,2,3,4,5};
+       Value[] viarray = {1,2,3,4,5};
+       assert (viarray.length == iarray.length);
+       for (int i = 0; i < viarray.length; i++) {
+               assert (viarray[i].get_int () == iarray[i]);
+       }
+
+       string[] sarray = { "hello", "vala", "world" };
+       Value[] vsarray = { "hello", "vala", "world" };
+       assert (vsarray.length == sarray.length);
+       for (int i = 0; i < vsarray.length; i++) {
+               assert (vsarray[i].get_string () == sarray[i]);
+       }
+}
+
+void test_nullable_value () {
+       Value? v1 = 1;
+       assert (v1.get_int() == 1);
+
+       string s = "hello";
+       Value? v2 = s;
+       assert (v2.get_string () == s);
+}
+
+void test_nullable_value_array () {
+       int[] iarray = {1,2,3,4,5};
+       Value?[] viarray = {1,2,3,4,5};
+       assert (viarray.length == iarray.length);
+       for (int i = 0; i < viarray.length; i++) {
+               assert (viarray[i].get_int () == iarray[i]);
+       }
+
+       string[] sarray = { "hello", "vala", "world" };
+       Value?[] vsarray = { "hello", "vala", "world" };
+       assert (vsarray.length == sarray.length);
+       for (int i = 0; i < vsarray.length; i++) {
+               assert (vsarray[i].get_string () == sarray[i]);
+       }
+}
+
+void main () {
+       test_value ();
+       test_value_array ();
+       test_nullable_value ();
+       test_nullable_value_array ();
+}