Expression binder_expr;
// Used by BinderFlags
- CSharpBinderFlags flags;
+ protected CSharpBinderFlags flags;
public DynamicExpressionStatement (IDynamicBinder binder, Arguments args, Location loc)
{
public override void Emit (EmitContext ec)
{
- EmitCall (ec);
+ EmitCall (ec, false);
}
public override void EmitStatement (EmitContext ec)
{
- flags = CSharpBinderFlags.ResultDiscarded;
-
- EmitCall (ec);
+ EmitCall (ec, true);
}
- void EmitCall (EmitContext ec)
+ void EmitCall (EmitContext ec, bool isStatement)
{
int dyn_args_count = arguments == null ? 0 : arguments.Count;
- TypeExpr site_type = CreateSiteType (RootContext.ToplevelTypes.Compiler, dyn_args_count);
+ TypeExpr site_type = CreateSiteType (RootContext.ToplevelTypes.Compiler, dyn_args_count, isStatement);
FieldExpr site_field_expr = new FieldExpr (CreateSiteField (site_type).FieldBuilder, loc);
SymbolWriter.OpenCompilerGeneratedBlock (ec.ig);
return new MemberAccess (TypeManager.binder_type, name, loc);
}
- TypeExpr CreateSiteType (CompilerContext ctx, int dyn_args_count)
+ TypeExpr CreateSiteType (CompilerContext ctx, int dyn_args_count, bool is_statement)
{
- bool is_statement = (flags & CSharpBinderFlags.ResultDiscarded) != 0;
int default_args = is_statement ? 1 : 2;
bool has_ref_out_argument = false;
class DynamicConversion : DynamicExpressionStatement, IDynamicBinder
{
- CSharpBinderFlags flags;
-
public DynamicConversion (Type targetType, CSharpBinderFlags flags, Arguments args, Location loc)
: base (null, args, loc)
{
type = targetType;
- this.flags = flags;
+ base.flags = flags;
base.binder = this;
}
return new Invocation (GetBinder (is_member_access ? "InvokeMember" : "Invoke", loc), binder_args);
}
+
+ public override void EmitStatement (EmitContext ec)
+ {
+ flags = CSharpBinderFlags.ResultDiscarded;
+ base.EmitStatement (ec);
+ }
}
class DynamicMemberBinder : DynamicExpressionStatement, IDynamicBinder, IAssignMethod
MemberAccess sle = new MemberAccess (new MemberAccess (
new QualifiedAliasMember (QualifiedAliasMember.GlobalAlias, "System", loc), "Linq", loc), "Expressions", loc);
- int flags = 0;
+ CSharpBinderFlags flags = 0;
if (ec.HasSet (ResolveContext.Options.CheckedScope))
- flags = (int) CSharpBinderFlags.CheckedContext;
+ flags = CSharpBinderFlags.CheckedContext;
- binder_args.Add (new Argument (new EnumConstant (new IntLiteral (flags, loc), TypeManager.binder_flags)));
+ if ((oper & Operator.LogicalMask) != 0)
+ flags |= CSharpBinderFlags.BinaryOperationLogical;
+
+ binder_args.Add (new Argument (new EnumConstant (new IntLiteral ((int) flags, loc), TypeManager.binder_flags)));
binder_args.Add (new Argument (new MemberAccess (new MemberAccess (sle, "ExpressionType", loc), GetOperatorExpressionTypeName (), loc)));
binder_args.Add (new Argument (new ImplicitlyTypedArrayCreation ("[]", args.CreateDynamicBinderArguments (), loc)));
// A boolean-expression is an expression that yields a result
// of type bool
//
- public class BooleanExpression : Expression
+ public class BooleanExpression : ShimExpression
{
- Expression expr;
-
public BooleanExpression (Expression expr)
+ : base (expr)
{
- this.expr = expr;
this.loc = expr.Location;
}
- protected override void CloneTo (CloneContext clonectx, Expression t)
- {
- BooleanExpression target = (BooleanExpression) t;
- target.expr = expr.Clone (clonectx);
- }
-
public override Expression CreateExpressionTree (ResolveContext ec)
{
// TODO: We should emit IsTrue (v4) instead of direct user operator
// call but that would break csc compatibility
- throw new NotSupportedException ();
+ return base.CreateExpressionTree (ec);
}
public override Expression DoResolve (ResolveContext ec)
Assign ass = expr as Assign;
if (ass != null && ass.Source is Constant) {
- ec.Report.Warning (665, 3, expr.Location,
+ ec.Report.Warning (665, 3, loc,
"Assignment in conditional expression is always constant. Did you mean to use `==' instead ?");
}
return converted;
}
-
- public override void Emit (EmitContext ec)
- {
- throw new InternalErrorException ("Should not be reached");
- }
}
/// <summary>