]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Use closure struct to declare and initialize local variables in coroutines
authorJürg Billeter <j@bitron.ch>
Fri, 19 Dec 2008 14:49:31 +0000 (14:49 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 19 Dec 2008 14:49:31 +0000 (14:49 +0000)
2008-12-19  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodebasemodule.vala:
* gobject/valagasyncmodule.vala:

Use closure struct to declare and initialize local variables in
coroutines

svn path=/trunk/; revision=2223

ChangeLog
gobject/valaccodebasemodule.vala
gobject/valagasyncmodule.vala

index 0eb120d436d9909187f9e3a022dcd59c023db664..483d5070a6761b8ef881993d760646ec24d129b5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-12-19  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaccodebasemodule.vala:
+       * gobject/valagasyncmodule.vala:
+
+       Use closure struct to declare and initialize local variables in
+       coroutines
+
 2008-12-19  Jürg Billeter  <j@bitron.ch>
 
        * gobject/valaccodebasemodule.vala:
index 32df45777e64db169f0dc593364ce26c4952fc0e..4cb03682242d302a4e0b512f566b757bcde7afe8 100644 (file)
@@ -64,6 +64,7 @@ public class Vala.CCodeBaseModule : CCodeModule {
        public CCodeStruct type_struct;
        public CCodeStruct instance_priv_struct;
        public CCodeStruct type_priv_struct;
+       public CCodeStruct closure_struct;
        public CCodeEnum prop_enum;
        public CCodeEnum cenum;
        public CCodeFunction function;
@@ -1475,21 +1476,31 @@ public class Vala.CCodeBaseModule : CCodeModule {
                                rhs = ccomma;
                        }
                }
-                       
-               var cvar = new CCodeVariableDeclarator.with_initializer (get_variable_cname (local.name), rhs);
 
                var cfrag = new CCodeFragment ();
-               var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
-               cdecl.add_declarator (cvar);
-               cfrag.append (cdecl);
 
-               if (local.initializer != null && local.initializer.tree_can_fail) {
-                       head.add_simple_check (local.initializer, cfrag);
+               if (current_method != null && current_method.coroutine) {
+                       closure_struct.add_field (local.variable_type.get_cname (), get_variable_cname (local.name));
+
+                       if (local.initializer != null) {
+                               cfrag.append (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (local.name)), rhs)));
+                       }
+               } else {
+                       var cvar = new CCodeVariableDeclarator.with_initializer (get_variable_cname (local.name), rhs);
+
+                       var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
+                       cdecl.add_declarator (cvar);
+                       cfrag.append (cdecl);
+
+                       // try to initialize uninitialized variables
+                       // initialization not necessary for variables stored in closure
+                       if (cvar.initializer == null) {
+                               cvar.initializer = default_value_for_type (local.variable_type, true);
+                       }
                }
 
-               /* try to initialize uninitialized variables */
-               if (cvar.initializer == null) {
-                       cvar.initializer = default_value_for_type (local.variable_type, true);
+               if (local.initializer != null && local.initializer.tree_can_fail) {
+                       head.add_simple_check (local.initializer, cfrag);
                }
 
                local.ccodenode = cfrag;
index dc97228606668128434cdbd4eb2e3f323b399206..38fffdafc14872cc42d5595817a4253f0d0774c8 100644 (file)
@@ -29,9 +29,8 @@ public class Vala.GAsyncModule : GSignalModule {
        }
 
        public override void visit_method (Method m) {
-               base.visit_method (m);
-
                if (!m.coroutine) {
+                       base.visit_method (m);
                        return;
                }
 
@@ -42,22 +41,24 @@ public class Vala.GAsyncModule : GSignalModule {
 
                // generate struct to hold parameters, local variables, and the return value
                string dataname = Symbol.lower_case_to_camel_case (m.get_cname ()) + "Data";
-               var datastruct = new CCodeStruct ("_" + dataname);
+               closure_struct = new CCodeStruct ("_" + dataname);
 
-               datastruct.add_field ("int", "state");
-               datastruct.add_field ("GAsyncReadyCallback", "callback");
-               datastruct.add_field ("gpointer", "user_data");
-               datastruct.add_field ("GAsyncResult*", "res");
+               closure_struct.add_field ("int", "state");
+               closure_struct.add_field ("GAsyncReadyCallback", "callback");
+               closure_struct.add_field ("gpointer", "user_data");
+               closure_struct.add_field ("GAsyncResult*", "res");
 
                foreach (FormalParameter param in m.get_parameters ()) {
-                       datastruct.add_field (param.parameter_type.get_cname (), param.name);
+                       closure_struct.add_field (param.parameter_type.get_cname (), param.name);
                }
 
                if (!(m.return_type is VoidType)) {
-                       datastruct.add_field (m.return_type.get_cname (), "result");
+                       closure_struct.add_field (m.return_type.get_cname (), "result");
                }
 
-               source_type_definition.append (datastruct);
+               base.visit_method (m);
+
+               source_type_definition.append (closure_struct);
                source_type_declaration.append (new CCodeTypeDefinition ("struct _" + dataname, new CCodeVariableDeclarator (dataname)));
 
                // generate async function