[vala] GType: Fix C warnings for methods in interface_init
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] GType: Fix C warnings for methods in interface_init
- Date: Fri, 25 Sep 2009 16:58:03 +0000 (UTC)
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]