protected override Expression DoResolve (ResolveContext rc)
{
Expression res = null;
-
using (rc.With (ResolveContext.Options.DontSetConditionalAccessReceiver, false)) {
res = expr.Resolve (rc);
}
}
New n_source = source as New;
- if (n_source != null) {
+ if (n_source != null && n_source.CanEmitOptimizedLocalTarget (ec)) {
if (!n_source.Emit (ec, this)) {
if (leave_copy) {
EmitLoad (ec);
}
}
- return new DynamicInvocation (expr as ATypeNameExpression, args, loc).Resolve (ec);
+ return new DynamicInvocation (expr as ATypeNameExpression, args, conditional_access_receiver, loc).Resolve (ec);
}
protected virtual MethodGroupExpr DoResolveOverload (ResolveContext ec)
ec.Emit (OpCodes.Pop);
}
+ public virtual bool CanEmitOptimizedLocalTarget (EmitContext ec)
+ {
+ return true;
+ }
+
public override void FlowAnalysis (FlowAnalysisContext fc)
{
if (arguments != null)
return retval;
}
+ var cma = this as ConditionalMemberAccess;
+
MemberExpr me;
TypeSpec expr_type = expr.Type;
if (expr_type.BuiltinType == BuiltinTypeSpec.Type.Dynamic) {
Arguments args = new Arguments (1);
args.Add (new Argument (expr));
+
+ if (cma != null)
+ return new DynamicConditionalMemberBinder (Name, args, loc);
+
return new DynamicMemberBinder (Name, args, loc);
}
- var cma = this as ConditionalMemberAccess;
if (cma != null) {
if (!IsNullPropagatingValid (expr.Type)) {
expr.Error_OperatorCannotBeApplied (rc, loc, "?", expr.Type);
args.AddRange (arguments);
best_candidate = null;
- return new DynamicIndexBinder (args, loc);
+ return new DynamicIndexBinder (args, conditional_access_receiver, ConditionalAccess, loc);
}
//
args.Add (new Argument (rc.CurrentInitializerVariable));
target = new DynamicMemberBinder (Name, args, loc);
} else {
-
var member = MemberLookup (rc, false, t, Name, 0, MemberLookupRestrictions.ExactArity, loc);
if (member == null) {
member = Expression.MemberLookup (rc, true, t, Name, 0, MemberLookupRestrictions.ExactArity, loc);
public override void Emit (EmitContext ec)
{
- if (method == null && TypeSpec.IsValueType (type) && initializers.Initializers.Count > 1 && ec.HasSet (BuilderContext.Options.AsyncBody) && initializers.ContainsEmitWithAwait ()) {
+ if (!CanEmitOptimizedLocalTarget (ec)) {
var fe = ec.GetTemporaryField (type);
if (!Emit (ec, fe))
return true;
}
+ public override bool CanEmitOptimizedLocalTarget (EmitContext ec)
+ {
+ return !(method == null && TypeSpec.IsValueType (type) &&
+ initializers.Initializers.Count > 1 && ec.HasSet (BuilderContext.Options.AsyncBody) &&
+ initializers.ContainsEmitWithAwait ());
+ }
+
protected override IMemoryLocation EmitAddressOf (EmitContext ec, AddressOp Mode)
{
instance = base.EmitAddressOf (ec, Mode);