From 53cc19fca4ba365992d387204356c6d5fe7cb3bb Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrg=20Billeter?= Date: Sat, 11 Oct 2008 11:08:00 +0000 Subject: [PATCH] Always chain up to base constructor when possible, add MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2008-10-11 Jürg Billeter * vala/valainterfacewriter.vala: * vala/valamethod.vala: * gobject/valaccodemethodbinding.vala: * vapigen/valagidlparser.vala: Always chain up to base constructor when possible, add has_construct_function attribute svn path=/trunk/; revision=1830 --- ChangeLog | 10 +++++++++ gobject/valaccodemethodbinding.vala | 44 +++++++++++++++++++++++++++---------- vala/valainterfacewriter.vala | 5 +++++ vala/valamethod.vala | 9 ++++++++ vapigen/valagidlparser.vala | 1 + 5 files changed, 58 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 00ffbb3..cdceb55 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2008-10-11 Jürg Billeter + * vala/valainterfacewriter.vala: + * vala/valamethod.vala: + * gobject/valaccodemethodbinding.vala: + * vapigen/valagidlparser.vala: + + Always chain up to base constructor when possible, + add has_construct_function attribute + +2008-10-11 Jürg Billeter + * vala/valaclass.vala: * vala/valacreationmethod.vala: * vala/valainterfacewriter.vala: diff --git a/gobject/valaccodemethodbinding.vala b/gobject/valaccodemethodbinding.vala index e0b2316..4c8268f 100644 --- a/gobject/valaccodemethodbinding.vala +++ b/gobject/valaccodemethodbinding.vala @@ -846,19 +846,41 @@ public class Vala.CCodeMethodBinding : CCodeBinding { private void add_object_creation (CCodeBlock b, bool has_params) { var cl = (Class) codegen.current_type_symbol; - - var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_object_newv")); - ccall.add_argument (new CCodeIdentifier ("object_type")); - if (has_params) { - ccall.add_argument (new CCodeConstant ("__params_it - __params")); - ccall.add_argument (new CCodeConstant ("__params")); - } else { - ccall.add_argument (new CCodeConstant ("0")); - ccall.add_argument (new CCodeConstant ("NULL")); + + bool chain_up = false; + CreationMethod cm = null; + if (cl.base_class != null) { + cm = cl.base_class.default_construction_method as CreationMethod; + if (cm != null && cm.get_parameters ().size == 0 + && cm.has_construct_function) { + if (!has_params) { + chain_up = true; + } + } } - + + if (!has_params && !chain_up + && cl.base_class != codegen.gobject_type) { + // possibly report warning or error about missing base call + } + var cdecl = new CCodeVariableDeclarator ("self"); - cdecl.initializer = ccall; + if (chain_up) { + var ccall = new CCodeFunctionCall (new CCodeIdentifier (cm.get_real_cname ())); + ccall.add_argument (new CCodeIdentifier ("object_type")); + cdecl.initializer = new CCodeCastExpression (ccall, "%s*".printf (cl.get_cname ())); + } else { + var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_object_newv")); + ccall.add_argument (new CCodeIdentifier ("object_type")); + if (has_params) { + ccall.add_argument (new CCodeConstant ("__params_it - __params")); + ccall.add_argument (new CCodeConstant ("__params")); + } else { + ccall.add_argument (new CCodeConstant ("0")); + ccall.add_argument (new CCodeConstant ("NULL")); + } + cdecl.initializer = ccall; + } var cdeclaration = new CCodeDeclaration ("%s *".printf (cl.get_cname ())); cdeclaration.add_declarator (cdecl); diff --git a/vala/valainterfacewriter.vala b/vala/valainterfacewriter.vala index 3a83a25..8d6d7af 100644 --- a/vala/valainterfacewriter.vala +++ b/vala/valainterfacewriter.vala @@ -802,6 +802,11 @@ public class Vala.InterfaceWriter : CodeVisitor { } if (m is CreationMethod && ((CreationMethod)m).custom_return_type_cname != null) { ccode_params.append_printf ("%stype = \"%s\"", separator, ((CreationMethod)m).custom_return_type_cname); + separator = ", "; + } + if (m is CreationMethod && !m.has_construct_function) { + ccode_params.append_printf ("%shas_construct_function = false", separator); + separator = ", "; } if (ccode_params.len > 0) { diff --git a/vala/valamethod.vala b/vala/valamethod.vala index 3f65ea7..c0fa0fa 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -194,6 +194,12 @@ public class Vala.Method : Member { */ public bool printf_format { get; set; } + /** + * Specifies whether a construct function with a GType parameter is + * available. This is only applicable to creation methods. + */ + public bool has_construct_function { get; set; default = true; } + private Gee.List parameters = new ArrayList (); private string cname; private string _vfunc_name; @@ -373,6 +379,9 @@ public class Vala.Method : Member { if (a.has_argument ("delegate_target_pos")) { cdelegate_target_parameter_position = a.get_double ("delegate_target_pos"); } + if (a.has_argument ("has_construct_function")) { + has_construct_function = a.get_bool ("has_construct_function"); + } } /** diff --git a/vapigen/valagidlparser.vala b/vapigen/valagidlparser.vala index 79ff51f..c74e291 100644 --- a/vapigen/valagidlparser.vala +++ b/vapigen/valagidlparser.vala @@ -1264,6 +1264,7 @@ public class Vala.GIdlParser : CodeVisitor { Method m; if (!is_interface && (is_constructor || name.has_prefix ("new"))) { m = new CreationMethod (null, name, current_source_reference); + m.has_construct_function = false; if (m.name == "new") { m.name = null; } else if (m.name.has_prefix ("new_")) { -- 2.7.4