PageRenderTime 56ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/ClosersUnpacker/Lib/Newtonsoft.Json/Newtonsoft/Json/Utilities/DynamicProxyMetaObject!1.cs

https://gitlab.com/gpo04174/ClosersCMFRepacker
C# | 298 lines | 264 code | 34 blank | 0 comment | 24 complexity | 1b06f27b0bfa4ec2577f3f66e76d328b MD5 | raw file
  1. namespace Newtonsoft.Json.Utilities
  2. {
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Dynamic;
  6. using System.Linq;
  7. using System.Linq.Expressions;
  8. using System.Runtime.CompilerServices;
  9. using System.Runtime.InteropServices;
  10. internal sealed class DynamicProxyMetaObject<T> : DynamicMetaObject
  11. {
  12. private readonly bool _dontFallbackFirst;
  13. private readonly DynamicProxy<T> _proxy;
  14. private static readonly Expression[] NoArgs;
  15. static DynamicProxyMetaObject()
  16. {
  17. DynamicProxyMetaObject<T>.NoArgs = new Expression[0];
  18. }
  19. internal DynamicProxyMetaObject(Expression expression, T value, DynamicProxy<T> proxy, bool dontFallbackFirst) : base(expression, BindingRestrictions.Empty, value)
  20. {
  21. this._proxy = proxy;
  22. this._dontFallbackFirst = dontFallbackFirst;
  23. }
  24. public override DynamicMetaObject BindBinaryOperation(BinaryOperationBinder binder, DynamicMetaObject arg)
  25. {
  26. if (!this.IsOverridden("TryBinaryOperation"))
  27. {
  28. return base.BindBinaryOperation(binder, arg);
  29. }
  30. DynamicMetaObject[] args = new DynamicMetaObject[] { arg };
  31. return this.CallMethodWithResult("TryBinaryOperation", binder, DynamicProxyMetaObject<T>.GetArgs(args), e => binder.FallbackBinaryOperation((DynamicProxyMetaObject<T>) this, arg, e), null);
  32. }
  33. public override DynamicMetaObject BindConvert(ConvertBinder binder)
  34. {
  35. if (!this.IsOverridden("TryConvert"))
  36. {
  37. return base.BindConvert(binder);
  38. }
  39. return this.CallMethodWithResult("TryConvert", binder, DynamicProxyMetaObject<T>.NoArgs, e => binder.FallbackConvert((DynamicProxyMetaObject<T>) this, e), null);
  40. }
  41. public override DynamicMetaObject BindCreateInstance(CreateInstanceBinder binder, DynamicMetaObject[] args)
  42. {
  43. if (!this.IsOverridden("TryCreateInstance"))
  44. {
  45. return base.BindCreateInstance(binder, args);
  46. }
  47. return this.CallMethodWithResult("TryCreateInstance", binder, DynamicProxyMetaObject<T>.GetArgArray(args), e => binder.FallbackCreateInstance((DynamicProxyMetaObject<T>) this, args, e), null);
  48. }
  49. public override DynamicMetaObject BindDeleteIndex(DeleteIndexBinder binder, DynamicMetaObject[] indexes)
  50. {
  51. if (!this.IsOverridden("TryDeleteIndex"))
  52. {
  53. return base.BindDeleteIndex(binder, indexes);
  54. }
  55. return this.CallMethodNoResult("TryDeleteIndex", binder, DynamicProxyMetaObject<T>.GetArgArray(indexes), e => binder.FallbackDeleteIndex((DynamicProxyMetaObject<T>) this, indexes, e));
  56. }
  57. public override DynamicMetaObject BindDeleteMember(DeleteMemberBinder binder)
  58. {
  59. if (!this.IsOverridden("TryDeleteMember"))
  60. {
  61. return base.BindDeleteMember(binder);
  62. }
  63. return this.CallMethodNoResult("TryDeleteMember", binder, DynamicProxyMetaObject<T>.NoArgs, e => binder.FallbackDeleteMember((DynamicProxyMetaObject<T>) this, e));
  64. }
  65. public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes)
  66. {
  67. if (!this.IsOverridden("TryGetIndex"))
  68. {
  69. return base.BindGetIndex(binder, indexes);
  70. }
  71. return this.CallMethodWithResult("TryGetIndex", binder, DynamicProxyMetaObject<T>.GetArgArray(indexes), e => binder.FallbackGetIndex((DynamicProxyMetaObject<T>) this, indexes, e), null);
  72. }
  73. public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
  74. {
  75. if (!this.IsOverridden("TryGetMember"))
  76. {
  77. return base.BindGetMember(binder);
  78. }
  79. return this.CallMethodWithResult("TryGetMember", binder, DynamicProxyMetaObject<T>.NoArgs, e => binder.FallbackGetMember((DynamicProxyMetaObject<T>) this, e), null);
  80. }
  81. public override DynamicMetaObject BindInvoke(InvokeBinder binder, DynamicMetaObject[] args)
  82. {
  83. if (!this.IsOverridden("TryInvoke"))
  84. {
  85. return base.BindInvoke(binder, args);
  86. }
  87. return this.CallMethodWithResult("TryInvoke", binder, DynamicProxyMetaObject<T>.GetArgArray(args), e => binder.FallbackInvoke((DynamicProxyMetaObject<T>) this, args, e), null);
  88. }
  89. public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args)
  90. {
  91. if (!this.IsOverridden("TryInvokeMember"))
  92. {
  93. return base.BindInvokeMember(binder, args);
  94. }
  95. Fallback<T> fallback = e => binder.FallbackInvokeMember((DynamicProxyMetaObject<T>) this, args, e);
  96. DynamicMetaObject errorSuggestion = this.BuildCallMethodWithResult("TryInvokeMember", binder, DynamicProxyMetaObject<T>.GetArgArray(args), this.BuildCallMethodWithResult("TryGetMember", new GetBinderAdapter<T>(binder), DynamicProxyMetaObject<T>.NoArgs, fallback(null), e => binder.FallbackInvoke(e, args, null)), null);
  97. if (!this._dontFallbackFirst)
  98. {
  99. return fallback(errorSuggestion);
  100. }
  101. return errorSuggestion;
  102. }
  103. public override DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value)
  104. {
  105. if (!this.IsOverridden("TrySetIndex"))
  106. {
  107. return base.BindSetIndex(binder, indexes, value);
  108. }
  109. return this.CallMethodReturnLast("TrySetIndex", binder, DynamicProxyMetaObject<T>.GetArgArray(indexes, value), e => binder.FallbackSetIndex((DynamicProxyMetaObject<T>) this, indexes, value, e));
  110. }
  111. public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value)
  112. {
  113. if (!this.IsOverridden("TrySetMember"))
  114. {
  115. return base.BindSetMember(binder, value);
  116. }
  117. DynamicMetaObject[] args = new DynamicMetaObject[] { value };
  118. return this.CallMethodReturnLast("TrySetMember", binder, DynamicProxyMetaObject<T>.GetArgs(args), e => binder.FallbackSetMember((DynamicProxyMetaObject<T>) this, value, e));
  119. }
  120. public override DynamicMetaObject BindUnaryOperation(UnaryOperationBinder binder)
  121. {
  122. if (!this.IsOverridden("TryUnaryOperation"))
  123. {
  124. return base.BindUnaryOperation(binder);
  125. }
  126. return this.CallMethodWithResult("TryUnaryOperation", binder, DynamicProxyMetaObject<T>.NoArgs, e => binder.FallbackUnaryOperation((DynamicProxyMetaObject<T>) this, e), null);
  127. }
  128. private DynamicMetaObject BuildCallMethodWithResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, DynamicMetaObject fallbackResult, Fallback<T> fallbackInvoke)
  129. {
  130. ParameterExpression item = Expression.Parameter(typeof(object), null);
  131. IList<Expression> initial = new List<Expression> {
  132. Expression.Convert(base.Expression, typeof(T)),
  133. DynamicProxyMetaObject<T>.Constant(binder)
  134. };
  135. initial.AddRange<Expression>(args);
  136. initial.Add(item);
  137. DynamicMetaObject errorSuggestion = new DynamicMetaObject(item, BindingRestrictions.Empty);
  138. if (binder.ReturnType != typeof(object))
  139. {
  140. errorSuggestion = new DynamicMetaObject(Expression.Convert(errorSuggestion.Expression, binder.ReturnType), errorSuggestion.Restrictions);
  141. }
  142. if (fallbackInvoke != null)
  143. {
  144. errorSuggestion = fallbackInvoke(errorSuggestion);
  145. }
  146. ParameterExpression[] variables = new ParameterExpression[] { item };
  147. Expression[] expressions = new Expression[] { Expression.Condition(Expression.Call(Expression.Constant(this._proxy), typeof(DynamicProxy<T>).GetMethod(methodName), initial), errorSuggestion.Expression, fallbackResult.Expression, binder.ReturnType) };
  148. return new DynamicMetaObject(Expression.Block(variables, expressions), this.GetRestrictions().Merge(errorSuggestion.Restrictions).Merge(fallbackResult.Restrictions));
  149. }
  150. private DynamicMetaObject CallMethodNoResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback<T> fallback)
  151. {
  152. DynamicMetaObject obj2 = fallback(null);
  153. IList<Expression> initial = new List<Expression> {
  154. Expression.Convert(base.Expression, typeof(T)),
  155. DynamicProxyMetaObject<T>.Constant(binder)
  156. };
  157. initial.AddRange<Expression>(args);
  158. DynamicMetaObject errorSuggestion = new DynamicMetaObject(Expression.Condition(Expression.Call(Expression.Constant(this._proxy), typeof(DynamicProxy<T>).GetMethod(methodName), initial), Expression.Empty(), obj2.Expression, typeof(void)), this.GetRestrictions().Merge(obj2.Restrictions));
  159. if (!this._dontFallbackFirst)
  160. {
  161. return fallback(errorSuggestion);
  162. }
  163. return errorSuggestion;
  164. }
  165. private DynamicMetaObject CallMethodReturnLast(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback<T> fallback)
  166. {
  167. DynamicMetaObject obj2 = fallback(null);
  168. ParameterExpression left = Expression.Parameter(typeof(object), null);
  169. IList<Expression> initial = new List<Expression> {
  170. Expression.Convert(base.Expression, typeof(T)),
  171. DynamicProxyMetaObject<T>.Constant(binder)
  172. };
  173. initial.AddRange<Expression>(args);
  174. initial[args.Length + 1] = Expression.Assign(left, initial[args.Length + 1]);
  175. ParameterExpression[] variables = new ParameterExpression[] { left };
  176. Expression[] expressions = new Expression[] { Expression.Condition(Expression.Call(Expression.Constant(this._proxy), typeof(DynamicProxy<T>).GetMethod(methodName), initial), left, obj2.Expression, typeof(object)) };
  177. DynamicMetaObject errorSuggestion = new DynamicMetaObject(Expression.Block(variables, expressions), this.GetRestrictions().Merge(obj2.Restrictions));
  178. if (!this._dontFallbackFirst)
  179. {
  180. return fallback(errorSuggestion);
  181. }
  182. return errorSuggestion;
  183. }
  184. private DynamicMetaObject CallMethodWithResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback<T> fallback, Fallback<T> fallbackInvoke = null)
  185. {
  186. DynamicMetaObject fallbackResult = fallback(null);
  187. DynamicMetaObject errorSuggestion = this.BuildCallMethodWithResult(methodName, binder, args, fallbackResult, fallbackInvoke);
  188. if (!this._dontFallbackFirst)
  189. {
  190. return fallback(errorSuggestion);
  191. }
  192. return errorSuggestion;
  193. }
  194. private static ConstantExpression Constant(DynamicMetaObjectBinder binder)
  195. {
  196. Type type = binder.GetType();
  197. while (!type.IsVisible())
  198. {
  199. type = type.BaseType();
  200. }
  201. return Expression.Constant(binder, type);
  202. }
  203. private static Expression[] GetArgArray(DynamicMetaObject[] args)
  204. {
  205. return new NewArrayExpression[] { Expression.NewArrayInit(typeof(object), DynamicProxyMetaObject<T>.GetArgs(args)) };
  206. }
  207. private static Expression[] GetArgArray(DynamicMetaObject[] args, DynamicMetaObject value)
  208. {
  209. return new Expression[] { Expression.NewArrayInit(typeof(object), DynamicProxyMetaObject<T>.GetArgs(args)), Expression.Convert(value.Expression, typeof(object)) };
  210. }
  211. private static Expression[] GetArgs(params DynamicMetaObject[] args)
  212. {
  213. return (from arg in args select Expression.Convert(arg.Expression, typeof(object))).ToArray<UnaryExpression>();
  214. }
  215. public override IEnumerable<string> GetDynamicMemberNames()
  216. {
  217. return this._proxy.GetDynamicMemberNames(this.Value);
  218. }
  219. private BindingRestrictions GetRestrictions()
  220. {
  221. if ((this.Value == null) && base.HasValue)
  222. {
  223. return BindingRestrictions.GetInstanceRestriction(base.Expression, null);
  224. }
  225. return BindingRestrictions.GetTypeRestriction(base.Expression, base.LimitType);
  226. }
  227. private bool IsOverridden(string method)
  228. {
  229. return ReflectionUtils.IsMethodOverridden(this._proxy.GetType(), typeof(DynamicProxy<T>), method);
  230. }
  231. private T Value
  232. {
  233. get
  234. {
  235. return (T) base.Value;
  236. }
  237. }
  238. [Serializable, CompilerGenerated]
  239. private sealed class <>c
  240. {
  241. public static readonly DynamicProxyMetaObject<T>.<>c <>9;
  242. public static Func<DynamicMetaObject, UnaryExpression> <>9__20_0;
  243. static <>c()
  244. {
  245. DynamicProxyMetaObject<T>.<>c.<>9 = new DynamicProxyMetaObject<T>.<>c();
  246. }
  247. internal UnaryExpression <GetArgs>b__20_0(DynamicMetaObject arg)
  248. {
  249. return Expression.Convert(arg.Expression, typeof(object));
  250. }
  251. }
  252. private delegate DynamicMetaObject Fallback(DynamicMetaObject errorSuggestion);
  253. private sealed class GetBinderAdapter : GetMemberBinder
  254. {
  255. internal GetBinderAdapter(InvokeMemberBinder binder) : base(binder.Name, binder.IgnoreCase)
  256. {
  257. }
  258. public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
  259. {
  260. throw new NotSupportedException();
  261. }
  262. }
  263. }
  264. }