[vala] Fix interfaces in GTypeModule-based plugins



commit 0b2eb293b5f57e455e2ac5ac4ffb303e8ca93682
Author: Rob Powell <rob yorba org>
Date:   Wed Jan 6 23:08:36 2010 +0100

    Fix interfaces in GTypeModule-based plugins
    
    Fixes bug 601343.

 codegen/valaclassregisterfunction.vala         |   22 +++++++++++++++-------
 codegen/valadbusinterfaceregisterfunction.vala |    4 ++--
 codegen/valagtypemodule.vala                   |    5 +++--
 codegen/valainterfaceregisterfunction.vala     |    2 +-
 codegen/valastructregisterfunction.vala        |    2 +-
 codegen/valatyperegisterfunction.vala          |    6 +++---
 6 files changed, 25 insertions(+), 16 deletions(-)
---
diff --git a/codegen/valaclassregisterfunction.vala b/codegen/valaclassregisterfunction.vala
index 1e299e7..f73e960 100644
--- a/codegen/valaclassregisterfunction.vala
+++ b/codegen/valaclassregisterfunction.vala
@@ -171,7 +171,7 @@ public class Vala.ClassRegisterFunction : TypeRegisterFunction {
 		return frag;
 	}
 
-	public override CCodeFragment get_type_interface_init_statements () {
+	public override CCodeFragment get_type_interface_init_statements (bool plugin) {
 		var frag = new CCodeFragment ();
 		
 		foreach (DataType base_type in class_reference.get_base_types ()) {
@@ -182,12 +182,20 @@ public class Vala.ClassRegisterFunction : TypeRegisterFunction {
 			var iface = (Interface) base_type.data_type;
 			
 			var iface_info_name = "%s_info".printf (iface.get_lower_case_cname (null));
-			
-			var reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_add_interface_static"));
-			reg_call.add_argument (new CCodeIdentifier ("%s_type_id".printf (class_reference.get_lower_case_cname (null))));
-			reg_call.add_argument (new CCodeIdentifier (iface.get_type_id ()));
-			reg_call.add_argument (new CCodeIdentifier ("&%s".printf (iface_info_name)));
-			frag.append (new CCodeExpressionStatement (reg_call));
+			if (!plugin) {
+				var reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_add_interface_static"));
+				reg_call.add_argument (new CCodeIdentifier ("%s_type_id".printf (class_reference.get_lower_case_cname (null))));
+				reg_call.add_argument (new CCodeIdentifier (iface.get_type_id ()));
+				reg_call.add_argument (new CCodeIdentifier ("&%s".printf (iface_info_name)));
+				frag.append (new CCodeExpressionStatement (reg_call));
+			} else {
+				var reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_module_add_interface"));
+				reg_call.add_argument (new CCodeIdentifier ("module"));
+				reg_call.add_argument (new CCodeIdentifier ("%s_type_id".printf (class_reference.get_lower_case_cname (null))));
+				reg_call.add_argument (new CCodeIdentifier (iface.get_type_id ()));
+				reg_call.add_argument (new CCodeIdentifier ("&%s".printf (iface_info_name)));
+				frag.append (new CCodeExpressionStatement (reg_call));
+			}
 		}
 		
 		return frag;
diff --git a/codegen/valadbusinterfaceregisterfunction.vala b/codegen/valadbusinterfaceregisterfunction.vala
index 2eec948..9aa2ec3 100644
--- a/codegen/valadbusinterfaceregisterfunction.vala
+++ b/codegen/valadbusinterfaceregisterfunction.vala
@@ -31,8 +31,8 @@ public class Vala.DBusInterfaceRegisterFunction : InterfaceRegisterFunction {
 		base(iface, context);
 	}
 
-	public override CCodeFragment get_type_interface_init_statements () {
-		var frag = base.get_type_interface_init_statements ();
+	public override CCodeFragment get_type_interface_init_statements (bool plugin) {
+		var frag = base.get_type_interface_init_statements (plugin);
 		
 		var quark_dbus_proxy = new CCodeFunctionCall (new CCodeIdentifier ("g_quark_from_string"));
 		quark_dbus_proxy.add_argument (new CCodeConstant ("\"ValaDBusInterfaceProxyType\""));
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index 0acde87..a7c69ae 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -1822,7 +1822,7 @@ internal class Vala.GTypeModule : GErrorModule {
 		decl_space.add_type_definition (type_struct);
 
 		var type_fun = create_interface_register_function (iface);
-		type_fun.init_from_type ();
+		type_fun.init_from_type (in_plugin);
 		decl_space.add_type_member_declaration (type_fun.get_declaration ());
 	}
 
@@ -1849,7 +1849,8 @@ internal class Vala.GTypeModule : GErrorModule {
 		add_interface_base_init_function (iface);
 
 		var type_fun = create_interface_register_function (iface);
-		type_fun.init_from_type ();
+		type_fun.init_from_type (in_plugin);
+		source_declarations.add_type_member_declaration (type_fun.get_source_declaration ());
 		source_type_member_definition.append (type_fun.get_definition ());
 
 		current_symbol = old_symbol;
diff --git a/codegen/valainterfaceregisterfunction.vala b/codegen/valainterfaceregisterfunction.vala
index a3dd1a2..500e7ee 100644
--- a/codegen/valainterfaceregisterfunction.vala
+++ b/codegen/valainterfaceregisterfunction.vala
@@ -77,7 +77,7 @@ public class Vala.InterfaceRegisterFunction : TypeRegisterFunction {
 		return interface_reference.access;
 	}
 
-	public override CCodeFragment get_type_interface_init_statements () {
+	public override CCodeFragment get_type_interface_init_statements (bool plugin) {
 		var frag = new CCodeFragment ();
 		
 		/* register all prerequisites */
diff --git a/codegen/valastructregisterfunction.vala b/codegen/valastructregisterfunction.vala
index 210a995..1f79fdb 100644
--- a/codegen/valastructregisterfunction.vala
+++ b/codegen/valastructregisterfunction.vala
@@ -50,7 +50,7 @@ public class Vala.StructRegisterFunction : TypeRegisterFunction {
 		return struct_reference.access;
 	}
 
-	public override CCodeFragment get_type_interface_init_statements () {
+	public override CCodeFragment get_type_interface_init_statements (bool plugin) {
 		return new CCodeFragment ();
 	}
 }
diff --git a/codegen/valatyperegisterfunction.vala b/codegen/valatyperegisterfunction.vala
index 736883f..4b4ffcb 100644
--- a/codegen/valatyperegisterfunction.vala
+++ b/codegen/valatyperegisterfunction.vala
@@ -35,7 +35,7 @@ public abstract class Vala.TypeRegisterFunction {
 	/**
 	 * Constructs the C function from the specified type.
 	 */
-	public void init_from_type (bool plugin = false) {
+	public void init_from_type (bool plugin) {
 		bool use_thread_safe = context.require_glib_version (2, 14);
 
 		bool fundamental = false;
@@ -169,7 +169,7 @@ public abstract class Vala.TypeRegisterFunction {
 			type_init.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier (type_id_name), reg_call)));
 		}
 		
-		type_init.add_statement (get_type_interface_init_statements ());
+		type_init.add_statement (get_type_interface_init_statements (plugin));
 
 		if (!plugin) {
 			CCodeExpression condition; // the condition that guards the type initialisation
@@ -364,7 +364,7 @@ public abstract class Vala.TypeRegisterFunction {
 	 *
 	 * @return C statements
 	 */
-	public abstract CCodeFragment get_type_interface_init_statements ();
+	public abstract CCodeFragment get_type_interface_init_statements (bool plugin);
 	
 	public CCodeFragment get_source_declaration () {
 		return source_declaration_fragment;



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