From: Jürg Billeter Date: Fri, 19 Dec 2008 14:49:31 +0000 (+0000) Subject: Use closure struct to declare and initialize local variables in coroutines X-Git-Tag: VALA_0_5_4~68 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b870c2b88cca16b9bfa01db164bad9abc3370602;p=thirdparty%2Fvala.git Use closure struct to declare and initialize local variables in coroutines 2008-12-19 Jürg Billeter * gobject/valaccodebasemodule.vala: * gobject/valagasyncmodule.vala: Use closure struct to declare and initialize local variables in coroutines svn path=/trunk/; revision=2223 --- diff --git a/ChangeLog b/ChangeLog index 0eb120d43..483d5070a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-12-19 Jürg Billeter + + * gobject/valaccodebasemodule.vala: + * gobject/valagasyncmodule.vala: + + Use closure struct to declare and initialize local variables in + coroutines + 2008-12-19 Jürg Billeter * gobject/valaccodebasemodule.vala: diff --git a/gobject/valaccodebasemodule.vala b/gobject/valaccodebasemodule.vala index 32df45777..4cb036822 100644 --- a/gobject/valaccodebasemodule.vala +++ b/gobject/valaccodebasemodule.vala @@ -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; diff --git a/gobject/valagasyncmodule.vala b/gobject/valagasyncmodule.vala index dc9722860..38fffdafc 100644 --- a/gobject/valagasyncmodule.vala +++ b/gobject/valagasyncmodule.vala @@ -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