]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
dova: Write all C code to a single file
authorJürg Billeter <j@bitron.ch>
Sun, 11 Jul 2010 12:24:16 +0000 (14:24 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 11 Jul 2010 12:24:16 +0000 (14:24 +0200)
This extends possibilities of internal members and enables global
optimizations by the C compiler.

codegen/valadovabasemodule.vala
codegen/valadovadelegatemodule.vala
codegen/valadovaobjectmodule.vala
codegen/valadovastructmodule.vala
codegen/valadovavaluemodule.vala

index 94cce071306832fa6c1b714a017e74600ad35713..2526caabafe07c92e6a0b409a05c74d9ba6be7f5 100644 (file)
@@ -113,9 +113,10 @@ internal class Vala.DovaBaseModule : CCodeModule {
        }
 
        public CCodeDeclarationSpace header_declarations;
-       public CCodeDeclarationSpace internal_header_declarations;
        public CCodeDeclarationSpace source_declarations;
 
+       string? csource_filename;
+
        public CCodeFragment source_type_member_definition;
        public CCodeFragment instance_init_fragment;
        public CCodeFragment instance_finalize_fragment;
@@ -238,7 +239,16 @@ internal class Vala.DovaBaseModule : CCodeModule {
                error_class = (Class) dova_ns.scope.lookup ("Error");
 
                header_declarations = new CCodeDeclarationSpace ();
-               internal_header_declarations = new CCodeDeclarationSpace ();
+
+
+               source_declarations = new CCodeDeclarationSpace ();
+               source_type_member_definition = new CCodeFragment ();
+
+               next_temp_var_id = 0;
+               variable_name_map.clear ();
+
+               generated_external_symbols = new HashSet<Symbol> ();
+
 
                /* we're only interested in non-pkg source files */
                var source_files = context.get_source_files ();
@@ -248,6 +258,36 @@ internal class Vala.DovaBaseModule : CCodeModule {
                        }
                }
 
+               if (csource_filename != null) {
+                       var writer = new CCodeWriter (csource_filename);
+                       if (!writer.open (context.version_header)) {
+                               Report.error (null, "unable to open `%s' for writing".printf (writer.filename));
+                               return;
+                       }
+                       writer.line_directives = context.debug;
+
+                       writer.write_newline ();
+                       source_declarations.include_directives.write (writer);
+                       writer.write_newline ();
+                       source_declarations.type_declaration.write_combined (writer);
+                       writer.write_newline ();
+                       source_declarations.type_definition.write_combined (writer);
+                       writer.write_newline ();
+                       source_declarations.type_member_declaration.write_declaration (writer);
+                       writer.write_newline ();
+                       source_declarations.type_member_declaration.write (writer);
+                       writer.write_newline ();
+                       source_declarations.constant_declaration.write_combined (writer);
+                       writer.write_newline ();
+                       source_type_member_definition.write (writer);
+                       writer.write_newline ();
+                       writer.close ();
+               }
+
+               source_declarations = null;
+               source_type_member_definition = null;
+
+
                // generate C header file for public API
                if (context.header_filename != null) {
                        var writer = new CCodeWriter (context.header_filename);
@@ -276,78 +316,25 @@ internal class Vala.DovaBaseModule : CCodeModule {
                        once.write (writer);
                        writer.close ();
                }
+       }
 
-               // generate C header file for internal API
-               if (context.internal_header_filename != null) {
-                       var writer = new CCodeWriter (context.internal_header_filename);
+       public override void visit_source_file (SourceFile source_file) {
+               if (csource_filename == null) {
+                       csource_filename = source_file.get_csource_filename ();
+               } else {
+                       var writer = new CCodeWriter (source_file.get_csource_filename ());
                        if (!writer.open (context.version_header)) {
                                Report.error (null, "unable to open `%s' for writing".printf (writer.filename));
                                return;
                        }
-                       writer.write_newline ();
-
-                       var once = new CCodeOnceSection (get_define_for_filename (writer.filename));
-                       once.append (new CCodeNewline ());
-                       once.append (internal_header_declarations.include_directives);
-                       once.append (new CCodeNewline ());
-
-                       once.append (new CCodeNewline ());
-                       once.append (internal_header_declarations.type_declaration);
-                       once.append (new CCodeNewline ());
-                       once.append (internal_header_declarations.type_definition);
-                       once.append (new CCodeNewline ());
-                       once.append (internal_header_declarations.type_member_declaration);
-                       once.append (new CCodeNewline ());
-                       once.append (internal_header_declarations.constant_declaration);
-                       once.append (new CCodeNewline ());
-
-                       once.append (new CCodeNewline ());
-                       once.write (writer);
                        writer.close ();
                }
-       }
-
-       public override void visit_source_file (SourceFile source_file) {
-               source_declarations = new CCodeDeclarationSpace ();
-               source_type_member_definition = new CCodeFragment ();
-
-               next_temp_var_id = 0;
-               variable_name_map.clear ();
-
-               generated_external_symbols = new HashSet<Symbol> ();
 
                source_file.accept_children (codegen);
 
                if (context.report.get_errors () > 0) {
                        return;
                }
-
-               var writer = new CCodeWriter (source_file.get_csource_filename ());
-               if (!writer.open (context.version_header)) {
-                       Report.error (null, "unable to open `%s' for writing".printf (writer.filename));
-                       return;
-               }
-               writer.line_directives = context.debug;
-
-               writer.write_newline ();
-               source_declarations.include_directives.write (writer);
-               writer.write_newline ();
-               source_declarations.type_declaration.write_combined (writer);
-               writer.write_newline ();
-               source_declarations.type_definition.write_combined (writer);
-               writer.write_newline ();
-               source_declarations.type_member_declaration.write_declaration (writer);
-               writer.write_newline ();
-               source_declarations.type_member_declaration.write (writer);
-               writer.write_newline ();
-               source_declarations.constant_declaration.write_combined (writer);
-               writer.write_newline ();
-               source_type_member_definition.write (writer);
-               writer.write_newline ();
-               writer.close ();
-
-               source_declarations = null;
-               source_type_member_definition = null;
        }
 
        private static string get_define_for_filename (string filename) {
@@ -398,7 +385,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
                if (!en.is_internal_symbol ()) {
                        generate_enum_declaration (en, header_declarations);
                }
-               generate_enum_declaration (en, internal_header_declarations);
        }
 
        public override void visit_member (Member m) {
@@ -435,7 +421,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
                if (!c.is_internal_symbol ()) {
                        generate_constant_declaration (c, header_declarations);
                }
-               generate_constant_declaration (c, internal_header_declarations);
        }
 
        public void generate_field_declaration (Field f, CCodeDeclarationSpace decl_space) {
@@ -452,7 +437,7 @@ internal class Vala.DovaBaseModule : CCodeModule {
 
                var cdecl = new CCodeDeclaration (field_ctype);
                cdecl.add_declarator (new CCodeVariableDeclarator (f.get_cname ()));
-               if (f.is_private_symbol ()) {
+               if (f.is_internal_symbol ()) {
                        cdecl.modifiers = CCodeModifiers.STATIC;
                } else {
                        cdecl.modifiers = CCodeModifiers.EXTERN;
@@ -473,7 +458,7 @@ internal class Vala.DovaBaseModule : CCodeModule {
                }
 
                if (f.binding == MemberBinding.INSTANCE)  {
-                       if (cl != null && f.access == SymbolAccessibility.PRIVATE) {
+                       if (cl != null && f.is_internal_symbol ()) {
                                var priv_call = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_PRIVATE".printf (cl.get_upper_case_cname (null))));
                                priv_call.add_argument (new CCodeIdentifier ("this"));
                                lhs = new CCodeMemberAccess.pointer (priv_call, f.get_cname ());
@@ -511,7 +496,6 @@ internal class Vala.DovaBaseModule : CCodeModule {
                        if (!f.is_internal_symbol ()) {
                                generate_field_declaration (f, header_declarations);
                        }
-                       generate_field_declaration (f, internal_header_declarations);
 
                        lhs = new CCodeIdentifier (f.get_cname ());
 
@@ -527,7 +511,7 @@ internal class Vala.DovaBaseModule : CCodeModule {
 
                        var var_def = new CCodeDeclaration (field_ctype);
                        var_def.add_declarator (var_decl);
-                       if (!f.is_private_symbol ()) {
+                       if (!f.is_internal_symbol ()) {
                                var_def.modifiers = CCodeModifiers.EXTERN;
                        } else {
                                var_def.modifiers = CCodeModifiers.STATIC;
index 41edadea3139818789bff27fd2bcd6e858a9faf8..6a9d62c1bda70d1770b642d4a3ba0d710f5b6d36 100644 (file)
@@ -60,7 +60,7 @@ internal class Vala.DovaDelegateModule : DovaValueModule {
 
        CCodeFunction generate_new_function (Delegate d, CCodeDeclarationSpace decl_space) {
                var function = new CCodeFunction ("%s_new".printf (d.get_lower_case_cname ()), "%s*".printf (d.get_cname ()));
-               if (d.is_private_symbol ()) {
+               if (d.is_internal_symbol ()) {
                        function.modifiers |= CCodeModifiers.STATIC;
                }
 
@@ -94,7 +94,7 @@ internal class Vala.DovaDelegateModule : DovaValueModule {
        CCodeFunction generate_invoke_function (Delegate d, CCodeDeclarationSpace decl_space) {
                var function = new CCodeFunction ("%s_invoke".printf (d.get_lower_case_cname ()));
 
-               if (d.is_private_symbol ()) {
+               if (d.is_internal_symbol ()) {
                        function.modifiers |= CCodeModifiers.STATIC;
                }
 
@@ -190,9 +190,6 @@ internal class Vala.DovaDelegateModule : DovaValueModule {
                if (!d.is_internal_symbol ()) {
                        generate_delegate_declaration (d, header_declarations);
                }
-               if (!d.is_private_symbol ()) {
-                       generate_delegate_declaration (d, internal_header_declarations);
-               }
 
                generate_type_get_function (d, delegate_class);
 
index 1ebe2fa56b6540bbdce3410a5829ccc2651330c8..a673d49d6f51e23e97c61b96fae40ef592815c4c 100644 (file)
@@ -76,12 +76,18 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                generate_method_declaration ((Method) object_class.scope.lookup ("unref"), decl_space);
 
                var type_fun = new CCodeFunction ("%s_type_get".printf (cl.get_lower_case_cname ()), "DovaType *");
+               if (cl.is_internal_symbol ()) {
+                       type_fun.modifiers = CCodeModifiers.STATIC;
+               }
                foreach (var type_param in cl.get_type_parameters ()) {
                        type_fun.add_parameter (new CCodeFormalParameter ("%s_type".printf (type_param.name.down ()), "DovaType *"));
                }
                decl_space.add_type_member_declaration (type_fun);
 
                var type_init_fun = new CCodeFunction ("%s_type_init".printf (cl.get_lower_case_cname ()));
+               if (cl.is_internal_symbol ()) {
+                       type_init_fun.modifiers = CCodeModifiers.STATIC;
+               }
                type_init_fun.add_parameter (new CCodeFormalParameter ("type", "DovaType *"));
                foreach (var type_param in cl.get_type_parameters ()) {
                        type_init_fun.add_parameter (new CCodeFormalParameter ("%s_type".printf (type_param.name.down ()), "DovaType *"));
@@ -316,6 +322,9 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                source_declarations.add_type_member_declaration (cdecl);
 
                var type_fun = new CCodeFunction ("%s_type_get".printf (cl.get_lower_case_cname ()), "DovaType *");
+               if (cl.is_internal_symbol ()) {
+                       type_fun.modifiers = CCodeModifiers.STATIC;
+               }
 
                var object_type_symbol = cl as ObjectTypeSymbol;
                if (object_type_symbol != null) {
@@ -461,6 +470,9 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                source_type_member_definition.append (type_fun);
 
                var type_init_fun = new CCodeFunction ("%s_type_init".printf (cl.get_lower_case_cname ()));
+               if (cl.is_internal_symbol ()) {
+                       type_init_fun.modifiers = CCodeModifiers.STATIC;
+               }
                type_init_fun.add_parameter (new CCodeFormalParameter ("type", "DovaType *"));
                if (object_type_symbol != null) {
                        foreach (var type_param in object_type_symbol.get_type_parameters ()) {
@@ -587,7 +599,6 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                if (!cl.is_internal_symbol ()) {
                        generate_class_declaration (cl, header_declarations);
                }
-               generate_class_declaration (cl, internal_header_declarations);
 
                cl.accept_children (codegen);
 
@@ -674,7 +685,6 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
 
                        declare_set_value_copy_function (source_declarations);
                        declare_set_value_copy_function (header_declarations);
-                       declare_set_value_copy_function (internal_header_declarations);
                        source_type_member_definition.append (create_set_value_copy_function ());
 
                        var value_equals_function = new CCodeFunction ("dova_type_value_equals", "bool");
@@ -697,7 +707,6 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
 
                        declare_set_value_equals_function (source_declarations);
                        declare_set_value_equals_function (header_declarations);
-                       declare_set_value_equals_function (internal_header_declarations);
                        source_type_member_definition.append (create_set_value_equals_function ());
 
                        var value_hash_function = new CCodeFunction ("dova_type_value_hash", "int32_t");
@@ -716,7 +725,6 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
 
                        declare_set_value_hash_function (source_declarations);
                        declare_set_value_hash_function (header_declarations);
-                       declare_set_value_hash_function (internal_header_declarations);
                        source_type_member_definition.append (create_set_value_hash_function ());
                }
 
@@ -755,6 +763,9 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                source_declarations.add_type_member_declaration (cdecl);
 
                var type_fun = new CCodeFunction ("%s_type_get".printf (iface.get_lower_case_cname ()), "DovaType *");
+               if (iface.is_internal_symbol ()) {
+                       type_fun.modifiers = CCodeModifiers.STATIC;
+               }
                foreach (var type_param in iface.get_type_parameters ()) {
                        type_fun.add_parameter (new CCodeFormalParameter ("%s_type".printf (type_param.name.down ()), "DovaType *"));
                }
@@ -782,6 +793,9 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                source_type_member_definition.append (type_fun);
 
                var type_init_fun = new CCodeFunction ("%s_type_init".printf (iface.get_lower_case_cname ()));
+               if (iface.is_internal_symbol ()) {
+                       type_init_fun.modifiers = CCodeModifiers.STATIC;
+               }
                type_init_fun.add_parameter (new CCodeFormalParameter ("type", "DovaType *"));
                foreach (var type_param in iface.get_type_parameters ()) {
                        type_init_fun.add_parameter (new CCodeFormalParameter ("%s_type".printf (type_param.name.down ()), "DovaType *"));
@@ -857,7 +871,7 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                        function.add_parameter (cvalueparam);
                }
 
-               if (prop.is_private_symbol () || acc.access == SymbolAccessibility.PRIVATE) {
+               if (prop.is_internal_symbol () || acc.is_internal_symbol ()) {
                        function.modifiers |= CCodeModifiers.STATIC;
                }
                decl_space.add_type_member_declaration (function);
@@ -898,7 +912,6 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                                || acc.access == SymbolAccessibility.PROTECTED)) {
                                generate_property_accessor_declaration (acc, header_declarations);
                        }
-                       generate_property_accessor_declaration (acc, internal_header_declarations);
                }
 
                DataType this_type;
@@ -926,7 +939,7 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                                function.add_parameter (cvalueparam);
                        }
 
-                       if (prop.is_private_symbol () || !(acc.readable || acc.writable) || acc.access == SymbolAccessibility.PRIVATE) {
+                       if (prop.is_internal_symbol () || !(acc.readable || acc.writable) || acc.is_internal_symbol ()) {
                                // accessor function should be private if the property is an internal symbol
                                function.modifiers |= CCodeModifiers.STATIC;
                        }
@@ -984,7 +997,7 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                                function.add_parameter (cvalueparam);
                        }
 
-                       if (prop.is_private_symbol () || !(acc.readable || acc.writable) || acc.access == SymbolAccessibility.PRIVATE) {
+                       if (prop.is_internal_symbol () || !(acc.readable || acc.writable) || acc.is_internal_symbol ()) {
                                // accessor function should be private if the property is an internal symbol
                                function.modifiers |= CCodeModifiers.STATIC;
                        }
@@ -1018,12 +1031,18 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                generate_class_declaration (type_class, decl_space);
 
                var type_fun = new CCodeFunction ("%s_type_get".printf (iface.get_lower_case_cname ()), "DovaType *");
+               if (iface.is_internal_symbol ()) {
+                       type_fun.modifiers = CCodeModifiers.STATIC;
+               }
                foreach (var type_param in iface.get_type_parameters ()) {
                        type_fun.add_parameter (new CCodeFormalParameter ("%s_type".printf (type_param.name.down ()), "DovaType *"));
                }
                decl_space.add_type_member_declaration (type_fun);
 
                var type_init_fun = new CCodeFunction ("%s_type_init".printf (iface.get_lower_case_cname ()));
+               if (iface.is_internal_symbol ()) {
+                       type_init_fun.modifiers = CCodeModifiers.STATIC;
+               }
                type_init_fun.add_parameter (new CCodeFormalParameter ("type", "DovaType *"));
                foreach (var type_param in iface.get_type_parameters ()) {
                        type_init_fun.add_parameter (new CCodeFormalParameter ("%s_type".printf (type_param.name.down ()), "DovaType *"));
@@ -1054,7 +1073,7 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
 
                var function = new CCodeFunction (m.get_cname ());
 
-               if (m.is_private_symbol ()) {
+               if (m.is_internal_symbol ()) {
                        function.modifiers |= CCodeModifiers.STATIC;
                        if (m.is_inline) {
                                function.modifiers |= CCodeModifiers.INLINE;
@@ -1096,7 +1115,7 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                        // _init function
                        function = new CCodeFunction (m.get_real_cname ());
 
-                       if (m.is_private_symbol ()) {
+                       if (m.is_internal_symbol ()) {
                                function.modifiers |= CCodeModifiers.STATIC;
                        }
 
@@ -1143,7 +1162,6 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                if (!m.is_internal_symbol ()) {
                        generate_method_declaration (m, header_declarations);
                }
-               generate_method_declaration (m, internal_header_declarations);
 
                var function = new CCodeFunction (m.get_real_cname ());
                m.ccodenode = function;
@@ -1156,7 +1174,7 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
                                // declare *_real_* function
                                function.modifiers |= CCodeModifiers.STATIC;
                                source_declarations.add_type_member_declaration (function.copy ());
-                       } else if (m.is_private_symbol ()) {
+                       } else if (m.is_internal_symbol ()) {
                                function.modifiers |= CCodeModifiers.STATIC;
                        }
 
@@ -1453,7 +1471,7 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
        }
 
        public override void visit_creation_method (CreationMethod m) {
-               bool visible = !m.is_private_symbol ();
+               bool visible = !m.is_internal_symbol ();
 
                head.visit_method (m);
 
index ba33a1a48f6450834748a1b9a289314ffefe0500..4cc286bf2f74527528f9312cb0a2e9357be2dbad 100644 (file)
@@ -90,7 +90,6 @@ internal class Vala.DovaStructModule : DovaBaseModule {
                if (!st.is_internal_symbol ()) {
                        generate_struct_declaration (st, header_declarations);
                }
-               generate_struct_declaration (st, internal_header_declarations);
 
                st.accept_children (codegen);
 
index ff59302af99a50cffb2c617cde57caa2781aa72e..75221f41a00b2d54190fd1fe4c1f0e183ea26b9b 100644 (file)
@@ -37,14 +37,14 @@ internal class Vala.DovaValueModule : DovaObjectModule {
                }
 
                var type_fun = new CCodeFunction ("%s_type_get".printf (cl.get_lower_case_cname ()), "DovaType *");
-               if (cl.access == SymbolAccessibility.PRIVATE) {
+               if (cl.is_internal_symbol ()) {
                        type_fun.modifiers = CCodeModifiers.STATIC;
                }
                decl_space.add_type_member_declaration (type_fun);
 
                var type_init_fun = new CCodeFunction ("%s_type_init".printf (cl.get_lower_case_cname ()));
                type_init_fun.add_parameter (new CCodeFormalParameter ("type", "DovaType *"));
-               if (cl.access == SymbolAccessibility.PRIVATE) {
+               if (cl.is_internal_symbol ()) {
                        type_init_fun.modifiers = CCodeModifiers.STATIC;
                }
                decl_space.add_type_member_declaration (type_init_fun);
@@ -96,7 +96,6 @@ internal class Vala.DovaValueModule : DovaObjectModule {
                if (!cl.is_internal_symbol ()) {
                        generate_class_declaration (cl, header_declarations);
                }
-               generate_class_declaration (cl, internal_header_declarations);
 
 
                var cdecl = new CCodeDeclaration ("DovaType *");
@@ -270,20 +269,20 @@ internal class Vala.DovaValueModule : DovaObjectModule {
                generate_class_declaration (type_class, decl_space);
 
                var type_fun = new CCodeFunction ("%s_type_get".printf (st.get_lower_case_cname ()), "DovaType *");
-               if (st.access == SymbolAccessibility.PRIVATE) {
+               if (st.is_internal_symbol ()) {
                        type_fun.modifiers = CCodeModifiers.STATIC;
                }
                decl_space.add_type_member_declaration (type_fun);
 
                var type_init_fun = new CCodeFunction ("%s_type_init".printf (st.get_lower_case_cname ()));
                type_init_fun.add_parameter (new CCodeFormalParameter ("type", "DovaType *"));
-               if (st.access == SymbolAccessibility.PRIVATE) {
+               if (st.is_internal_symbol ()) {
                        type_init_fun.modifiers = CCodeModifiers.STATIC;
                }
                decl_space.add_type_member_declaration (type_init_fun);
 
                var function = new CCodeFunction (st.get_copy_function (), "void");
-               if (st.access == SymbolAccessibility.PRIVATE) {
+               if (st.is_internal_symbol ()) {
                        function.modifiers = CCodeModifiers.STATIC;
                }
 
@@ -464,7 +463,7 @@ internal class Vala.DovaValueModule : DovaObjectModule {
 
        void add_struct_copy_function (Struct st) {
                var function = new CCodeFunction (st.get_copy_function (), "void");
-               if (st.access == SymbolAccessibility.PRIVATE) {
+               if (st.is_internal_symbol ()) {
                        function.modifiers = CCodeModifiers.STATIC;
                }