From: Luca Bruno Date: Thu, 16 Jun 2011 18:22:48 +0000 (+0200) Subject: Set lvalue to inner member access having type non-nullable struct X-Git-Tag: 0.13.2~204 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=432aa6fa15086f2dfd5aa4ed54fc7b819b43315e;p=thirdparty%2Fvala.git Set lvalue to inner member access having type non-nullable struct --- diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index 5a46de05c..51978edb4 100644 --- a/vala/valamemberaccess.vala +++ b/vala/valamemberaccess.vala @@ -752,6 +752,8 @@ public class Vala.MemberAccess : Expression { inner.value_type = this_parameter.variable_type.copy (); inner.value_type.value_owned = false; inner.symbol_reference = this_parameter; + } else { + check_lvalue_struct_access (); } if (context.experimental_non_null && instance && inner.value_type.nullable && @@ -812,6 +814,26 @@ public class Vala.MemberAccess : Expression { return !error; } + private void check_lvalue_struct_access () { + if (inner == null) { + return; + } + var instance = symbol_reference is Field && ((Field) symbol_reference).binding == MemberBinding.INSTANCE; + if (!instance) { + instance = symbol_reference is Method && ((Method) symbol_reference).binding == MemberBinding.INSTANCE; + } + if (!instance) { + instance = symbol_reference is Property && ((Property) symbol_reference).binding == MemberBinding.INSTANCE; + } + var this_access = inner.symbol_reference is Parameter && inner.symbol_reference.name == "this"; + if (instance && inner.value_type is StructValueType && !inner.value_type.nullable && (symbol_reference is Method || lvalue) && ((inner is MemberAccess && inner.symbol_reference is Variable) || inner is ElementAccess) && !this_access) { + inner.lvalue = true; + if (inner is MemberAccess) { + ((MemberAccess) inner).check_lvalue_struct_access (); + } + } + } + public override void emit (CodeGenerator codegen) { if (inner != null) { inner.emit (codegen);