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.
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 ");
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);
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;
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);
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> ();
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) {
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);
cdecl.modifiers = CCodeModifiers.STATIC;
} else {
cdecl.modifiers = CCodeModifiers.EXTERN;
+ requires_vala_extern = true;
}
decl_space.add_constant_declaration (cdecl);
cdecl.modifiers = CCodeModifiers.STATIC;
} else {
cdecl.modifiers = CCodeModifiers.EXTERN;
+ requires_vala_extern = true;
}
if (f.version.deprecated) {
cdecl.modifiers |= CCodeModifiers.DEPRECATED;
flock.modifiers = CCodeModifiers.STATIC;
} else {
flock.modifiers = CCodeModifiers.EXTERN;
+ requires_vala_extern = true;
}
decl_space.add_type_member_declaration (flock);
}
cdecl.modifiers = CCodeModifiers.STATIC;
} else {
cdecl.modifiers = CCodeModifiers.EXTERN;
+ requires_vala_extern = true;
}
decl_space.add_type_member_declaration (cdecl);
}
cdecl.modifiers = CCodeModifiers.STATIC;
} else {
cdecl.modifiers = CCodeModifiers.EXTERN;
+ requires_vala_extern = true;
}
decl_space.add_type_member_declaration (cdecl);
cdecl.modifiers = CCodeModifiers.STATIC;
} else {
cdecl.modifiers = CCodeModifiers.EXTERN;
+ requires_vala_extern = true;
}
decl_space.add_type_member_declaration (cdecl);
}
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;
}
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;
}
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;
}
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;
}
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);
}
}
} 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) {
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);
// _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);
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;
}
}
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);
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);
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) + "*"));
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);
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
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
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);
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);
// 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);
}
}
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);
}
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);
}
} 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"));
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);
} 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);
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);
} 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);
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))));
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;
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) {
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;
}
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;
}
} 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;
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 ());