[vala] GType: Fix C warnings for methods in interface_init



commit 0cd3a9b49381011af6dfe6199de4147eaaf712a5
Author: Didier 'Ptitjes <ptitjes free fr>
Date:   Fri Sep 25 14:50:37 2009 +0200

    GType: Fix C warnings for methods in interface_init

 codegen/valagtypemodule.vala |   67 +++++++++++++++++++++++-------------------
 1 files changed, 37 insertions(+), 30 deletions(-)
---
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index 9a92b63..aa431d0 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -1158,6 +1158,7 @@ internal class Vala.GTypeModule : GErrorModule {
 			if (m.overrides || !m.coroutine) {
 				var ccast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (((Class) base_type).get_upper_case_cname (null))));
 				ccast.add_argument (new CCodeIdentifier ("klass"));
+
 				init_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (ccast, m.base_method.vfunc_name), new CCodeIdentifier (m.get_real_cname ()))));
 
 				if (m.coroutine) {
@@ -1271,35 +1272,7 @@ internal class Vala.GTypeModule : GErrorModule {
 			CCodeExpression cfunc;
 			if (m.is_abstract || m.is_virtual) {
 				cfunc = new CCodeIdentifier (m.get_cname ());
-				// Cast the function pointer to match the interface
-				string cast = m.return_type.get_cname () + " (*)";
-				string cast_args = iface.get_cname () + "*";
-
-				var vdeclarator = new CCodeFunctionDeclarator (m.vfunc_name);
-				var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
-
-				generate_cparameters (m, source_declarations, cparam_map, new CCodeFunction ("fake"), vdeclarator);
-
-				// append C arguments in the right order
-				int last_pos = -1;
-				int min_pos;
-				while (true) {
-					min_pos = -1;
-					foreach (int pos in cparam_map.get_keys ()) {
-						if (pos > last_pos && (min_pos == -1 || pos < min_pos)) {
-							min_pos = pos;
-						}
-					}
-					if (last_pos != -1) { // Skip the 1st parameter
-						if (min_pos == -1) {
-							break;
-						}
-						cast_args += " ," + cparam_map.get (min_pos).type_name;
-					}
-					last_pos = min_pos;
-				}
-				cast += "(" + cast_args + ")";
-				cfunc = new CCodeCastExpression (cfunc, cast);
+				cfunc = cast_method_pointer (m, cfunc, iface);
 			} else {
 				cfunc = new CCodeIdentifier (m.get_real_cname ());
 			}
@@ -1331,8 +1304,10 @@ internal class Vala.GTypeModule : GErrorModule {
 
 					generate_method_declaration (base_method, source_declarations);
 
+					CCodeExpression cfunc = new CCodeIdentifier (base_method.get_cname ());
+					cfunc = cast_method_pointer (base_method, cfunc, iface);
 					var ciface = new CCodeIdentifier ("iface");
-					init_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (ciface, m.vfunc_name), new CCodeIdentifier (base_method.get_cname ()))));
+					init_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (ciface, m.vfunc_name), cfunc)));
 				}
 			}
 		}
@@ -1434,6 +1409,38 @@ internal class Vala.GTypeModule : GErrorModule {
 		return new CCodeCastExpression (cfunc, cast);
 	}
 
+	CCodeExpression cast_method_pointer (Method m, CCodeExpression cfunc, ObjectTypeSymbol base_type) {
+		// Cast the function pointer to match the interface
+		string cast = m.return_type.get_cname () + " (*)";
+		string cast_args = base_type.get_cname () + "*";
+
+		var vdeclarator = new CCodeFunctionDeclarator (m.vfunc_name);
+		var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
+
+		generate_cparameters (m, source_declarations, cparam_map, new CCodeFunction ("fake"), vdeclarator);
+
+		// append C arguments in the right order
+		int last_pos = -1;
+		int min_pos;
+		while (true) {
+			min_pos = -1;
+			foreach (int pos in cparam_map.get_keys ()) {
+				if (pos > last_pos && (min_pos == -1 || pos < min_pos)) {
+					min_pos = pos;
+				}
+			}
+			if (last_pos != -1) { // Skip the 1st parameter
+				if (min_pos == -1) {
+					break;
+				}
+				cast_args += " ," + cparam_map.get (min_pos).type_name;
+			}
+			last_pos = min_pos;
+		}
+		cast += "(" + cast_args + ")";
+		return new CCodeCastExpression (cfunc, cast);
+	}
+
 	private void add_instance_init_function (Class cl) {
 		var instance_init = new CCodeFunction ("%s_instance_init".printf (cl.get_lower_case_cname (null)), "void");
 		instance_init.add_parameter (new CCodeFormalParameter ("self", "%s *".printf (cl.get_cname ())));



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