[vala] Fix chaining up constructors in generic classes
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] Fix chaining up constructors in generic classes
- Date: Wed, 29 Jul 2009 20:36:00 +0000 (UTC)
commit a130a8c85e85bb32a4dfa0cc4baa6302584e09ce
Author: Jürg Billeter <j bitron ch>
Date: Wed Jul 29 22:32:47 2009 +0200
Fix chaining up constructors in generic classes
codegen/valaccodemethodcallmodule.vala | 23 +++++++++
codegen/valaccodemethodmodule.vala | 85 ++++++++++++++++---------------
2 files changed, 67 insertions(+), 41 deletions(-)
---
diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala
index cd06e37..94862ef 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -225,6 +225,29 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
head.generate_dynamic_method_wrapper ((DynamicMethod) m);
} else if (m is CreationMethod && context.profile == Profile.GOBJECT) {
ccall_expr = new CCodeAssignment (new CCodeIdentifier ("self"), new CCodeCastExpression (ccall, current_class.get_cname () + "*"));
+
+ if (!current_class.is_compact && current_class.get_type_parameters ().size > 0) {
+ var ccomma = new CCodeCommaExpression ();
+ ccomma.append_expression (ccall_expr);
+
+ /* type, dup func, and destroy func fields for generic types */
+ foreach (TypeParameter type_param in current_class.get_type_parameters ()) {
+ CCodeIdentifier param_name;
+
+ var priv_access = new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv");
+
+ param_name = new CCodeIdentifier ("%s_type".printf (type_param.name.down ()));
+ ccomma.append_expression (new CCodeAssignment (new CCodeMemberAccess.pointer (priv_access, param_name.name), param_name));
+
+ param_name = new CCodeIdentifier ("%s_dup_func".printf (type_param.name.down ()));
+ ccomma.append_expression (new CCodeAssignment (new CCodeMemberAccess.pointer (priv_access, param_name.name), param_name));
+
+ param_name = new CCodeIdentifier ("%s_destroy_func".printf (type_param.name.down ()));
+ ccomma.append_expression (new CCodeAssignment (new CCodeMemberAccess.pointer (priv_access, param_name.name), param_name));
+ }
+
+ ccall_expr = ccomma;
+ }
}
bool ellipsis = false;
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala
index 54faf5b..83dc225 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -473,37 +473,39 @@ internal class Vala.CCodeMethodModule : CCodeStructModule {
if (in_gobject_creation_method) {
int n_params = ((CreationMethod) m).n_construction_params;
- if (n_params > 0 || current_class.get_type_parameters ().size > 0) {
- // declare construction parameter array
- var cparamsinit = new CCodeFunctionCall (new CCodeIdentifier ("g_new0"));
- cparamsinit.add_argument (new CCodeIdentifier ("GParameter"));
- cparamsinit.add_argument (new CCodeConstant ((n_params + 3 * current_class.get_type_parameters ().size).to_string ()));
+ if (!((CreationMethod) m).chain_up) {
+ if (n_params > 0 || current_class.get_type_parameters ().size > 0) {
+ // declare construction parameter array
+ var cparamsinit = new CCodeFunctionCall (new CCodeIdentifier ("g_new0"));
+ cparamsinit.add_argument (new CCodeIdentifier ("GParameter"));
+ cparamsinit.add_argument (new CCodeConstant ((n_params + 3 * current_class.get_type_parameters ().size).to_string ()));
- var cdecl = new CCodeDeclaration ("GParameter *");
- cdecl.add_declarator (new CCodeVariableDeclarator ("__params", cparamsinit));
- cinit.append (cdecl);
+ var cdecl = new CCodeDeclaration ("GParameter *");
+ cdecl.add_declarator (new CCodeVariableDeclarator ("__params", cparamsinit));
+ cinit.append (cdecl);
- cdecl = new CCodeDeclaration ("GParameter *");
- cdecl.add_declarator (new CCodeVariableDeclarator ("__params_it", new CCodeIdentifier ("__params")));
- cinit.append (cdecl);
- }
+ cdecl = new CCodeDeclaration ("GParameter *");
+ cdecl.add_declarator (new CCodeVariableDeclarator ("__params_it", new CCodeIdentifier ("__params")));
+ cinit.append (cdecl);
+ }
- /* type, dup func, and destroy func properties for generic types */
- foreach (TypeParameter type_param in current_class.get_type_parameters ()) {
- CCodeConstant prop_name;
- CCodeIdentifier param_name;
+ /* type, dup func, and destroy func properties for generic types */
+ foreach (TypeParameter type_param in current_class.get_type_parameters ()) {
+ CCodeConstant prop_name;
+ CCodeIdentifier param_name;
- prop_name = new CCodeConstant ("\"%s-type\"".printf (type_param.name.down ()));
- param_name = new CCodeIdentifier ("%s_type".printf (type_param.name.down ()));
- cinit.append (new CCodeExpressionStatement (get_construct_property_assignment (prop_name, new IntegerType ((Struct) gtype_type), param_name)));
+ prop_name = new CCodeConstant ("\"%s-type\"".printf (type_param.name.down ()));
+ param_name = new CCodeIdentifier ("%s_type".printf (type_param.name.down ()));
+ cinit.append (new CCodeExpressionStatement (get_construct_property_assignment (prop_name, new IntegerType ((Struct) gtype_type), param_name)));
- prop_name = new CCodeConstant ("\"%s-dup-func\"".printf (type_param.name.down ()));
- param_name = new CCodeIdentifier ("%s_dup_func".printf (type_param.name.down ()));
- cinit.append (new CCodeExpressionStatement (get_construct_property_assignment (prop_name, new PointerType (new VoidType ()), param_name)));
+ prop_name = new CCodeConstant ("\"%s-dup-func\"".printf (type_param.name.down ()));
+ param_name = new CCodeIdentifier ("%s_dup_func".printf (type_param.name.down ()));
+ cinit.append (new CCodeExpressionStatement (get_construct_property_assignment (prop_name, new PointerType (new VoidType ()), param_name)));
- prop_name = new CCodeConstant ("\"%s-destroy-func\"".printf (type_param.name.down ()));
- param_name = new CCodeIdentifier ("%s_destroy_func".printf (type_param.name.down ()));
- cinit.append (new CCodeExpressionStatement (get_construct_property_assignment (prop_name, new PointerType (new VoidType ()), param_name)));
+ prop_name = new CCodeConstant ("\"%s-destroy-func\"".printf (type_param.name.down ()));
+ param_name = new CCodeIdentifier ("%s_destroy_func".printf (type_param.name.down ()));
+ cinit.append (new CCodeExpressionStatement (get_construct_property_assignment (prop_name, new PointerType (new VoidType ()), param_name)));
+ }
}
} else if (is_gtypeinstance_creation_method (m)) {
var cl = (Class) m.parent_symbol;
@@ -517,26 +519,26 @@ internal class Vala.CCodeMethodModule : CCodeStructModule {
var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_type_create_instance"));
ccall.add_argument (new CCodeIdentifier ("object_type"));
cdecl.initializer = new CCodeCastExpression (ccall, cl.get_cname () + "*");
- }
- /* type, dup func, and destroy func fields for generic types */
- foreach (TypeParameter type_param in current_class.get_type_parameters ()) {
- CCodeIdentifier param_name;
- CCodeAssignment assign;
+ /* type, dup func, and destroy func fields for generic types */
+ foreach (TypeParameter type_param in current_class.get_type_parameters ()) {
+ CCodeIdentifier param_name;
+ CCodeAssignment assign;
- var priv_access = new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv");
+ var priv_access = new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv");
- param_name = new CCodeIdentifier ("%s_type".printf (type_param.name.down ()));
- assign = new CCodeAssignment (new CCodeMemberAccess.pointer (priv_access, param_name.name), param_name);
- cinit.append (new CCodeExpressionStatement (assign));
+ param_name = new CCodeIdentifier ("%s_type".printf (type_param.name.down ()));
+ assign = new CCodeAssignment (new CCodeMemberAccess.pointer (priv_access, param_name.name), param_name);
+ cinit.append (new CCodeExpressionStatement (assign));
- param_name = new CCodeIdentifier ("%s_dup_func".printf (type_param.name.down ()));
- assign = new CCodeAssignment (new CCodeMemberAccess.pointer (priv_access, param_name.name), param_name);
- cinit.append (new CCodeExpressionStatement (assign));
+ param_name = new CCodeIdentifier ("%s_dup_func".printf (type_param.name.down ()));
+ assign = new CCodeAssignment (new CCodeMemberAccess.pointer (priv_access, param_name.name), param_name);
+ cinit.append (new CCodeExpressionStatement (assign));
- param_name = new CCodeIdentifier ("%s_destroy_func".printf (type_param.name.down ()));
- assign = new CCodeAssignment (new CCodeMemberAccess.pointer (priv_access, param_name.name), param_name);
- cinit.append (new CCodeExpressionStatement (assign));
+ param_name = new CCodeIdentifier ("%s_destroy_func".printf (type_param.name.down ()));
+ assign = new CCodeAssignment (new CCodeMemberAccess.pointer (priv_access, param_name.name), param_name);
+ cinit.append (new CCodeExpressionStatement (assign));
+ }
}
} else if (current_type_symbol is Class) {
var cl = (Class) m.parent_symbol;
@@ -1054,7 +1056,8 @@ internal class Vala.CCodeMethodModule : CCodeStructModule {
}
if (current_type_symbol is Class && gobject_type != null && current_class.is_subtype_of (gobject_type)
- && (((CreationMethod) m).n_construction_params > 0 || current_class.get_type_parameters ().size > 0)) {
+ && (((CreationMethod) m).n_construction_params > 0 || current_class.get_type_parameters ().size > 0)
+ && !((CreationMethod) m).chain_up) {
var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, new CCodeIdentifier ("__params_it"), new CCodeIdentifier ("__params"));
var cdofreeparam = new CCodeBlock ();
cdofreeparam.add_statement (new CCodeExpressionStatement (new CCodeUnaryExpression (CCodeUnaryOperator.PREFIX_DECREMENT, new CCodeIdentifier ("__params_it"))));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]