/// <summary> /// Initializes a new instance of <see cref="DyadicFunction"/> AST node. /// </summary> /// <param name="token">The <see cref="Token"/> to use for the dyadic function.</param> /// <param name="leftExpression">The left hand argument of the dyadic function.</param> /// <param name="rightExpression">The right hand argument of the dyadic function.</param> public DyadicFunction(Token token, Node leftExpression, Node rightExpression) { this.token = token; this.leftExpression = leftExpression; this.rightExpression = rightExpression; MethodChooser.ConvertToDyadicToken(this.token); }
private static DLR.Expression BuildDyadicCase( Token functionToken, DLR.LabelTarget returnTarget, DLR.Expression environment, DLR.Expression rightParam, DLR.Expression leftParam) { DLR.Expression result; MethodInfo method = typeof(AbstractDyadicFunction).GetMethod("Execute"); if (functionToken.Type == Tokens.TYPE) { result = DLR.Expression.IfThenElse( // $left.IsNumber || ($left.Type == ATypes.ANull) DLR.Expression.OrElse( DLR.Expression.IsTrue( DLR.Expression.PropertyOrField(leftParam, "IsNumber") ), DLR.Expression.Equal( DLR.Expression.PropertyOrField(leftParam, "Type"), DLR.Expression.Constant(ATypes.ANull) ) ), // Or($right, $left) DLR.Expression.Goto( returnTarget, DLR.Expression.Call( DLR.Expression.Constant(DyadicFunctionInstance.Or), method, rightParam, leftParam, environment ) ), // Cast($right, $left) DLR.Expression.Goto( returnTarget, DLR.Expression.Call( DLR.Expression.Constant(DyadicFunctionInstance.Cast), method, rightParam, leftParam, environment ) ) ); } else { MethodChooser.ConvertToDyadicToken(functionToken); AbstractDyadicFunction dyadic = MethodChooser.GetDyadicMethod(functionToken); if (dyadic != null) { result = DLR.Expression.Goto( returnTarget, DLR.Expression.Call( DLR.Expression.Constant(dyadic), method, rightParam, leftParam, environment ) ); } else { result = DLR.Expression.Throw( DLR.Expression.New( typeof(Error.Valence).GetConstructor(new Type[] { typeof(string) }), DLR.Expression.Constant(functionToken.Text) ) ); } } return(result); }