}
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;
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 ();
}
}
+ 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);
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) {
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) {
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) {
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;
}
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 ());
if (!f.is_internal_symbol ()) {
generate_field_declaration (f, header_declarations);
}
- generate_field_declaration (f, internal_header_declarations);
lhs = new CCodeIdentifier (f.get_cname ());
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;
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;
}
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;
}
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);
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 *"));
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) {
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 ()) {
if (!cl.is_internal_symbol ()) {
generate_class_declaration (cl, header_declarations);
}
- generate_class_declaration (cl, internal_header_declarations);
cl.accept_children (codegen);
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");
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");
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 ());
}
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 *"));
}
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 *"));
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);
|| acc.access == SymbolAccessibility.PROTECTED)) {
generate_property_accessor_declaration (acc, header_declarations);
}
- generate_property_accessor_declaration (acc, internal_header_declarations);
}
DataType this_type;
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;
}
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;
}
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 *"));
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;
// _init function
function = new CCodeFunction (m.get_real_cname ());
- if (m.is_private_symbol ()) {
+ if (m.is_internal_symbol ()) {
function.modifiers |= CCodeModifiers.STATIC;
}
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;
// 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;
}
}
public override void visit_creation_method (CreationMethod m) {
- bool visible = !m.is_private_symbol ();
+ bool visible = !m.is_internal_symbol ();
head.visit_method (m);
if (!st.is_internal_symbol ()) {
generate_struct_declaration (st, header_declarations);
}
- generate_struct_declaration (st, internal_header_declarations);
st.accept_children (codegen);
}
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);
if (!cl.is_internal_symbol ()) {
generate_class_declaration (cl, header_declarations);
}
- generate_class_declaration (cl, internal_header_declarations);
var cdecl = new CCodeDeclaration ("DovaType *");
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;
}
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;
}