private static IEnumerator <object> ObjectYielder(PythonContext context, count c, object start, object step) { start = context.Operation(PythonOperationKind.Add, start, step); for (; ; start = context.Operation(PythonOperationKind.Add, start, step)) { object prev = c._cur; c._cur = start; yield return(prev); } }
public static DynamicMetaObjectBinder UnaryOperationBinder(PythonContext state, PythonOperationKind operatorName) { ExpressionType? et = GetExpressionTypeFromUnaryOperator(operatorName); if (et == null) { return state.Operation( operatorName ); } return state.UnaryOperation(et.Value); }
public static DynamicMetaObjectBinder BinaryOperationBinder(PythonContext state, PythonOperationKind operatorName) { ExpressionType?et = GetExpressionTypeFromBinaryOperator(operatorName); if (et == null) { return(state.Operation( operatorName )); } return(state.BinaryOperation(et.Value)); }
/// <summary> /// calls __coerce__ for old-style classes and performs the operation if the coercion is successful. /// </summary> private static void DoCoerce(PythonContext/*!*/ pyContext, ConditionalBuilder/*!*/ bodyBuilder, PythonOperationKind op, DynamicMetaObject/*!*/[]/*!*/ types, bool reverse, Func<Expression, Expression> returnTransform) { ParameterExpression coerceResult = Ast.Variable(typeof(object), "coerceResult"); ParameterExpression coerceTuple = Ast.Variable(typeof(PythonTuple), "coerceTuple"); // tmp = self.__coerce__(other) // if tmp != null && tmp != NotImplemented && (tuple = PythonOps.ValidateCoerceResult(tmp)) != null: // return operation(tuple[0], tuple[1]) SlotOrFunction slot = SlotOrFunction.GetSlotOrFunction(pyContext, "__coerce__", types); if (slot.Success) { bodyBuilder.AddCondition( Ast.AndAlso( Ast.Not( Ast.TypeIs( Ast.Assign( coerceResult, slot.Target.Expression ), typeof(OldInstance) ) ), Ast.NotEqual( Ast.Assign( coerceTuple, Ast.Call( typeof(PythonOps).GetMethod("ValidateCoerceResult"), coerceResult ) ), AstUtils.Constant(null) ) ), BindingHelpers.AddRecursionCheck( pyContext, returnTransform( DynamicExpression.Dynamic( pyContext.Operation(op | PythonOperationKind.DisableCoerce), op == PythonOperationKind.Compare ? typeof(int) : typeof(object), reverse ? CoerceTwo(coerceTuple) : CoerceOne(coerceTuple), reverse ? CoerceOne(coerceTuple) : CoerceTwo(coerceTuple) ) ) ) ); bodyBuilder.AddVariable(coerceResult); bodyBuilder.AddVariable(coerceTuple); } }
/// <summary> /// calls __coerce__ for old-style classes and performs the operation if the coercion is successful. /// </summary> private static void DoCoerce(PythonContext/*!*/ state, ConditionalBuilder/*!*/ bodyBuilder, PythonOperationKind op, DynamicMetaObject/*!*/[]/*!*/ types, bool reverse, Func<Expression, Expression> returnTransform) { ParameterExpression coerceResult = Ast.Variable(typeof(object), "coerceResult"); ParameterExpression coerceTuple = Ast.Variable(typeof(PythonTuple), "coerceTuple"); if (!bodyBuilder.TestCoercionRecursionCheck) { // during coercion we need to enforce recursion limits if // they're enabled and the rule's test needs to reflect this. bodyBuilder.Restrictions = bodyBuilder.Restrictions.Merge( BindingRestrictions.GetExpressionRestriction( Ast.Equal( Ast.Call(typeof(PythonOps).GetMethod("ShouldEnforceRecursion")), AstUtils.Constant(PythonFunction.EnforceRecursion) ) ) ); bodyBuilder.TestCoercionRecursionCheck = true; } // tmp = self.__coerce__(other) // if tmp != null && tmp != NotImplemented && (tuple = PythonOps.ValidateCoerceResult(tmp)) != null: // return operation(tuple[0], tuple[1]) SlotOrFunction slot = SlotOrFunction.GetSlotOrFunction(state, Symbols.Coerce, types); if (slot.Success) { bodyBuilder.AddCondition( Ast.AndAlso( Ast.Not( Ast.TypeIs( Ast.Assign( coerceResult, slot.Target.Expression ), typeof(OldInstance) ) ), Ast.NotEqual( Ast.Assign( coerceTuple, Ast.Call( typeof(PythonOps).GetMethod("ValidateCoerceResult"), coerceResult ) ), AstUtils.Constant(null) ) ), BindingHelpers.AddRecursionCheck( returnTransform( Ast.Dynamic( state.Operation(op | PythonOperationKind.DisableCoerce), op == PythonOperationKind.Compare ? typeof(int) : typeof(object), reverse ? CoerceTwo(coerceTuple) : CoerceOne(coerceTuple), reverse ? CoerceOne(coerceTuple) : CoerceTwo(coerceTuple) ) ) ) ); bodyBuilder.AddVariable(coerceResult); bodyBuilder.AddVariable(coerceTuple); } }