summaryrefslogtreecommitdiff
path: root/gobject/valagtypemodule.vala
diff options
context:
space:
mode:
Diffstat (limited to 'gobject/valagtypemodule.vala')
-rw-r--r--gobject/valagtypemodule.vala133
1 files changed, 94 insertions, 39 deletions
diff --git a/gobject/valagtypemodule.vala b/gobject/valagtypemodule.vala
index 42afdbb1f..4e13ccc13 100644
--- a/gobject/valagtypemodule.vala
+++ b/gobject/valagtypemodule.vala
@@ -1,6 +1,7 @@
/* valagtypemodule.vala
*
- * Copyright (C) 2006-2008 Jürg Billeter, Raffaele Sandrini
+ * Copyright (C) 2006-2009 Jürg Billeter
+ * Copyright (C) 2006-2008 Raffaele Sandrini
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,31 +22,29 @@
* Raffaele Sandrini <raffaele@sandrini.ch>
*/
-using GLib;
+using Gee;
internal class Vala.GTypeModule : GErrorModule {
public GTypeModule (CCodeGenerator codegen, CCodeModule? next) {
base (codegen, next);
}
- public override void visit_interface (Interface iface) {
- current_symbol = iface;
- current_type_symbol = iface;
-
- if (iface.get_cname().len () < 3) {
- iface.error = true;
- Report.error (iface.source_reference, "Interface name `%s' is too short".printf (iface.get_cname ()));
+ public override void generate_interface_declaration (Interface iface, CCodeDeclarationSpace decl_space) {
+ if (decl_space.add_symbol_declaration (iface, iface.get_cname ())) {
return;
}
- CCodeDeclarationSpace decl_space;
- if (iface.access != SymbolAccessibility.PRIVATE) {
- decl_space = header_declarations;
- } else {
- decl_space = source_declarations;
+ foreach (DataType prerequisite in iface.get_prerequisites ()) {
+ var prereq_cl = prerequisite.data_type as Class;
+ var prereq_iface = prerequisite.data_type as Interface;
+ if (prereq_cl != null) {
+ generate_class_declaration (prereq_cl, decl_space);
+ } else if (prereq_iface != null) {
+ generate_interface_declaration (prereq_iface, decl_space);
+ }
}
- type_struct = new CCodeStruct ("_%s".printf (iface.get_type_cname ()));
+ var type_struct = new CCodeStruct ("_%s".printf (iface.get_type_cname ()));
decl_space.add_type_declaration (new CCodeNewline ());
var macro = "(%s_get_type ())".printf (iface.get_lower_case_cname (null));
@@ -61,12 +60,9 @@ internal class Vala.GTypeModule : GErrorModule {
decl_space.add_type_declaration (new CCodeMacroReplacement ("%s_GET_INTERFACE(obj)".printf (iface.get_upper_case_cname (null)), macro));
decl_space.add_type_declaration (new CCodeNewline ());
+ decl_space.add_type_declaration (new CCodeTypeDefinition ("struct _%s".printf (iface.get_cname ()), new CCodeVariableDeclarator (iface.get_cname ())));
+ decl_space.add_type_declaration (new CCodeTypeDefinition ("struct %s".printf (type_struct.name), new CCodeVariableDeclarator (iface.get_type_cname ())));
- if (iface.source_reference.file.cycle == null) {
- decl_space.add_type_declaration (new CCodeTypeDefinition ("struct _%s".printf (iface.get_cname ()), new CCodeVariableDeclarator (iface.get_cname ())));
- decl_space.add_type_declaration (new CCodeTypeDefinition ("struct %s".printf (type_struct.name), new CCodeVariableDeclarator (iface.get_type_cname ())));
- }
-
type_struct.add_field ("GTypeInterface", "parent_iface");
if (iface.source_reference.comment != null) {
@@ -74,17 +70,87 @@ internal class Vala.GTypeModule : GErrorModule {
}
decl_space.add_type_definition (type_struct);
+ foreach (Method m in iface.get_methods ()) {
+ if ((!m.is_abstract && !m.is_virtual) || m.coroutine) {
+ continue;
+ }
+
+ // add vfunc field to the type struct
+ var vdeclarator = new CCodeFunctionDeclarator (m.vfunc_name);
+ var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
+
+ generate_cparameters (m, decl_space, cparam_map, new CCodeFunction ("fake"), vdeclarator);
+
+ var vdecl = new CCodeDeclaration (m.return_type.get_cname ());
+ vdecl.add_declarator (vdeclarator);
+ type_struct.add_declaration (vdecl);
+ }
+
+ foreach (Property prop in iface.get_properties ()) {
+ if (!prop.is_abstract && !prop.is_virtual) {
+ continue;
+ }
+
+ var t = (ObjectTypeSymbol) prop.parent_symbol;
+
+ bool returns_real_struct = prop.property_type.is_real_struct_type ();
+
+ var this_type = new ObjectType (t);
+ var cselfparam = new CCodeFormalParameter ("self", this_type.get_cname ());
+ CCodeFormalParameter cvalueparam;
+ if (returns_real_struct) {
+ cvalueparam = new CCodeFormalParameter ("value", prop.property_type.get_cname () + "*");
+ } else {
+ cvalueparam = new CCodeFormalParameter ("value", prop.property_type.get_cname ());
+ }
+
+ if (prop.get_accessor != null) {
+ var vdeclarator = new CCodeFunctionDeclarator ("get_%s".printf (prop.name));
+ vdeclarator.add_parameter (cselfparam);
+ string creturn_type;
+ if (returns_real_struct) {
+ vdeclarator.add_parameter (cvalueparam);
+ creturn_type = "void";
+ } else {
+ creturn_type = prop.property_type.get_cname ();
+ }
+ var vdecl = new CCodeDeclaration (creturn_type);
+ vdecl.add_declarator (vdeclarator);
+ type_struct.add_declaration (vdecl);
+ }
+ if (prop.set_accessor != null) {
+ var vdeclarator = new CCodeFunctionDeclarator ("set_%s".printf (prop.name));
+ vdeclarator.add_parameter (cselfparam);
+ vdeclarator.add_parameter (cvalueparam);
+ var vdecl = new CCodeDeclaration ("void");
+ vdecl.add_declarator (vdeclarator);
+ type_struct.add_declaration (vdecl);
+ }
+ }
+
+ var type_fun = new InterfaceRegisterFunction (iface, context);
+ type_fun.init_from_type ();
+ decl_space.add_type_member_declaration (type_fun.get_declaration ());
+ }
+
+ public override void visit_interface (Interface iface) {
+ current_symbol = iface;
+ current_type_symbol = iface;
+
+ if (iface.get_cname().len () < 3) {
+ iface.error = true;
+ Report.error (iface.source_reference, "Interface name `%s' is too short".printf (iface.get_cname ()));
+ return;
+ }
+
+ generate_interface_declaration (iface, source_declarations);
+
iface.accept_children (codegen);
add_interface_base_init_function (iface);
var type_fun = new InterfaceRegisterFunction (iface, context);
type_fun.init_from_type ();
- if (iface.access != SymbolAccessibility.PRIVATE) {
- header_declarations.add_type_member_declaration (type_fun.get_declaration ());
- } else {
- source_declarations.add_type_member_declaration (type_fun.get_declaration ());
- }
source_type_member_definition.append (type_fun.get_definition ());
current_type_symbol = null;
@@ -143,24 +209,13 @@ internal class Vala.GTypeModule : GErrorModule {
public override void visit_struct (Struct st) {
base.visit_struct (st);
- CCodeDeclarationSpace decl_space;
- if (st.access != SymbolAccessibility.PRIVATE) {
- decl_space = header_declarations;
- } else {
- decl_space = source_declarations;
- }
-
- decl_space.add_type_declaration (new CCodeNewline ());
+ source_declarations.add_type_declaration (new CCodeNewline ());
var macro = "(%s_get_type ())".printf (st.get_lower_case_cname (null));
- decl_space.add_type_declaration (new CCodeMacroReplacement (st.get_type_id (), macro));
+ source_declarations.add_type_declaration (new CCodeMacroReplacement (st.get_type_id (), macro));
var type_fun = new StructRegisterFunction (st, context);
type_fun.init_from_type (false);
- if (st.access != SymbolAccessibility.PRIVATE) {
- header_declarations.add_type_member_declaration (type_fun.get_declaration ());
- } else {
- source_declarations.add_type_member_declaration (type_fun.get_declaration ());
- }
+ source_declarations.add_type_member_declaration (type_fun.get_declaration ());
source_type_member_definition.append (type_fun.get_definition ());
}
}