]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
dova: Use any as top-level class
authorJürg Billeter <j@bitron.ch>
Sun, 18 Jul 2010 08:31:26 +0000 (10:31 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 18 Jul 2010 08:35:44 +0000 (10:35 +0200)
codegen/valadovaobjectmodule.vala
vala/valaclass.vala
vala/valasymbolresolver.vala

index ed0173619d6f7b7ec7fdb2411e7134c8549f441f..6def09e336030bd3ac83dba0143b61ad14a5dc21 100644 (file)
@@ -69,7 +69,10 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                        source_declarations.add_type_member_declaration (value_hash_function);
                }
 
-               generate_class_declaration (type_class, decl_space);
+               if (cl.base_class != null) {
+                       // cycle Object -> any -> Type -> Object needs to be broken to get correct declaration order
+                       generate_class_declaration (type_class, decl_space);
+               }
                generate_method_declaration ((Method) object_class.scope.lookup ("ref"), decl_space);
                generate_method_declaration ((Method) object_class.scope.lookup ("unref"), decl_space);
 
@@ -224,22 +227,32 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                decl_space.add_type_declaration (new CCodeTypeDefinition ("struct %s".printf (type_priv_struct.name), new CCodeVariableDeclarator ("%sTypePrivate".printf (cl.get_cname ()))));
                decl_space.add_type_definition (type_priv_struct);
 
+               var cdecl = new CCodeDeclaration ("int");
+               cdecl.add_declarator (new CCodeVariableDeclarator ("_%s_object_offset".printf (cl.get_lower_case_cname ()), new CCodeConstant ("0")));
+               cdecl.modifiers = CCodeModifiers.STATIC;
+               decl_space.add_type_member_declaration (cdecl);
+
+               CCodeExpression type_offset;
+
                string macro;
                if (cl.base_class == null) {
-                       // offset of Object class is 0
+                       // offset of any class is 0
                        macro = "((%sPrivate *) o)".printf (cl.get_cname ());
+                       type_offset = new CCodeConstant ("sizeof (anyPrivate) + sizeof (DovaObjectPrivate) + sizeof (DovaTypePrivate)");
+               } else if (cl == object_class) {
+                       macro = "((%sPrivate *) (((char *) o) + sizeof (anyPrivate)))".printf (cl.get_cname ());
+                       type_offset = new CCodeConstant ("sizeof (anyPrivate) + sizeof (DovaObjectPrivate) + sizeof (DovaTypePrivate) + sizeof (anyTypePrivate)");
+               } else if (cl == type_class) {
+                       macro = "((%sPrivate *) (((char *) o) + sizeof (anyPrivate) + sizeof (DovaObjectPrivate)))".printf (cl.get_cname ());
+                       type_offset = new CCodeConstant ("sizeof (anyPrivate) + sizeof (DovaObjectPrivate) + sizeof (DovaTypePrivate) + sizeof (anyTypePrivate) + sizeof (DovaObjectTypePrivate)");
                } else {
-                       var cdecl = new CCodeDeclaration ("int");
-                       cdecl.add_declarator (new CCodeVariableDeclarator ("_%s_object_offset".printf (cl.get_lower_case_cname ()), new CCodeConstant ("0")));
-                       cdecl.modifiers = CCodeModifiers.STATIC;
-                       decl_space.add_type_member_declaration (cdecl);
-
                        macro = "((%sPrivate *) (((char *) o) + _%s_object_offset))".printf (cl.get_cname (), cl.get_lower_case_cname ());
+                       type_offset = new CCodeConstant ("0");
                }
                decl_space.add_type_member_declaration (new CCodeMacroReplacement ("%s_GET_PRIVATE(o)".printf (cl.get_upper_case_cname (null)), macro));
 
-               var cdecl = new CCodeDeclaration ("int");
-               cdecl.add_declarator (new CCodeVariableDeclarator ("_%s_type_offset".printf (cl.get_lower_case_cname ()), new CCodeConstant ("0")));
+               cdecl = new CCodeDeclaration ("int");
+               cdecl.add_declarator (new CCodeVariableDeclarator ("_%s_type_offset".printf (cl.get_lower_case_cname ()), type_offset));
                cdecl.modifiers = CCodeModifiers.STATIC;
                decl_space.add_type_member_declaration (cdecl);
        }
@@ -397,35 +410,28 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                var type_init_block = new CCodeBlock ();
 
                if (base_class == null) {
-                       // var sizeof_call = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
-                       // sizeof_call.add_argument (new CCodeIdentifier ("DovaObject"));
-
                        var sizeof_call = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
                        sizeof_call.add_argument (new CCodeIdentifier ("%sPrivate".printf (cl.get_cname ())));
 
                        var calloc_call = new CCodeFunctionCall (new CCodeIdentifier ("calloc"));
                        calloc_call.add_argument (new CCodeConstant ("1"));
-                       // calloc_call.add_argument (sizeof_call);
-                       // FIXME
-                       calloc_call.add_argument (new CCodeConstant ("sizeof (DovaObjectPrivate) + sizeof (DovaTypePrivate) + sizeof (DovaObjectTypePrivate)"));
+                       calloc_call.add_argument (new CCodeConstant ("sizeof (anyPrivate) + sizeof (DovaObjectPrivate) + sizeof (DovaTypePrivate) + sizeof (anyTypePrivate)"));
 
                        type_init_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("%s_type".printf (cl.get_lower_case_cname ())), calloc_call)));
 
-                       type_init_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("_dova_type_object_offset"), sizeof_call)));
-
                        var set_size = new CCodeFunctionCall (new CCodeIdentifier ("dova_type_set_object_size"));
                        set_size.add_argument (new CCodeIdentifier ("%s_type".printf (cl.get_lower_case_cname ())));
                        set_size.add_argument (sizeof_call);
                        type_init_block.add_statement (new CCodeExpressionStatement (set_size));
 
-                       type_init_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("_dova_object_type_offset"), new CCodeConstant ("sizeof (DovaObjectPrivate) + sizeof (DovaTypePrivate)"))));
+                       type_init_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("_any_type_offset"), new CCodeConstant ("sizeof (any) + sizeof (DovaObjectPrivate) + sizeof (DovaTypePrivate)"))));
 
                        set_size = new CCodeFunctionCall (new CCodeIdentifier ("dova_type_set_type_size"));
                        set_size.add_argument (new CCodeIdentifier ("%s_type".printf (cl.get_lower_case_cname ())));
-                       set_size.add_argument (new CCodeConstant ("sizeof (DovaObjectPrivate) + sizeof (DovaTypePrivate) + sizeof (DovaObjectTypePrivate)"));
+                       set_size.add_argument (new CCodeConstant ("sizeof (any) + sizeof (DovaObjectPrivate) + sizeof (DovaTypePrivate) + sizeof (anyTypePrivate)"));
                        type_init_block.add_statement (new CCodeExpressionStatement (set_size));
 
-                       type_init_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeCastExpression (new CCodeIdentifier ("%s_type".printf (cl.get_lower_case_cname ())), "DovaObject *"), "type"), new CCodeFunctionCall (new CCodeIdentifier ("dova_type_type_get")))));
+                       type_init_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("%s_type".printf (cl.get_lower_case_cname ())), "type"), new CCodeFunctionCall (new CCodeIdentifier ("dova_type_type_get")))));
                } else {
                        generate_method_declaration ((Method) object_class.scope.lookup ("alloc"), source_declarations);
                        generate_method_declaration ((Method) type_class.scope.lookup ("alloc"), source_declarations);
@@ -678,7 +684,7 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                }
 
                // finalizer
-               if (cl.base_class != null && (cl.get_fields ().size > 0 || cl.destructor != null)) {
+               if (cl != object_class && cl.base_class != null && (cl.get_fields ().size > 0 || cl.destructor != null)) {
                        add_finalize_function (cl);
 
                        generate_method_declaration ((Method) object_class.scope.lookup ("finalize"), source_declarations);
index 05747628cb92604e5068802194991bd4b6da11f4..22c3e0ce58b3e9dda47d55c890befa81c68c67d9 100644 (file)
@@ -288,7 +288,7 @@ public class Vala.Class : ObjectTypeSymbol {
                if (CodeContext.get ().profile == Profile.DOVA &&
                    f.binding == MemberBinding.INSTANCE &&
                    (f.access == SymbolAccessibility.PUBLIC || f.access == SymbolAccessibility.PROTECTED) &&
-                   name != "string" && name != "Object" /* temporary workaround */) {
+                   name != "string" && name != "any" /* temporary workaround */) {
                        // public/protected instance fields not supported, convert to automatic property
 
                        var prop = new Property (f.name, f.field_type.copy (), null, null, f.source_reference, comment);
@@ -818,6 +818,8 @@ public class Vala.Class : ObjectTypeSymbol {
        public bool is_fundamental () {
                if (!is_compact && base_class == null) {
                        return true;
+               } else if (CodeContext.get ().profile == Profile.DOVA && base_class.base_class == null) {
+                       return true;
                }
                return false;
        }
index abbac3b14534ae0ea3f1730d90d03338bc24c81c..6483541de50f595f4c5d9ec09e89f9e2bd055ef7 100644 (file)
@@ -78,8 +78,9 @@ public class Vala.SymbolResolver : CodeVisitor {
                if (context.profile == Profile.DOVA) {
                        // classes derive from Object by default
                        if (cl.base_class == null) {
-                               var object_class = (Class) root_symbol.scope.lookup ("Dova").scope.lookup ("Object");
-                               if (cl != object_class) {
+                               var any_class = (Class) root_symbol.scope.lookup ("any");
+                               if (cl != any_class) {
+                                       var object_class = (Class) root_symbol.scope.lookup ("Dova").scope.lookup ("Object");
                                        cl.add_base_type (new ObjectType (object_class));
                                        cl.base_class = object_class;
                                }