From: Juerg Billeter Date: Thu, 26 Jul 2007 06:00:40 +0000 (+0000) Subject: use GSlice and generate free function for reference-type structs with a X-Git-Tag: VALA_0_1_2~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2ebb31c9cdc98e6fe279e42f799f02a5ce5eed1b;p=thirdparty%2Fvala.git use GSlice and generate free function for reference-type structs with a 2007-07-26 Juerg Billeter * vala/valastruct.vala, gobject/valacodegeneratormethod.vala, gobject/valacodegeneratorstruct.vala: use GSlice and generate free function for reference-type structs with a creation method svn path=/trunk/; revision=389 --- diff --git a/ChangeLog b/ChangeLog index 3c0345203..ab9a829fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-07-26 Jürg Billeter + + * vala/valastruct.vala, gobject/valacodegeneratormethod.vala, + gobject/valacodegeneratorstruct.vala: use GSlice and generate free + function for reference-type structs with a creation method + 2007-07-25 Jürg Billeter * vala/valaarray.vala: remove comments of overridden methods diff --git a/gobject/valacodegeneratormethod.vala b/gobject/valacodegeneratormethod.vala index a53629269..8ca562288 100644 --- a/gobject/valacodegeneratormethod.vala +++ b/gobject/valacodegeneratormethod.vala @@ -294,9 +294,8 @@ public class Vala.CodeGenerator { } else { var st = (Struct) m.parent_symbol; var cdecl = new CCodeDeclaration (st.get_cname () + "*"); - var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_new0")); - ccall.add_argument (new CCodeConstant (st.get_cname ())); - ccall.add_argument (new CCodeConstant ("1")); + var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_slice_new0")); + ccall.add_argument (new CCodeIdentifier (st.get_cname ())); cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("self", ccall)); cinit.append (cdecl); } diff --git a/gobject/valacodegeneratorstruct.vala b/gobject/valacodegeneratorstruct.vala index 4a4aeab45..2b9e6f3ed 100644 --- a/gobject/valacodegeneratorstruct.vala +++ b/gobject/valacodegeneratorstruct.vala @@ -30,7 +30,7 @@ public class Vala.CodeGenerator { var old_instance_dispose_fragment = instance_dispose_fragment; current_type_symbol = st; instance_struct = new CCodeStruct ("_%s".printf (st.get_cname ())); - instance_dispose_fragment = null; + instance_dispose_fragment = new CCodeFragment (); CCodeFragment decl_frag; CCodeFragment def_frag; @@ -53,6 +53,30 @@ public class Vala.CodeGenerator { st.accept_children (this); + if (st.default_construction_method != null) { + var function = new CCodeFunction (st.get_lower_case_cprefix () + "free", "void"); + if (st.access == MemberAccessibility.PRIVATE) { + function.modifiers = CCodeModifiers.STATIC; + } + + function.add_parameter (new CCodeFormalParameter ("self", st.get_cname () + "*")); + + decl_frag.append (function.copy ()); + + var cblock = new CCodeBlock (); + + cblock.add_statement (instance_dispose_fragment); + + var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_slice_free")); + ccall.add_argument (new CCodeIdentifier (st.get_cname ())); + ccall.add_argument (new CCodeIdentifier ("self")); + cblock.add_statement (new CCodeExpressionStatement (ccall)); + + function.block = cblock; + + def_frag.append (function); + } + current_type_symbol = old_type_symbol; instance_struct = old_instance_struct; instance_dispose_fragment = old_instance_dispose_fragment; diff --git a/vala/valastruct.vala b/vala/valastruct.vala index f5841948b..dcfdf4d4f 100644 --- a/vala/valastruct.vala +++ b/vala/valastruct.vala @@ -333,7 +333,11 @@ public class Vala.Struct : DataType { public override string get_free_function () { if (free_function == null) { - Report.error (source_reference, "The type `%s` doesn't contain a free function".printf (get_full_name ())); + if (default_construction_method != null) { + free_function = get_lower_case_cprefix () + "free"; + } else { + Report.error (source_reference, "The type `%s` doesn't contain a free function".printf (get_full_name ())); + } } return free_function; }