Пример #1
0
 public override DynamicMetaObject FallbackGetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject errorSuggestion)
 {
     if (target.HasValue && !(from mo in indexes
         where !mo.HasValue
         select mo).Any<DynamicMetaObject>())
     {
         if ((!(target.Value is PSObject) || (PSObject.Base(target.Value) == target.Value)) && !(from mo in indexes
             where (mo.Value is PSObject) && (PSObject.Base(mo.Value) != mo.Value)
             select mo).Any<DynamicMetaObject>())
         {
             if (target.Value == null)
             {
                 return (errorSuggestion ?? target.ThrowRuntimeError(indexes, BindingRestrictions.Empty, "NullArray", ParserStrings.NullArray, new Expression[0])).WriteToDebugLog(this);
             }
             if (((indexes.Length == 1) && (indexes[0].Value == null)) && this._allowSlicing)
             {
                 return (errorSuggestion ?? target.ThrowRuntimeError(indexes, BindingRestrictions.Empty, "NullArrayIndex", ParserStrings.NullArrayIndex, new Expression[0])).WriteToDebugLog(this);
             }
             if (target.LimitType.IsArray)
             {
                 return this.GetIndexArray(target, indexes, errorSuggestion).WriteToDebugLog(this);
             }
             foreach (Type type in target.LimitType.GetInterfaces())
             {
                 if (type.IsGenericType && (type.GetGenericTypeDefinition() == typeof(IDictionary<,>)))
                 {
                     DynamicMetaObject obj2 = this.GetIndexDictionary(target, indexes, type);
                     if (obj2 != null)
                     {
                         return obj2.WriteToDebugLog(this);
                     }
                 }
             }
             DefaultMemberAttribute attribute = target.LimitType.GetCustomAttributes<DefaultMemberAttribute>(true).FirstOrDefault<DefaultMemberAttribute>();
             if (attribute != null)
             {
                 return this.InvokeIndexer(target, indexes, errorSuggestion, attribute.MemberName).WriteToDebugLog(this);
             }
             return (errorSuggestion ?? this.CannotIndexTarget(target, indexes).WriteToDebugLog(this));
         }
         return this.DeferForPSObject(indexes.Prepend<DynamicMetaObject>(target).ToArray<DynamicMetaObject>()).WriteToDebugLog(this);
     }
     return base.Defer(indexes.Prepend<DynamicMetaObject>(target).ToArray<DynamicMetaObject>()).WriteToDebugLog(this);
 }
Пример #2
0
 private DynamicMetaObject SetIndexMultiDimensionArray(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject value, DynamicMetaObject errorSuggestion)
 {
     Type elementType = target.LimitType.GetElementType();
     Expression expression = PSGetIndexBinder.ConvertIndex(value, elementType);
     if (expression != null)
     {
         if ((int)indexes.Length != 1)
         {
             Array arrays = (Array)target.Value;
             if ((int)indexes.Length == arrays.Rank)
             {
                 Expression[] expressionArray = new Expression[(int)indexes.Length];
                 int num = 0;
                 while (num < (int)indexes.Length)
                 {
                     expressionArray[num] = PSGetIndexBinder.ConvertIndex(indexes[num], typeof(int));
                     if (expressionArray[num] != null)
                     {
                         num++;
                     }
                     else
                     {
                         DynamicMetaObject[] dynamicMetaObjectArray = new DynamicMetaObject[1];
                         dynamicMetaObjectArray[0] = indexes[num];
                         return PSConvertBinder.ThrowNoConversion(indexes[num], typeof(int), this, this._version, indexes.Except<DynamicMetaObject>(dynamicMetaObjectArray).Append<DynamicMetaObject>(target).Append<DynamicMetaObject>(value).ToArray<DynamicMetaObject>());
                     }
                 }
                 return new DynamicMetaObject(Expression.Call(CachedReflectionInfo.ArrayOps_SetMDArrayValue, target.Expression.Cast(typeof(Array)), Expression.NewArrayInit(typeof(int), expressionArray), expression.Cast(typeof(object))), target.CombineRestrictions(indexes).Merge(value.PSGetTypeRestriction()));
             }
             else
             {
                 DynamicMetaObject dynamicMetaObject = errorSuggestion;
                 DynamicMetaObject dynamicMetaObject1 = dynamicMetaObject;
                 if (dynamicMetaObject == null)
                 {
                     DynamicMetaObject dynamicMetaObject2 = target;
                     DynamicMetaObject[] dynamicMetaObjectArray1 = indexes;
                     BindingRestrictions bindingRestriction = value.PSGetTypeRestriction();
                     string str = "NeedMultidimensionalIndex";
                     string needMultidimensionalIndex = ParserStrings.NeedMultidimensionalIndex;
                     Expression[] expressionArray1 = new Expression[2];
                     expressionArray1[0] = ExpressionCache.Constant(arrays.Rank);
                     Expression[] expressionArray2 = expressionArray1;
                     int num1 = 1;
                     MethodInfo arrayOpsIndexStringMessage = CachedReflectionInfo.ArrayOps_IndexStringMessage;
                     Type type = typeof(object);
                     DynamicMetaObject[] dynamicMetaObjectArray2 = indexes;
                     expressionArray2[num1] = Expression.Call(arrayOpsIndexStringMessage, Expression.NewArrayInit(type, dynamicMetaObjectArray2.Select<DynamicMetaObject, Expression>((DynamicMetaObject i) => i.Expression.Cast(typeof(object)))));
                     dynamicMetaObject1 = dynamicMetaObject2.ThrowRuntimeError(dynamicMetaObjectArray1, bindingRestriction, str, needMultidimensionalIndex, expressionArray1);
                 }
                 return dynamicMetaObject1;
             }
         }
         else
         {
             Expression expression1 = PSGetIndexBinder.ConvertIndex(indexes[0], typeof(int[]));
             if (expression1 != null)
             {
                 return new DynamicMetaObject(Expression.Call(CachedReflectionInfo.ArrayOps_SetMDArrayValue, target.Expression.Cast(typeof(Array)), expression1, expression.Cast(typeof(object))), target.CombineRestrictions(indexes).Merge(value.PSGetTypeRestriction()));
             }
             else
             {
                 DynamicMetaObject dynamicMetaObject3 = errorSuggestion;
                 DynamicMetaObject dynamicMetaObject4 = dynamicMetaObject3;
                 if (dynamicMetaObject3 == null)
                 {
                     DynamicMetaObject[] dynamicMetaObjectArray3 = new DynamicMetaObject[2];
                     dynamicMetaObjectArray3[0] = target;
                     dynamicMetaObjectArray3[1] = value;
                     dynamicMetaObject4 = PSConvertBinder.ThrowNoConversion(indexes[0], typeof(int[]), this, this._version, dynamicMetaObjectArray3);
                 }
                 return dynamicMetaObject4;
             }
         }
     }
     else
     {
         DynamicMetaObject dynamicMetaObject5 = errorSuggestion;
         DynamicMetaObject dynamicMetaObject6 = dynamicMetaObject5;
         if (dynamicMetaObject5 == null)
         {
             dynamicMetaObject6 = PSConvertBinder.ThrowNoConversion(value, elementType, this, this._version, indexes.Prepend<DynamicMetaObject>(target).ToArray<DynamicMetaObject>());
         }
         return dynamicMetaObject6;
     }
 }
Пример #3
0
 public override DynamicMetaObject FallbackSetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject value, DynamicMetaObject errorSuggestion)
 {
     if (target.HasValue)
     {
         DynamicMetaObject[] dynamicMetaObjectArray = indexes;
         if (!dynamicMetaObjectArray.Where<DynamicMetaObject>((DynamicMetaObject mo) => !mo.HasValue).Any<DynamicMetaObject>() && value.HasValue)
         {
             if (target.Value as PSObject == null || PSObject.Base(target.Value) == target.Value)
             {
                 DynamicMetaObject[] dynamicMetaObjectArray1 = indexes;
                 if (!dynamicMetaObjectArray1.Where<DynamicMetaObject>((DynamicMetaObject mo) =>
                 {
                     if ((mo.Value as PSObject == null))
                     {
                         return false;
                     }
                     else
                     {
                         return (PSObject.Base(mo.Value) != mo.Value);
                     }
                 }
                 ).Any<DynamicMetaObject>())
                 {
                     if (target.Value != null)
                     {
                         if ((int)indexes.Length != 1 || indexes[0].Value != null)
                         {
                             if (!target.LimitType.IsArray)
                             {
                                 DefaultMemberAttribute defaultMemberAttribute = target.LimitType.GetCustomAttributes<DefaultMemberAttribute>(true).FirstOrDefault<DefaultMemberAttribute>();
                                 if (defaultMemberAttribute == null)
                                 {
                                     DynamicMetaObject dynamicMetaObject = errorSuggestion;
                                     DynamicMetaObject debugLog = dynamicMetaObject;
                                     if (dynamicMetaObject == null)
                                     {
                                         debugLog = this.CannotIndexTarget(target, indexes, value).WriteToDebugLog(this);
                                     }
                                     return debugLog;
                                 }
                                 else
                                 {
                                     return this.InvokeIndexer(target, indexes, value, errorSuggestion, defaultMemberAttribute.MemberName).WriteToDebugLog(this);
                                 }
                             }
                             else
                             {
                                 return this.SetIndexArray(target, indexes, value, errorSuggestion).WriteToDebugLog(this);
                             }
                         }
                         else
                         {
                             DynamicMetaObject dynamicMetaObject1 = errorSuggestion;
                             DynamicMetaObject debugLog1 = dynamicMetaObject1;
                             if (dynamicMetaObject1 == null)
                             {
                                 debugLog1 = target.ThrowRuntimeError(indexes, BindingRestrictions.Empty, "NullArrayIndex", ParserStrings.NullArrayIndex, new Expression[0]).WriteToDebugLog(this);
                             }
                             return debugLog1;
                         }
                     }
                     else
                     {
                         DynamicMetaObject dynamicMetaObject2 = errorSuggestion;
                         DynamicMetaObject dynamicMetaObject3 = dynamicMetaObject2;
                         if (dynamicMetaObject2 == null)
                         {
                             dynamicMetaObject3 = target.ThrowRuntimeError(indexes, BindingRestrictions.Empty, "NullArray", ParserStrings.NullArray, new Expression[0]);
                         }
                         return dynamicMetaObject3.WriteToDebugLog(this);
                     }
                 }
             }
             return this.DeferForPSObject(indexes.Prepend<DynamicMetaObject>(target).Append<DynamicMetaObject>(value).ToArray<DynamicMetaObject>()).WriteToDebugLog(this);
         }
     }
     return base.Defer(indexes.Prepend<DynamicMetaObject>(target).Append<DynamicMetaObject>(value).ToArray<DynamicMetaObject>()).WriteToDebugLog(this);
 }
Пример #4
0
 private DynamicMetaObject SetIndexArray(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject value, DynamicMetaObject errorSuggestion)
 {
     Array arrays = (Array)target.Value;
     if (arrays.Rank <= 1)
     {
         if ((int)indexes.Length <= 1)
         {
             Expression expression = PSGetIndexBinder.ConvertIndex(indexes[0], typeof(int));
             if (expression != null)
             {
                 Type elementType = target.LimitType.GetElementType();
                 Expression expression1 = PSGetIndexBinder.ConvertIndex(value, elementType);
                 if (expression1 != null)
                 {
                     PSSetIndexBinder pSSetIndexBinder = this;
                     DynamicMetaObject dynamicMetaObject = new DynamicMetaObject(target.Expression.Cast(target.LimitType), target.PSGetTypeRestriction());
                     DynamicMetaObject dynamicMetaObject1 = new DynamicMetaObject(expression, indexes[0].PSGetTypeRestriction());
                     DynamicMetaObject dynamicMetaObject2 = new DynamicMetaObject(expression1, value.PSGetTypeRestriction());
                     PropertyInfo property = target.LimitType.GetProperty("Length");
                     return pSSetIndexBinder.IndexWithNegativeChecks(dynamicMetaObject, dynamicMetaObject1, dynamicMetaObject2, property, (Expression t, Expression i, Expression v) =>
                     {
                         Expression[] expressionArray = new Expression[1];
                         expressionArray[0] = i;
                         return Expression.Assign(Expression.ArrayAccess(t, expressionArray), v);
                     }
                     );
                 }
                 else
                 {
                     DynamicMetaObject dynamicMetaObject3 = errorSuggestion;
                     DynamicMetaObject dynamicMetaObject4 = dynamicMetaObject3;
                     if (dynamicMetaObject3 == null)
                     {
                         dynamicMetaObject4 = PSConvertBinder.ThrowNoConversion(value, elementType, this, this._version, indexes.Prepend<DynamicMetaObject>(target).OfType<DynamicMetaObject>().ToArray<DynamicMetaObject>());
                     }
                     return dynamicMetaObject4;
                 }
             }
             else
             {
                 DynamicMetaObject dynamicMetaObject5 = errorSuggestion;
                 DynamicMetaObject dynamicMetaObject6 = dynamicMetaObject5;
                 if (dynamicMetaObject5 == null)
                 {
                     DynamicMetaObject[] dynamicMetaObjectArray = new DynamicMetaObject[2];
                     dynamicMetaObjectArray[0] = target;
                     dynamicMetaObjectArray[1] = value;
                     dynamicMetaObject6 = PSConvertBinder.ThrowNoConversion(indexes[0], typeof(int), this, this._version, dynamicMetaObjectArray);
                 }
                 return dynamicMetaObject6;
             }
         }
         else
         {
             DynamicMetaObject dynamicMetaObject7 = errorSuggestion;
             DynamicMetaObject dynamicMetaObject8 = dynamicMetaObject7;
             if (dynamicMetaObject7 == null)
             {
                 DynamicMetaObject dynamicMetaObject9 = target;
                 DynamicMetaObject[] dynamicMetaObjectArray1 = indexes;
                 BindingRestrictions bindingRestriction = value.PSGetTypeRestriction();
                 string str = "ArraySliceAssignmentFailed";
                 string arraySliceAssignmentFailed = ParserStrings.ArraySliceAssignmentFailed;
                 Expression[] expressionArray1 = new Expression[1];
                 Expression[] expressionArray2 = expressionArray1;
                 int num = 0;
                 MethodInfo arrayOpsIndexStringMessage = CachedReflectionInfo.ArrayOps_IndexStringMessage;
                 Type type = typeof(object);
                 DynamicMetaObject[] dynamicMetaObjectArray2 = indexes;
                 expressionArray2[num] = Expression.Call(arrayOpsIndexStringMessage, Expression.NewArrayInit(type, dynamicMetaObjectArray2.Select<DynamicMetaObject, Expression>((DynamicMetaObject i) => i.Expression.Cast(typeof(object)))));
                 dynamicMetaObject8 = dynamicMetaObject9.ThrowRuntimeError(dynamicMetaObjectArray1, bindingRestriction, str, arraySliceAssignmentFailed, expressionArray1);
             }
             return dynamicMetaObject8;
         }
     }
     else
     {
         return this.SetIndexMultiDimensionArray(target, indexes, value, errorSuggestion);
     }
 }