]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
free construction parameters in creation methods
authorJuerg Billeter <j@bitron.ch>
Fri, 27 Jul 2007 07:20:16 +0000 (07:20 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 27 Jul 2007 07:20:16 +0000 (07:20 +0000)
2007-07-27  Juerg Billeter  <j@bitron.ch>

* gobject/valacodegenerator.vala, gobject/valacodegeneratormethod.vala:
  free construction parameters in creation methods

svn path=/trunk/; revision=399

ChangeLog
gobject/valacodegenerator.vala
gobject/valacodegeneratormethod.vala

index 5d86403f1bcee18a21230493d7fa7c10f77c8cc5..7835c5f3cba557513019e8fc295b1bd7e2b23f28 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-07-27  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valacodegenerator.vala, gobject/valacodegeneratormethod.vala:
+         free construction parameters in creation methods
+
 2007-07-27  Jürg Billeter  <j@bitron.ch>
 
        * vala/valadostatement.vala, vala/valaforeachstatement.vala,
index 358c21369ef0470096dd87b310e4636a2669181e..43967442538167f50eb4af6b058af92697df3de3 100644 (file)
@@ -678,28 +678,6 @@ public class Vala.CodeGenerator : CodeVisitor {
                current_symbol = b;
        }
 
-       private void add_object_creation (CCodeBlock! b, bool has_params) {
-               var cl = (Class) current_type_symbol;
-       
-               var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_object_newv"));
-               ccall.add_argument (new CCodeConstant (cl.get_type_id ()));
-               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"));
-               }
-               
-               var cdecl = new CCodeVariableDeclarator ("self");
-               cdecl.initializer = ccall;
-               
-               var cdeclaration = new CCodeDeclaration ("%s *".printf (cl.get_cname ()));
-               cdeclaration.add_declarator (cdecl);
-               
-               b.add_statement (cdeclaration);
-       }
-
        public override void visit_end_block (Block! b) {
                var local_vars = b.get_local_variables ();
                foreach (VariableDeclarator decl in local_vars) {
index 8ca5622883d697b8dddfec00c3edd96d3b41cb0f..252e83707ead330461655b156d90954cae43b13d 100644 (file)
@@ -360,6 +360,20 @@ public class Vala.CodeGenerator {
                }
                
                if (m is CreationMethod) {
+                       if (((CreationMethod) m).n_construction_params > 0) {
+                               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"))));
+                               var cunsetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_unset"));
+                               cunsetcall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeMemberAccess.pointer (new CCodeIdentifier ("__params_it"), "value")));
+                               cdofreeparam.add_statement (new CCodeExpressionStatement (cunsetcall));
+                               function.block.add_statement (new CCodeWhileStatement (ccond, cdofreeparam));
+
+                               var cfreeparams = new CCodeFunctionCall (new CCodeIdentifier ("g_free"));
+                               cfreeparams.add_argument (new CCodeIdentifier ("__params"));
+                               function.block.add_statement (new CCodeExpressionStatement (cfreeparams));
+                       }
+
                        var creturn = new CCodeReturnStatement ();
                        creturn.return_expression = new CCodeIdentifier ("self");
                        function.block.add_statement (creturn);
@@ -529,5 +543,27 @@ public class Vala.CodeGenerator {
                args_parameter = true;
                return true;
        }
+
+       private void add_object_creation (CCodeBlock! b, bool has_params) {
+               var cl = (Class) current_type_symbol;
+       
+               var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_object_newv"));
+               ccall.add_argument (new CCodeConstant (cl.get_type_id ()));
+               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"));
+               }
+               
+               var cdecl = new CCodeVariableDeclarator ("self");
+               cdecl.initializer = ccall;
+               
+               var cdeclaration = new CCodeDeclaration ("%s *".printf (cl.get_cname ()));
+               cdeclaration.add_declarator (cdecl);
+               
+               b.add_statement (cdeclaration);
+       }
 }