[vala/staging: 3/3] codegen: Introduce VALA_EXPORT for public symbols to improve portability




commit d6f555908157783a309d049405ebe6b676e2b499
Author: Princeton Ferro <princetonferro gmail com>
Date:   Sun May 9 16:00:11 2021 -0400

    codegen: Introduce VALA_EXPORT for public symbols to improve portability
    
    Use it as replacement for "extern" and attribute every public symbol.
    
    We want to ensure that public symbols are exported, which isn't the
    default when generating a shared library in MSVC, for example.

 ccode/valaccodedeclaration.vala       |  2 +-
 ccode/valaccodefunction.vala          |  2 ++
 codegen/valaccodebasemodule.vala      | 50 +++++++++++++++++++++++++++++++++++
 codegen/valaccodemethodmodule.vala    | 11 ++++++++
 codegen/valaccodestructmodule.vala    | 14 ++++++++++
 codegen/valagasyncmodule.vala         | 12 +++++++++
 codegen/valagdbusclientmodule.vala    |  7 ++++-
 codegen/valagdbusservermodule.vala    |  3 +++
 codegen/valagerrormodule.vala         |  2 ++
 codegen/valagtypemodule.vala          | 23 ++++++++++++++++
 codegen/valagvariantmodule.vala       |  4 +++
 codegen/valatyperegisterfunction.vala |  4 ++-
 12 files changed, 131 insertions(+), 3 deletions(-)
---
diff --git a/ccode/valaccodedeclaration.vala b/ccode/valaccodedeclaration.vala
index 6da01cfa6..d9bdd82b8 100644
--- a/ccode/valaccodedeclaration.vala
+++ b/ccode/valaccodedeclaration.vala
@@ -87,7 +87,7 @@ public class Vala.CCodeDeclaration : CCodeStatement {
                                writer.write_string ("volatile ");
                        }
                        if ((modifiers & CCodeModifiers.EXTERN) != 0 && !has_initializer ()) {
-                               writer.write_string ("extern ");
+                               writer.write_string ("VALA_EXTERN ");
                        }
                        if ((modifiers & CCodeModifiers.THREAD_LOCAL) != 0) {
                                writer.write_string ("thread_local ");
diff --git a/ccode/valaccodefunction.vala b/ccode/valaccodefunction.vala
index b1a529711..395ffdc8b 100644
--- a/ccode/valaccodefunction.vala
+++ b/ccode/valaccodefunction.vala
@@ -110,6 +110,8 @@ public class Vala.CCodeFunction : CCodeNode {
                writer.write_indent (line);
                if (CCodeModifiers.INTERNAL in modifiers) {
                        writer.write_string (GNUC_INTERNAL);
+               } else if (is_declaration && CCodeModifiers.EXTERN in modifiers) {
+                       writer.write_string ("VALA_EXTERN ");
                }
                if (!is_declaration && CCodeModifiers.NO_INLINE in modifiers) {
                        writer.write_string (GNUC_NO_INLINE);
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 3b1163b94..a1897e575 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -366,6 +366,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        public bool requires_array_n_elements;
        public bool requires_clear_mutex;
        public bool requires_memdup2;
+       public bool requires_vala_extern;
 
        public Set<string> wrappers;
        Set<Symbol> generated_external_symbols;
@@ -799,6 +800,24 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                cfile.add_function (fun);
        }
 
+       /**
+        * Define a macro hint for exporting a symbol in a portable way.
+        */
+       void append_vala_extern_define (CCodeFile decl_space) {
+               var extern_define = new CCodeIfSection ("!defined(VALA_EXTERN)");
+
+               CCodeIfSection if_section;
+               if_section = new CCodeIfSection ("defined(_MSC_VER)");
+               extern_define.append (if_section);
+               if_section.append (new CCodeDefine ("VALA_EXTERN", "__declspec(dllexport) extern"));
+               if_section = if_section.append_else ("__GNUC__ >= 4");
+               if_section.append (new CCodeDefine ("VALA_EXTERN", "__attribute__((visibility(\"default\"))) 
extern"));
+               if_section = if_section.append_else ();
+               if_section.append (new CCodeDefine ("VALA_EXTERN", "extern"));
+
+               decl_space.add_define (extern_define);
+       }
+
        public override void visit_source_file (SourceFile source_file) {
                cfile = new CCodeFile (CCodeFileType.SOURCE, source_file);
 
@@ -812,6 +831,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                requires_array_length = false;
                requires_array_n_elements = false;
                requires_clear_mutex = false;
+               requires_vala_extern = false;
 
                wrappers = new HashSet<string> (str_hash, str_equal);
                generated_external_symbols = new HashSet<Symbol> ();
@@ -857,6 +877,20 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                if (requires_memdup2) {
                        append_vala_memdup2 ();
                }
+               if (requires_vala_extern) {
+                       if (context.header_filename != null) {
+                               if (!header_file.add_declaration ("VALA_EXTERN")) {
+                                       append_vala_extern_define (header_file);
+                               }
+                               cfile.add_include (source_file.get_cinclude_filename (), true);
+                               internal_header_file.add_include (source_file.get_cinclude_filename (), true);
+                       } else {
+                               if (!cfile.add_declaration ("VALA_EXTERN")) {
+                                       append_vala_extern_define (cfile);
+                                       append_vala_extern_define (internal_header_file);
+                               }
+                       }
+               }
 
                var comments = source_file.get_comments();
                if (comments != null) {
@@ -932,6 +966,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        regfun.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.UNUSED;
                } else if (context.hide_internal && en.is_internal_symbol ()) {
                        regfun.modifiers |= CCodeModifiers.INTERNAL;
+               } else {
+                       regfun.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
 
                decl_space.add_function_declaration (regfun);
@@ -1054,6 +1091,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                        cdecl.modifiers = CCodeModifiers.STATIC;
                                } else {
                                        cdecl.modifiers = CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                }
 
                                decl_space.add_constant_declaration (cdecl);
@@ -1148,6 +1186,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        cdecl.modifiers = CCodeModifiers.STATIC;
                } else {
                        cdecl.modifiers = CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
                if (f.version.deprecated) {
                        cdecl.modifiers |= CCodeModifiers.DEPRECATED;
@@ -1167,6 +1206,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                flock.modifiers = CCodeModifiers.STATIC;
                        } else {
                                flock.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
                        decl_space.add_type_member_declaration (flock);
                }
@@ -1184,6 +1224,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                cdecl.modifiers = CCodeModifiers.STATIC;
                                        } else {
                                                cdecl.modifiers = CCodeModifiers.EXTERN;
+                                               requires_vala_extern = true;
                                        }
                                        decl_space.add_type_member_declaration (cdecl);
                                }
@@ -1199,6 +1240,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                        cdecl.modifiers = CCodeModifiers.STATIC;
                                } else {
                                        cdecl.modifiers = CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                }
                                decl_space.add_type_member_declaration (cdecl);
 
@@ -1209,6 +1251,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                cdecl.modifiers = CCodeModifiers.STATIC;
                                        } else {
                                                cdecl.modifiers = CCodeModifiers.EXTERN;
+                                               requires_vala_extern = true;
                                        }
                                        decl_space.add_type_member_declaration (cdecl);
                                }
@@ -1358,6 +1401,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                var_def.add_declarator (var_decl);
                                if (!f.is_private_symbol ()) {
                                        var_def.modifiers = CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                } else {
                                        var_def.modifiers = CCodeModifiers.STATIC;
                                }
@@ -1381,6 +1425,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                        len_def.add_declarator (new CCodeVariableDeclarator 
(get_variable_array_length_cname (f, dim), new CCodeConstant ("0")));
                                                        if (!f.is_private_symbol ()) {
                                                                len_def.modifiers = CCodeModifiers.EXTERN;
+                                                               requires_vala_extern = true;
                                                        } else {
                                                                len_def.modifiers = CCodeModifiers.STATIC;
                                                        }
@@ -1403,6 +1448,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                target_def.add_declarator (new CCodeVariableDeclarator 
(get_ccode_delegate_target_name (f), new CCodeConstant ("NULL")));
                                                if (!f.is_private_symbol ()) {
                                                        target_def.modifiers = CCodeModifiers.EXTERN;
+                                                       requires_vala_extern = true;
                                                } else {
                                                        target_def.modifiers = CCodeModifiers.STATIC;
                                                }
@@ -1413,6 +1459,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                                        target_destroy_notify_def.add_declarator (new 
CCodeVariableDeclarator (get_ccode_delegate_target_destroy_notify_name (f), new CCodeConstant ("NULL")));
                                                        if (!f.is_private_symbol ()) {
                                                                target_destroy_notify_def.modifiers = 
CCodeModifiers.EXTERN;
+                                                               requires_vala_extern = true;
                                                        } else {
                                                                target_destroy_notify_def.modifiers = 
CCodeModifiers.STATIC;
                                                        }
@@ -1709,6 +1756,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        function.modifiers |= CCodeModifiers.STATIC;
                } else if (context.hide_internal && (prop.is_internal_symbol () || acc.access == 
SymbolAccessibility.INTERNAL)) {
                        function.modifiers |= CCodeModifiers.INTERNAL;
+               } else {
+                       function.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
                decl_space.add_function_declaration (function);
        }
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala
index cd9d6bd98..89079688c 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -171,6 +171,9 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                        }
                } else if (context.hide_internal && m.is_internal_symbol () && !m.external) {
                        function.modifiers |= CCodeModifiers.INTERNAL;
+               } else if (!m.entry_point && !m.external) {
+                       function.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
 
                if (m.entry_point) {
@@ -207,6 +210,9 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                                function.modifiers |= CCodeModifiers.STATIC;
                        } else if (context.hide_internal && m.is_internal_symbol ()) {
                                function.modifiers |= CCodeModifiers.INTERNAL;
+                       } else {
+                               function.modifiers |= CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        cparam_map = new HashMap<int,CCodeParameter> (direct_hash, direct_equal);
@@ -221,6 +227,11 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                                // _constructv function
                                function = new CCodeFunction (get_ccode_constructv_name ((CreationMethod) m));
 
+                               if (!m.is_private_symbol ()) {
+                                       function.modifiers |= CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
+                               }
+
                                cparam_map = new HashMap<int,CCodeParameter> (direct_hash, direct_equal);
                                generate_cparameters (m, decl_space, cparam_map, function);
 
diff --git a/codegen/valaccodestructmodule.vala b/codegen/valaccodestructmodule.vala
index 5042698cd..d019a95e1 100644
--- a/codegen/valaccodestructmodule.vala
+++ b/codegen/valaccodestructmodule.vala
@@ -67,6 +67,8 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
                                var type_fun = new StructRegisterFunction (st);
                                type_fun.init_from_type (context, false, true);
                                decl_space.add_type_member_declaration (type_fun.get_declaration ());
+
+                               requires_vala_extern = true;
                        }
                }
 
@@ -104,6 +106,9 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
                        function.modifiers = CCodeModifiers.STATIC;
                } else if (context.hide_internal && st.is_internal_symbol ()) {
                        function.modifiers = CCodeModifiers.INTERNAL;
+               } else {
+                       function.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
                function.add_parameter (new CCodeParameter ("self", "const " + get_ccode_name (st) + "*"));
                decl_space.add_function_declaration (function);
@@ -113,6 +118,9 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
                        function.modifiers = CCodeModifiers.STATIC;
                } else if (context.hide_internal && st.is_internal_symbol ()) {
                        function.modifiers = CCodeModifiers.INTERNAL;
+               } else {
+                       function.modifiers = CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
                function.add_parameter (new CCodeParameter ("self", get_ccode_name (st) + "*"));
                decl_space.add_function_declaration (function);
@@ -123,6 +131,9 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
                                function.modifiers = CCodeModifiers.STATIC;
                        } else if (context.hide_internal && st.is_internal_symbol ()) {
                                function.modifiers = CCodeModifiers.INTERNAL;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
                        function.add_parameter (new CCodeParameter ("self", "const " + get_ccode_name (st) + 
"*"));
                        function.add_parameter (new CCodeParameter ("dest", get_ccode_name (st) + "*"));
@@ -133,6 +144,9 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
                                function.modifiers = CCodeModifiers.STATIC;
                        } else if (context.hide_internal && st.is_internal_symbol ()) {
                                function.modifiers = CCodeModifiers.INTERNAL;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
                        function.add_parameter (new CCodeParameter ("self", get_ccode_name (st) + "*"));
                        decl_space.add_function_declaration (function);
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala
index 7019f8ee6..2ca56b705 100644
--- a/codegen/valagasyncmodule.vala
+++ b/codegen/valagasyncmodule.vala
@@ -358,6 +358,9 @@ public class Vala.GAsyncModule : GtkModule {
                                asyncfunc.modifiers |= CCodeModifiers.STATIC;
                        } else if (context.hide_internal && m.is_internal_symbol ()) {
                                asyncfunc.modifiers |= CCodeModifiers.INTERNAL;
+                       } else {
+                               asyncfunc.modifiers |= CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        // do not generate _new functions for creation methods of abstract classes
@@ -375,6 +378,9 @@ public class Vala.GAsyncModule : GtkModule {
                                finishfunc.modifiers |= CCodeModifiers.STATIC;
                        } else if (context.hide_internal && m.is_internal_symbol ()) {
                                finishfunc.modifiers |= CCodeModifiers.INTERNAL;
+                       } else {
+                               finishfunc.modifiers |= CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        // do not generate _new functions for creation methods of abstract classes
@@ -392,6 +398,9 @@ public class Vala.GAsyncModule : GtkModule {
                                        function.modifiers |= CCodeModifiers.STATIC;
                                } else if (context.hide_internal && m.is_internal_symbol ()) {
                                        function.modifiers |= CCodeModifiers.INTERNAL;
+                               } else {
+                                       function.modifiers |= CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                }
 
                                cparam_map = new HashMap<int,CCodeParameter> (direct_hash, direct_equal);
@@ -405,6 +414,9 @@ public class Vala.GAsyncModule : GtkModule {
                                        function.modifiers |= CCodeModifiers.STATIC;
                                } else if (context.hide_internal && m.is_internal_symbol ()) {
                                        function.modifiers |= CCodeModifiers.INTERNAL;
+                               } else {
+                                       function.modifiers |= CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                }
 
                                cparam_map = new HashMap<int,CCodeParameter> (direct_hash, direct_equal);
diff --git a/codegen/valagdbusclientmodule.vala b/codegen/valagdbusclientmodule.vala
index 51c83b67b..697b08758 100644
--- a/codegen/valagdbusclientmodule.vala
+++ b/codegen/valagdbusclientmodule.vala
@@ -161,12 +161,17 @@ public class Vala.GDBusClientModule : GDBusModule {
 
                // declare proxy_get_type function
                var proxy_get_type = new CCodeFunction (get_type_name, "GType");
-               proxy_get_type.modifiers = CCodeModifiers.CONST;
+               proxy_get_type.modifiers = CCodeModifiers.CONST | CCodeModifiers.EXTERN;
+               requires_vala_extern = true;
+
                decl_space.add_function_declaration (proxy_get_type);
 
                if (in_plugin) {
                        var proxy_register_type = new CCodeFunction ("%sproxy_register_dynamic_type".printf 
(get_ccode_lower_case_prefix (iface)));
                        proxy_register_type.add_parameter (new CCodeParameter ("module", "GTypeModule*"));
+                       proxy_register_type.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
+
                        decl_space.add_function_declaration (proxy_register_type);
                }
        }
diff --git a/codegen/valagdbusservermodule.vala b/codegen/valagdbusservermodule.vala
index 68ca2b7fb..e6f379c9f 100644
--- a/codegen/valagdbusservermodule.vala
+++ b/codegen/valagdbusservermodule.vala
@@ -1087,6 +1087,9 @@ public class Vala.GDBusServerModule : GDBusClientModule {
                        cfunc.modifiers |= CCodeModifiers.STATIC;
                } else if (context.hide_internal && sym.is_internal_symbol ()) {
                        cfunc.modifiers |= CCodeModifiers.INTERNAL;
+               } else {
+                       cfunc.modifiers |= CCodeModifiers.EXTERN;
+                       requires_vala_extern = true;
                }
                decl_space.add_function_declaration (cfunc);
        }
diff --git a/codegen/valagerrormodule.vala b/codegen/valagerrormodule.vala
index 92be271c7..8deea612a 100644
--- a/codegen/valagerrormodule.vala
+++ b/codegen/valagerrormodule.vala
@@ -52,6 +52,8 @@ public class Vala.GErrorModule : CCodeDelegateModule {
                decl_space.add_type_definition (error_domain_define);
 
                var cquark_fun = new CCodeFunction (quark_fun_name, get_ccode_name (gquark_type.type_symbol));
+               cquark_fun.modifiers |= CCodeModifiers.EXTERN;
+               requires_vala_extern = true;
 
                decl_space.add_function_declaration (cquark_fun);
        }
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index 6ec1f6b6d..63d27ea29 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -104,6 +104,10 @@ public class Vala.GTypeModule : GErrorModule {
                        } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                ref_fun.modifiers = CCodeModifiers.INTERNAL;
                                unref_fun.modifiers = CCodeModifiers.INTERNAL;
+                       } else {
+                               ref_fun.modifiers = CCodeModifiers.EXTERN;
+                               unref_fun.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        ref_fun.add_parameter (new CCodeParameter ("instance", "gpointer"));
@@ -125,6 +129,9 @@ public class Vala.GTypeModule : GErrorModule {
                                function.modifiers = CCodeModifiers.STATIC | CCodeModifiers.UNUSED;
                        } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                function.modifiers = CCodeModifiers.INTERNAL;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        decl_space.add_function_declaration (function);
@@ -139,6 +146,9 @@ public class Vala.GTypeModule : GErrorModule {
                        } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                // avoid C warning as this function is not always used
                                function.modifiers = CCodeModifiers.INTERNAL | CCodeModifiers.UNUSED;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        decl_space.add_function_declaration (function);
@@ -152,6 +162,9 @@ public class Vala.GTypeModule : GErrorModule {
                                function.modifiers = CCodeModifiers.STATIC | CCodeModifiers.UNUSED;
                        } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                function.modifiers = CCodeModifiers.INTERNAL;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        decl_space.add_function_declaration (function);
@@ -165,6 +178,9 @@ public class Vala.GTypeModule : GErrorModule {
                        } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                // avoid C warning as this function is not always used
                                function.modifiers = CCodeModifiers.INTERNAL | CCodeModifiers.UNUSED;
+                       } else {
+                               function.modifiers = CCodeModifiers.EXTERN;
+                               requires_vala_extern = true;
                        }
 
                        decl_space.add_function_declaration (function);
@@ -175,6 +191,9 @@ public class Vala.GTypeModule : GErrorModule {
                                        function.modifiers = CCodeModifiers.STATIC;
                                } else if (context.hide_internal && cl.is_internal_symbol ()) {
                                        function.modifiers = CCodeModifiers.INTERNAL;
+                               } else {
+                                       function.modifiers = CCodeModifiers.EXTERN;
+                                       requires_vala_extern = true;
                                }
 
                                function.add_parameter (new CCodeParameter ("self", "%s *".printf 
(get_ccode_name (cl))));
@@ -189,6 +208,8 @@ public class Vala.GTypeModule : GErrorModule {
                        var type_fun = new ClassRegisterFunction (cl);
                        type_fun.init_from_type (context, in_plugin, true);
                        decl_space.add_type_member_declaration (type_fun.get_declaration ());
+
+                       requires_vala_extern = true;
                }
 
                var base_class = cl;
@@ -2157,6 +2178,8 @@ public class Vala.GTypeModule : GErrorModule {
                var type_fun = new InterfaceRegisterFunction (iface);
                type_fun.init_from_type (context, in_plugin, true);
                decl_space.add_type_member_declaration (type_fun.get_declaration ());
+
+               requires_vala_extern = true;
        }
 
        public override void visit_interface (Interface iface) {
diff --git a/codegen/valagvariantmodule.vala b/codegen/valagvariantmodule.vala
index 2e4c4956e..9f53ca010 100644
--- a/codegen/valagvariantmodule.vala
+++ b/codegen/valagvariantmodule.vala
@@ -260,6 +260,8 @@ public class Vala.GVariantModule : GValueModule {
                var from_string_func = new CCodeFunction (from_string_name, get_ccode_name (en));
                from_string_func.add_parameter (new CCodeParameter ("str", "const char*"));
                from_string_func.add_parameter (new CCodeParameter ("error", "GError**"));
+               from_string_func.modifiers |= CCodeModifiers.EXTERN;
+               requires_vala_extern = true;
 
                return from_string_func;
        }
@@ -644,6 +646,8 @@ public class Vala.GVariantModule : GValueModule {
 
                var to_string_func = new CCodeFunction (to_string_name, "const char*");
                to_string_func.add_parameter (new CCodeParameter ("value", get_ccode_name (en)));
+               to_string_func.modifiers |= CCodeModifiers.EXTERN;
+               requires_vala_extern = true;
 
                return to_string_func;
        }
diff --git a/codegen/valatyperegisterfunction.vala b/codegen/valatyperegisterfunction.vala
index 6276273b9..67bb7efb9 100644
--- a/codegen/valatyperegisterfunction.vala
+++ b/codegen/valatyperegisterfunction.vala
@@ -76,6 +76,8 @@ public abstract class Vala.TypeRegisterFunction {
                        } else if (context.hide_internal && get_accessibility () == 
SymbolAccessibility.INTERNAL) {
                                // avoid C warning as this function is not always used
                                fun.modifiers |= CCodeModifiers.INTERNAL | CCodeModifiers.UNUSED;
+                       } else {
+                               fun.modifiers |= CCodeModifiers.EXTERN;
                        }
 
                        fun.is_declaration = true;
@@ -100,7 +102,7 @@ public abstract class Vala.TypeRegisterFunction {
                        fun.is_declaration = false;
 
                        var get_fun = new CCodeFunction (get_ccode_type_function (type_symbol), "GType");
-                       get_fun.modifiers = CCodeModifiers.CONST;
+                       get_fun.modifiers = CCodeModifiers.CONST | CCodeModifiers.EXTERN;
 
                        get_fun.is_declaration = true;
                        declaration_fragment.append (get_fun.copy ());


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]