public static DynamicMetaObjectBinder UnaryOperationBinder(BinderState state, PythonOperationKind operatorName) { ExpressionType? et = GetExpressionTypeFromUnaryOperator(operatorName); if (et == null) { return state.Operation( operatorName ); } return state.UnaryOperation(et.Value); }
/// <summary> /// calls __coerce__ for old-style classes and performs the operation if the coercion is successful. /// </summary> private static void DoCoerce(BinderState/*!*/ 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), typeof(object), reverse ? CoerceTwo(coerceTuple) : CoerceOne(coerceTuple), reverse ? CoerceOne(coerceTuple) : CoerceTwo(coerceTuple) ) ) ) ); bodyBuilder.AddVariable(coerceResult); bodyBuilder.AddVariable(coerceTuple); } }