示例#1
0
 private DynamicMetaObject BinaryMultiply(DynamicMetaObject target, DynamicMetaObject arg, DynamicMetaObject errorSuggestion)
 {
     Expression expression;
     Expression expression1;
     if (target.Value != null)
     {
         if (target.LimitType.IsNumeric())
         {
             DynamicMetaObject argAsNumericOrPrimitive = PSBinaryOperationBinder.GetArgAsNumericOrPrimitive(arg, target.LimitType);
             if (argAsNumericOrPrimitive == null)
             {
                 if (arg.LimitType.Equals(typeof(string)))
                 {
                     return this.BinaryNumericStringOp(target, arg);
                 }
             }
             else
             {
                 return this.BinaryNumericOp("Multiply", target, argAsNumericOrPrimitive);
             }
         }
         if (!target.LimitType.Equals(typeof(string)))
         {
             DynamicMetaObject dynamicMetaObject = PSEnumerableBinder.IsEnumerable(target);
             if (dynamicMetaObject == null)
             {
                 return PSBinaryOperationBinder.CallImplicitOp("op_Multiply", target, arg, "*", errorSuggestion);
             }
             else
             {
                 if (arg.LimitType.Equals(typeof(string)))
                 {
                     expression = PSBinaryOperationBinder.ConvertStringToNumber(arg.Expression, typeof(int)).Convert(typeof(int));
                 }
                 else
                 {
                     expression = arg.CastOrConvert(typeof(int));
                 }
                 Expression expression2 = expression;
                 if (!target.LimitType.IsArray)
                 {
                     DynamicMetaObject[] dynamicMetaObjectArray = new DynamicMetaObject[1];
                     dynamicMetaObjectArray[0] = arg;
                     return new DynamicMetaObject(Expression.Call(CachedReflectionInfo.EnumerableOps_Multiply, dynamicMetaObject.Expression, expression2), target.CombineRestrictions(dynamicMetaObjectArray));
                 }
                 else
                 {
                     Type elementType = target.LimitType.GetElementType();
                     Type[] typeArray = new Type[1];
                     typeArray[0] = elementType;
                     DynamicMetaObject[] dynamicMetaObjectArray1 = new DynamicMetaObject[1];
                     dynamicMetaObjectArray1[0] = arg;
                     return new DynamicMetaObject(Expression.Call(CachedReflectionInfo.ArrayOps_Multiply.MakeGenericMethod(typeArray), target.Expression.Cast(elementType.MakeArrayType()), expression2), target.CombineRestrictions(dynamicMetaObjectArray1));
                 }
             }
         }
         else
         {
             if (arg.LimitType.Equals(typeof(string)))
             {
                 expression1 = PSBinaryOperationBinder.ConvertStringToNumber(arg.Expression, typeof(int)).Convert(typeof(int));
             }
             else
             {
                 expression1 = arg.CastOrConvert(typeof(int));
             }
             Expression expression3 = expression1;
             DynamicMetaObject[] dynamicMetaObjectArray2 = new DynamicMetaObject[1];
             dynamicMetaObjectArray2[0] = arg;
             return new DynamicMetaObject(Expression.Call(CachedReflectionInfo.StringOps_Multiply, target.Expression.Cast(typeof(string)), expression3), target.CombineRestrictions(dynamicMetaObjectArray2));
         }
     }
     else
     {
         return new DynamicMetaObject(ExpressionCache.NullConstant, target.PSGetTypeRestriction());
     }
 }
示例#2
0
 internal DynamicMetaObject Not(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
 {
     if (!target.HasValue)
     {
         return base.Defer(target, new DynamicMetaObject[0]);
     }
     return new DynamicMetaObject(Expression.Not(target.CastOrConvert(typeof(bool))).Cast(typeof(object)), target.PSGetTypeRestriction());
 }