]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix handling of const types, fixes bug 529851
authorJuerg Billeter <j@bitron.ch>
Sat, 26 Apr 2008 14:11:16 +0000 (14:11 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sat, 26 Apr 2008 14:11:16 +0000 (14:11 +0000)
2008-04-26  Juerg Billeter  <j@bitron.ch>

* vala/valaarraytype.vala:
* vala/valaclassinstancetype.vala:
* vala/valaclasstype.vala:
* vala/valadatatype.vala:
* vala/valadelegatetype.vala:
* vala/valaerrortype.vala:
* vala/valainterfaceinstancetype.vala:
* vala/valainterfacetype.vala:
* vala/valamethodtype.vala:
* vala/valanulltype.vala:
* vala/valapointertype.vala:
* vala/valasemanticanalyzer.vala:
* vala/valasymbolresolver.vala:
* vala/valatypeparametertype.vala:
* vala/valavaluetype.vala:
* vala/valavoidtype.vala:
* gobject/valaccodegenerator.vala:

Fix handling of const types, fixes bug 529851

svn path=/trunk/; revision=1322

18 files changed:
ChangeLog
gobject/valaccodegenerator.vala
vala/valaarraytype.vala
vala/valaclassinstancetype.vala
vala/valaclasstype.vala
vala/valadatatype.vala
vala/valadelegatetype.vala
vala/valaerrortype.vala
vala/valainterfaceinstancetype.vala
vala/valainterfacetype.vala
vala/valamethodtype.vala
vala/valanulltype.vala
vala/valapointertype.vala
vala/valasemanticanalyzer.vala
vala/valasymbolresolver.vala
vala/valatypeparametertype.vala
vala/valavaluetype.vala
vala/valavoidtype.vala

index 306a9e39b9f5b96ab0d8c605cc3a5893f77427aa..2214f0d7902709dcbdfb966290f04b7d13442c40 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2008-04-26  Jürg Billeter  <j@bitron.ch>
+
+       * vala/valaarraytype.vala:
+       * vala/valaclassinstancetype.vala:
+       * vala/valaclasstype.vala:
+       * vala/valadatatype.vala:
+       * vala/valadelegatetype.vala:
+       * vala/valaerrortype.vala:
+       * vala/valainterfaceinstancetype.vala:
+       * vala/valainterfacetype.vala:
+       * vala/valamethodtype.vala:
+       * vala/valanulltype.vala:
+       * vala/valapointertype.vala:
+       * vala/valasemanticanalyzer.vala:
+       * vala/valasymbolresolver.vala:
+       * vala/valatypeparametertype.vala:
+       * vala/valavaluetype.vala:
+       * vala/valavoidtype.vala:
+       * gobject/valaccodegenerator.vala:
+
+       Fix handling of const types, fixes bug 529851
+
 2008-04-26  Marc-André Lureau  <marcandre.lureau@gmail.com>
 
        * gobject/valaccodedynamicmethodbinding.vala: fix dbus strv
index 75addc59e1b7bac893a14df0346c36db5a06c931..3bdd632b0419507f27a1aec1dfd3a8e7160d2bd8 100644 (file)
@@ -715,7 +715,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                p.accept_children (this);
 
                if (!p.ellipsis) {
-                       string ctypename = p.type_reference.get_cname (false, !p.type_reference.transfers_ownership);
+                       string ctypename = p.type_reference.get_cname ();
                        string cname = p.name;
 
                        // pass non-simple structs always by reference
@@ -778,7 +778,6 @@ public class Vala.CCodeGenerator : CodeGenerator {
                        this_type = new InterfaceInstanceType ((Interface) t);
                }
                var cselfparam = new CCodeFormalParameter ("self", this_type.get_cname ());
-               var cvalueparam = new CCodeFormalParameter ("value", prop.type_reference.get_cname (false, true));
 
                if (prop.is_abstract || prop.is_virtual) {
                        if (acc.readable) {
@@ -788,6 +787,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                        }
                        function.add_parameter (cselfparam);
                        if (acc.writable || acc.construction) {
+                               var cvalueparam = new CCodeFormalParameter ("value", acc.value_parameter.type_reference.get_cname ());
                                function.add_parameter (cvalueparam);
                        }
                        
@@ -877,11 +877,12 @@ public class Vala.CCodeGenerator : CodeGenerator {
                        function.add_parameter (cselfparam);
                        if (returns_real_struct) {
                                // return non simple structs as out parameter
-                               var coutparamname = "%s*".printf (prop.type_reference.get_cname (false, true));
+                               var coutparamname = "%s*".printf (prop.type_reference.get_cname ());
                                var coutparam = new CCodeFormalParameter ("value", coutparamname);
                                function.add_parameter (coutparam);
                        } else {
                                if (acc.writable || acc.construction) {
+                                       var cvalueparam = new CCodeFormalParameter ("value", acc.value_parameter.type_reference.get_cname ());
                                        function.add_parameter (cvalueparam);
                                }
                        }
@@ -1186,7 +1187,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                var cvar = new CCodeVariableDeclarator.with_initializer (get_variable_cname (local.name), rhs);
 
                var cfrag = new CCodeFragment ();
-               var cdecl = new CCodeDeclaration (local.variable_type.get_cname (false, !local.variable_type.takes_ownership));
+               var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
                cdecl.add_declarator (cvar);
                cfrag.append (cdecl);
 
@@ -1426,7 +1427,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
        
        private void append_temp_decl (CCodeFragment cfrag, Collection<LocalVariable> temp_vars) {
                foreach (LocalVariable local in temp_vars) {
-                       var cdecl = new CCodeDeclaration (local.variable_type.get_cname (true, !local.variable_type.takes_ownership));
+                       var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
                
                        var vardecl = new CCodeVariableDeclarator (local.name);
                        // sets #line
index 0f0545ea8ea6975a7831e84d0a92ab48c96e4b42..d7d89a2f9bd05955fe8a25a6b7657588f800c237 100644 (file)
@@ -129,7 +129,8 @@ public class Vala.ArrayType : ReferenceType {
                return result;
        }
 
-       public override string? get_cname (bool var_type, bool const_type) {
+       public override string? get_cname () {
+               // FIXME add support for [Immutable] or [Const] attribute to support arrays to const data
                return element_type.get_cname () + "*";
        }
 
index cbe7d410831b8e8ec3165024cc985348f52655d3..3b41ce5ade138e0e917274f392ea268cafcc2cb7 100644 (file)
@@ -51,4 +51,8 @@ public class Vala.ClassInstanceType : ReferenceType {
                
                return result;
        }
+
+       public override string? get_cname () {
+               return "%s*".printf (class_symbol.get_cname (!takes_ownership && !transfers_ownership));
+       }
 }
index de611b5bc82c9f5bd1b2c01c81f3604b46cdcb87..043cc6d438081d5def66d8e943b09e131b5e85e8 100644 (file)
@@ -51,7 +51,7 @@ public class Vala.ClassType : ReferenceType {
                return result;
        }
 
-       public override string? get_cname (bool var_type, bool const_type) {
+       public override string? get_cname () {
                return "%sClass*".printf (class_symbol.get_cname ());
        }
 }
index adb0ec7d447ef46fe10e74b7f30be429a89de152..cd934505e3a1dfdd5db29cbdc8d7b9f418b3f78b 100644 (file)
@@ -108,34 +108,10 @@ public abstract class Vala.DataType : CodeNode {
         *
         * @return the type string to be used in C code
         */
-       public virtual string? get_cname (bool var_type = false, bool const_type = false) {
-               if (data_type == null && type_parameter == null) {
-                       if (var_type) {
-                               return "gpointer";
-                       } else {
-                               return "void";
-                       }
-               }
-               
-               string ptr;
-               if (type_parameter != null || !data_type.is_reference_type ()) {
-                       ptr = "";
-               } else {
-                       ptr = "*";
-               }
-               if (data_type != null) {
-                       return data_type.get_cname (const_type) + ptr;
-               } else if (type_parameter != null) {
-                       if (const_type) {
-                               return "gconstpointer";
-                       } else {
-                               return "gpointer";
-                       }
-               } else {
-                       /* raise error */
-                       Report.error (source_reference, "unresolved type reference");
-                       return null;
-               }
+       public virtual string? get_cname () {
+               // raise error
+               Report.error (source_reference, "unresolved type reference");
+               return null;
        }
 
        /**
index 5fb96b0e5196325bf130f0861e9b5e90faeb93e0..8eff1b8930435e6d9414d82f01b418b70347c27d 100644 (file)
@@ -57,8 +57,8 @@ public class Vala.DelegateType : DataType {
                return new DelegateType (delegate_symbol);
        }
 
-       public override string? get_cname (bool var_type, bool const_type) {
-               return delegate_symbol.get_cname (const_type);
+       public override string? get_cname () {
+               return delegate_symbol.get_cname ();
        }
 
        public override Collection<Symbol> get_symbols () {
index 1afc877a9ddb39151ce30f6f2ddf8fb7b7eb19ef..319ea8601c42c0d14a18deb6123b202c4ffd44f8 100644 (file)
@@ -72,7 +72,7 @@ public class Vala.ErrorType : ReferenceType {
                return new ErrorType (error_domain, source_reference);
        }
 
-       public override string? get_cname (bool var_type = false, bool const_type = false) {
+       public override string? get_cname () {
                return "GError*";
        }
 
index 32cb2843cd35577d877c197a1dcd9a263b0d4b91..b2cd4fd15b581a24d0b5c2025a8ae3b63ae43088 100644 (file)
@@ -51,4 +51,8 @@ public class Vala.InterfaceInstanceType : ReferenceType {
                
                return result;
        }
+
+       public override string? get_cname () {
+               return "%s*".printf (interface_symbol.get_cname (!takes_ownership && !transfers_ownership));
+       }
 }
index 6a3d022092ee011363e8460c7c4a31a89032d3eb..3e5172a710278c185ad02685d97c7eb460d880bd 100644 (file)
@@ -51,7 +51,7 @@ public class Vala.InterfaceType : ReferenceType {
                return result;
        }
 
-       public override string? get_cname (bool var_type, bool const_type) {
+       public override string? get_cname () {
                return "%sIface*".printf (interface_symbol.get_cname ());
        }
 }
index 0b5d68e5fc78d9ca20d76f2093ce3ecfc2fc1bda..9355a04d681973ad9b9be1309f62a9c7e77e3165 100644 (file)
@@ -63,7 +63,7 @@ public class Vala.MethodType : DataType {
                return method_symbol.get_full_name ();
        }
 
-       public override string? get_cname (bool var_type, bool const_type) {
+       public override string? get_cname () {
                return "gpointer";
        }
 }
index 217fdc71013bb8154689705396956a8d9ccb0d24..bb8718dd5ecf6e13ca96a1c32e4f92e33932abcc 100644 (file)
@@ -56,4 +56,8 @@ public class Vala.NullType : ReferenceType {
        public override DataType copy () {
                return new NullType (source_reference);
        }
+
+       public override string? get_cname () {
+               return "gpointer";
+       }
 }
index def7264ac890833c8b8b4edd39efa06e8d4fd15f..d1809347f75182e081a7e40bb6bb3b6780f3b87e 100644 (file)
@@ -41,11 +41,11 @@ public class Vala.PointerType : DataType {
                return base_type.to_string () + "*";
        }
 
-       public override string? get_cname (bool var_type = false, bool const_type = false) {
+       public override string? get_cname () {
                if (base_type.data_type != null && base_type.data_type.is_reference_type ()) {
-                       return base_type.get_cname (var_type, const_type);
+                       return base_type.get_cname ();
                } else {
-                       return base_type.get_cname (var_type, const_type) + "*";
+                       return base_type.get_cname () + "*";
                }
        }
 
index 7a2328f5c9a6269d39de4ed9b90b06227e518536..da2640efe1d6de4db72800a2380156791de04118 100644 (file)
@@ -735,7 +735,9 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                        }
 
                        if (acc.body != null && (acc.writable || acc.construction)) {
-                               acc.value_parameter = new FormalParameter ("value", acc.prop.type_reference, acc.source_reference);
+                               var value_type = acc.prop.type_reference.copy ();
+                               value_type.takes_ownership = value_type.transfers_ownership;
+                               acc.value_parameter = new FormalParameter ("value", value_type, acc.source_reference);
                                acc.body.scope.add (acc.value_parameter.name, acc.value_parameter);
                        }
                }
index d08c0a3cd44643c76d6e335da0508cb0df7f44d3..1e1e186e60885499b387183cbbd3d801b01f579f 100644 (file)
@@ -295,6 +295,8 @@ public class Vala.SymbolResolver : CodeVisitor {
                /* check for array */
                if (unresolved_type.array_rank > 0) {
                        var element_type = type;
+                       // array contains strong references by default
+                       element_type.takes_ownership = element_type.is_reference_type_or_type_parameter ();
                        element_type.transfers_ownership = false;
                        element_type.nullable = false;
 
index 5acd3e70f632f7628cb1571fe3823c7f92a9547e..64ff110e9eab7b5f50937e7c54f4d0f1d5b6304d 100644 (file)
@@ -40,4 +40,12 @@ public class Vala.TypeParameterType : DataType {
 
                return result;
        }
+
+       public override string? get_cname () {
+               if (takes_ownership || transfers_ownership) {
+                       return "gpointer";
+               } else {
+                       return "gconstpointer";
+               }
+       }
 }
index 1ff207dd6074b16b3e3b187965ae49ba982e48e3..118a3bcdd5d92d73e51eaa4f3dea85adaa304eeb 100644 (file)
@@ -52,11 +52,11 @@ public class Vala.ValueType : DataType {
                return result;
        }
 
-       public override string? get_cname (bool var_type, bool const_type) {
+       public override string? get_cname () {
                string ptr = "";
                if (nullable) {
                        ptr = "*";
                }
-               return type_symbol.get_cname (const_type) + ptr;
+               return type_symbol.get_cname () + ptr;
        }
 }
index 808cb05339b9ed9975ae8acb63a1b9ffd0be1b47..ef2b0793a826c3da467437325895e6b925aa2ba2 100644 (file)
@@ -37,7 +37,7 @@ public class Vala.VoidType : DataType {
                return "void";
        }
 
-       public override string? get_cname (bool var_type = false, bool const_type = false) {
+       public override string? get_cname () {
                return "void";
        }