[vala/wip/effectfree: 11/43] Set lvalue to inner member access having type non-nullable struct
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/wip/effectfree: 11/43] Set lvalue to inner member access having type non-nullable struct
- Date: Tue, 5 Jul 2011 21:53:31 +0000 (UTC)
commit d52d32264488fe6d8cd8bd9eb9e045b1dfb782c9
Author: Luca Bruno <lucabru src gnome org>
Date: Thu Jun 16 20:22:48 2011 +0200
Set lvalue to inner member access having type non-nullable struct
vala/valamemberaccess.vala | 22 ++++++++++++++++++++++
1 files changed, 22 insertions(+), 0 deletions(-)
---
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index 5a46de0..51978ed 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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]