]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Do not allow creation of objects without constructor
authorJürg Billeter <j@bitron.ch>
Mon, 17 Aug 2009 19:16:48 +0000 (21:16 +0200)
committerJürg Billeter <j@bitron.ch>
Mon, 17 Aug 2009 19:17:47 +0000 (21:17 +0200)
Fixes bug 578417.

codegen/valaccodebasemodule.vala
vala/valaobjectcreationexpression.vala
vapi/glib-2.0.vapi

index a970c3a5a557ef341996614daa6ba7666e569878..26c5e51dd7805af3cf0fbb60b3abeb0edf6d20d4 100644 (file)
@@ -3144,33 +3144,21 @@ internal class Vala.CCodeBaseModule : CCodeModule {
                }
 
                if (expr.symbol_reference == null) {
-                       CCodeFunctionCall creation_call = null;
-
                        // no creation method
-                       if (expr.type_reference.data_type == glist_type ||
-                           expr.type_reference.data_type == gslist_type) {
-                               // NULL is an empty list
-                               expr.ccodenode = new CCodeConstant ("NULL");
-                       } else if (expr.type_reference.data_type is Class && expr.type_reference.data_type.is_subtype_of (gobject_type)) {
-                               generate_class_declaration ((Class) expr.type_reference.data_type, source_declarations);
-
-                               creation_call = new CCodeFunctionCall (new CCodeIdentifier ("g_object_new"));
-                               creation_call.add_argument (new CCodeConstant (expr.type_reference.data_type.get_type_id ()));
-                               creation_call.add_argument (new CCodeConstant ("NULL"));
-                       } else if (expr.type_reference.data_type is Class) {
-                               creation_call = new CCodeFunctionCall (new CCodeIdentifier ("g_new0"));
-                               creation_call.add_argument (new CCodeConstant (expr.type_reference.data_type.get_cname ()));
-                               creation_call.add_argument (new CCodeConstant ("1"));
-                       } else if (expr.type_reference.data_type is Struct) {
+                       if (expr.type_reference.data_type is Struct) {
                                // memset needs string.h
                                source_declarations.add_include ("string.h");
-                               creation_call = new CCodeFunctionCall (new CCodeIdentifier ("memset"));
+                               var creation_call = new CCodeFunctionCall (new CCodeIdentifier ("memset"));
                                creation_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, instance));
                                creation_call.add_argument (new CCodeConstant ("0"));
                                creation_call.add_argument (new CCodeIdentifier ("sizeof (%s)".printf (expr.type_reference.get_cname ())));
-                       }
 
-                       creation_expr = creation_call;
+                               creation_expr = creation_call;
+                       }
+               } else if (expr.type_reference.data_type == glist_type ||
+                          expr.type_reference.data_type == gslist_type) {
+                       // NULL is an empty list
+                       expr.ccodenode = new CCodeConstant ("NULL");
                } else if (expr.symbol_reference is Method) {
                        // use creation method
                        var m = (Method) expr.symbol_reference;
index 860ccf7e9c7583cb241dbda2d2fb0bf04be58ee5..f986886dc406c8600d2d0b45a8a51c56a2b56e2f 100644 (file)
@@ -250,10 +250,14 @@ public class Vala.ObjectCreationExpression : Expression {
                        if (symbol_reference == null) {
                                symbol_reference = cl.default_construction_method;
 
-                               if (symbol_reference != null) {
-                                       // track usage for flow analyzer
-                                       symbol_reference.used = true;
+                               if (symbol_reference == null) {
+                                       error = true;
+                                       Report.error (source_reference, "`%s' does not have a default constructor".printf (cl.get_full_name ()));
+                                       return false;
                                }
+
+                               // track usage for flow analyzer
+                               symbol_reference.used = true;
                        }
 
                        if (symbol_reference != null && symbol_reference.access == SymbolAccessibility.PRIVATE) {
index 74af2ec810830145c5d6566b360935fef2d54365..8713507cea6977b3216164a8a9996beedd3c1252 100644 (file)
@@ -3006,6 +3006,8 @@ namespace GLib {
        [Compact]
        [CCode (dup_function = "g_list_copy", free_function = "g_list_free")]
        public class List<G> {
+               public List ();
+
                [ReturnsModifiedPointer ()]
                public void append (owned G data);
                [ReturnsModifiedPointer ()]
@@ -3060,6 +3062,8 @@ namespace GLib {
        [Compact]
        [CCode (dup_function = "g_slist_copy", free_function = "g_slist_free")]
        public class SList<G> {
+               public SList ();
+
                [ReturnsModifiedPointer ()]
                public void append (owned G data);
                [ReturnsModifiedPointer ()]