From: Jürg Billeter Date: Fri, 19 Dec 2008 14:06:19 +0000 (+0000) Subject: Use closure struct to access local variables and parameters in coroutines X-Git-Tag: VALA_0_5_4~70 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c1bb593ef8e05c0edc84d459fa98af3ef0883e43;p=thirdparty%2Fvala.git Use closure struct to access local variables and parameters in coroutines 2008-12-19 Jürg Billeter * gobject/valaccodememberaccessmodule.vala: Use closure struct to access local variables and parameters in coroutines svn path=/trunk/; revision=2221 --- diff --git a/ChangeLog b/ChangeLog index 8f76942e4..fcda8654f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-12-19 Jürg Billeter + + * gobject/valaccodememberaccessmodule.vala: + + Use closure struct to access local variables and parameters in + coroutines + 2008-12-19 Jürg Billeter * gobject/valadbusservermodule.vala: diff --git a/gobject/valaccodememberaccessmodule.vala b/gobject/valaccodememberaccessmodule.vala index 15205516e..8741e9bdf 100644 --- a/gobject/valaccodememberaccessmodule.vala +++ b/gobject/valaccodememberaccessmodule.vala @@ -250,32 +250,47 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { expr.ccodenode = new CCodeConstant (ev.get_cname ()); } else if (expr.symbol_reference is LocalVariable) { var local = (LocalVariable) expr.symbol_reference; - expr.ccodenode = new CCodeIdentifier (get_variable_cname (local.name)); + if (current_method != null && current_method.coroutine) { + // use closure + expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (local.name)); + } else { + expr.ccodenode = new CCodeIdentifier (get_variable_cname (local.name)); + } } else if (expr.symbol_reference is FormalParameter) { var p = (FormalParameter) expr.symbol_reference; if (p.name == "this") { - var st = current_type_symbol as Struct; - if (st != null && !st.is_simple_type ()) { - expr.ccodenode = new CCodeIdentifier ("(*self)"); + if (current_method != null && current_method.coroutine) { + // use closure + expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self"); } else { - expr.ccodenode = new CCodeIdentifier ("self"); + var st = current_type_symbol as Struct; + if (st != null && !st.is_simple_type ()) { + expr.ccodenode = new CCodeIdentifier ("(*self)"); + } else { + expr.ccodenode = new CCodeIdentifier ("self"); + } } } else { - var type_as_struct = p.parameter_type.data_type as Struct; - if (p.direction != ParameterDirection.IN - || (type_as_struct != null && !type_as_struct.is_simple_type () && !p.parameter_type.nullable)) { - expr.ccodenode = new CCodeIdentifier ("(*%s)".printf (p.name)); + if (current_method != null && current_method.coroutine) { + // use closure + expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), p.name); } else { - // Property setters of non simple structs shall replace all occurences - // of the "value" formal parameter with a dereferencing version of that - // parameter. - if (current_property_accessor != null && - current_property_accessor.writable && - current_property_accessor.value_parameter == p && - current_property_accessor.prop.property_type.is_real_struct_type ()) { - expr.ccodenode = new CCodeIdentifier ("(*value)"); + var type_as_struct = p.parameter_type.data_type as Struct; + if (p.direction != ParameterDirection.IN + || (type_as_struct != null && !type_as_struct.is_simple_type () && !p.parameter_type.nullable)) { + expr.ccodenode = new CCodeIdentifier ("(*%s)".printf (p.name)); } else { - expr.ccodenode = new CCodeIdentifier (p.name); + // Property setters of non simple structs shall replace all occurences + // of the "value" formal parameter with a dereferencing version of that + // parameter. + if (current_property_accessor != null && + current_property_accessor.writable && + current_property_accessor.value_parameter == p && + current_property_accessor.prop.property_type.is_real_struct_type ()) { + expr.ccodenode = new CCodeIdentifier ("(*value)"); + } else { + expr.ccodenode = new CCodeIdentifier (p.name); + } } } }