public MethodCall(Expression target, string/*!*/ methodName, Arguments args, Block block, SourceSpan location) : base(args, block, location) { Assert.NotEmpty(methodName); _methodName = methodName; _target = target; }
// arguments: complex arguments (expressions, maplets, splat, block) // singleArgument: siple argument (complex are not used) // assignmentRhsArgument: rhs of the assignment: target.method=(rhs) internal static MSA.Expression/*!*/ TransformRead(Expression/*!*/ node, AstGenerator/*!*/ gen, bool hasImplicitSelf, string/*!*/ methodName, MSA.Expression/*!*/ transformedTarget, Arguments arguments, Block block, MSA.Expression singleArgument, MSA.Expression assignmentRhsArgument) { Debug.Assert(assignmentRhsArgument == null || block == null, "Block not allowed in assignment"); Debug.Assert(singleArgument == null || arguments == null && assignmentRhsArgument == null); Assert.NotNull(gen, transformedTarget); Assert.NotEmpty(methodName); // Pass args in this order: // 1. instance // 2. block (if present) // 3. passed args: normal args, maplets, array // 4. RHS of assignment (if present) MSA.Expression blockArgVariable; MSA.Expression transformedBlock; if (block != null) { blockArgVariable = gen.CurrentScope.DefineHiddenVariable("#block-def", typeof(Proc)); transformedBlock = block.Transform(gen); } else { blockArgVariable = transformedBlock = null; } var siteBuilder = new CallSiteBuilder(gen, transformedTarget, blockArgVariable); if (arguments != null) { arguments.TransformToCall(gen, siteBuilder); } else if (singleArgument != null) { siteBuilder.Add(singleArgument); } MSA.Expression rhsVariable = null; if (assignmentRhsArgument != null) { rhsVariable = gen.CurrentScope.DefineHiddenVariable("#rhs", assignmentRhsArgument.Type); siteBuilder.RhsArgument = Ast.Assign(rhsVariable, assignmentRhsArgument); } var dynamicSite = siteBuilder.MakeCallAction(methodName, hasImplicitSelf); #if FEATURE_CALL_SITE_TRACER if (gen.Context.CallSiteCreated != null) { gen.Context.CallSiteCreated(node, dynamicSite); } #endif MSA.Expression result = gen.DebugMark(dynamicSite, methodName); if (block != null) { result = gen.DebugMark(MakeCallWithBlockRetryable(gen, result, blockArgVariable, transformedBlock, block.IsDefinition), "#RB: method call with a block ('" + methodName + "')"); } if (assignmentRhsArgument != null) { result = Ast.Block(result, rhsVariable); } return result; }
public ArrayItemAccess(Expression/*!*/ array, Arguments/*!*/ arguments, SourceSpan location) : base(location) { ContractUtils.RequiresNotNull(array, "array"); ContractUtils.RequiresNotNull(arguments, "arguments"); _array = array; _arguments = arguments; }
public ArrayItemAccess(Expression/*!*/ array, Arguments arguments, Block block, SourceSpan location) : base(location) { ContractUtils.RequiresNotNull(array, "array"); _array = array; // no need to distinguish between no arguments and empty arguments: _arguments = arguments ?? Arguments.Empty; _block = block; }
public MethodCall(Expression target, string/*!*/ methodName, Arguments args, SourceSpan location) : this(target, methodName, args, null, location) { }
protected CallExpression(Arguments args, Block block, SourceSpan location) : base(location) { _args = args; _block = block; }
public ArrayConstructor(Arguments arguments, SourceSpan location) : base(location) { _arguments = arguments; }
public SuperCall(Arguments args, Block block, SourceSpan location) : base(args, block, location) { }
public BreakStatement(Arguments arguments, SourceSpan location) : base(arguments, location) { }
public YieldCall(Arguments args, SourceSpan location) : base(args, null, location) { }
public virtual bool Enter(Arguments /*!*/ node) { return(true); }
internal static MSA.Expression/*!*/ TransformToReturnValue(AstGenerator/*!*/ gen, Arguments arguments) { return (arguments != null) ? arguments.TransformToReturnValue(gen) : AstUtils.Constant(null); }
public JumpStatement(Arguments arguments, SourceSpan location) : base(location) { _arguments = arguments; }
public ReturnStatement(Arguments arguments, SourceSpan location) : base(arguments, location) { }
public virtual void Exit(Arguments /*!*/ node) { }
internal static MSA.Expression/*!*/ TransformToArray(AstGenerator/*!*/ gen, Arguments arguments) { Assert.NotNull(gen); return (arguments != null) ? arguments.TransformRead(gen, false /* Unsplat */) : Methods.MakeArray0.OpCall(); }
public NextStatement(Arguments arguments, SourceSpan location) : base(arguments, location) { }