protected virtual FieldExpr GetFieldExpression (EmitContext ec)
{
if (ec.CurrentAnonymousMethod == null || ec.CurrentAnonymousMethod.Storey == null) {
if (cached_outer_access != null)
return cached_outer_access;
//
// When setting top-level hoisted variable in generic storey
// change storey generic types to method generic types (VAR -> MVAR)
//
if (storey.Instance.Type.IsGenericOrParentIsGeneric) {
var fs = MemberCache.GetMember (storey.Instance.Type, field.Spec);
cached_outer_access = new FieldExpr (fs, field.Location);
} else {
cached_outer_access = new FieldExpr (field, field.Location);
}
cached_outer_access.InstanceExpression = storey.GetStoreyInstanceExpression (ec);
return cached_outer_access;
}
FieldExpr inner_access;
if (cached_inner_access != null) {
if (!cached_inner_access.TryGetValue (ec.CurrentAnonymousMethod, out inner_access))
inner_access = null;
} else {
inner_access = null;
cached_inner_access = new Dictionary<AnonymousExpression, FieldExpr> (4);
}
if (inner_access == null) {
if (field.Parent.IsGeneric) {
var fs = MemberCache.GetMember (field.Parent.CurrentType, field.Spec);
inner_access = new FieldExpr (fs, field.Location);
} else {
inner_access = new FieldExpr (field, field.Location);
}
inner_access.InstanceExpression = storey.GetStoreyInstanceExpression (ec);
cached_inner_access.Add (ec.CurrentAnonymousMethod, inner_access);
}
return inner_access;
}