Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
DynamicMetaObjectBinder.cs
Go to the documentation of this file.
6
7namespace System.Dynamic;
8
10{
11 public virtual Type ReturnType => typeof(object);
12
13 internal virtual bool IsStandardBinder => false;
14
15 public sealed override Expression Bind(object[] args, ReadOnlyCollection<ParameterExpression> parameters, LabelTarget returnLabel)
16 {
17 ContractUtils.RequiresNotNull(args, "args");
18 ContractUtils.RequiresNotNull(parameters, "parameters");
19 ContractUtils.RequiresNotNull(returnLabel, "returnLabel");
20 if (args.Length == 0)
21 {
22 throw Error.OutOfRange("args.Length", 1);
23 }
24 if (parameters.Count == 0)
25 {
26 throw Error.OutOfRange("parameters.Count", 1);
27 }
28 if (args.Length != parameters.Count)
29 {
30 throw new ArgumentOutOfRangeException("args");
31 }
32 Type type;
34 {
36 if (returnLabel.Type != typeof(void) && !TypeUtils.AreReferenceAssignable(returnLabel.Type, type))
37 {
38 throw Error.BinderNotCompatibleWithCallSite(type, this, returnLabel.Type);
39 }
40 }
41 else
42 {
43 type = returnLabel.Type;
44 }
45 DynamicMetaObject dynamicMetaObject = DynamicMetaObject.Create(args[0], parameters[0]);
46 DynamicMetaObject[] args2 = CreateArgumentMetaObjects(args, parameters);
47 DynamicMetaObject dynamicMetaObject2 = Bind(dynamicMetaObject, args2);
48 if (dynamicMetaObject2 == null)
49 {
51 }
52 Expression expression = dynamicMetaObject2.Expression;
53 BindingRestrictions restrictions = dynamicMetaObject2.Restrictions;
54 if (type != typeof(void) && !TypeUtils.AreReferenceAssignable(type, expression.Type))
55 {
56 if (dynamicMetaObject.Value is IDynamicMetaObjectProvider)
57 {
58 throw Error.DynamicObjectResultNotAssignable(expression.Type, dynamicMetaObject.Value.GetType(), this, type);
59 }
60 throw Error.DynamicBinderResultNotAssignable(expression.Type, this, type);
61 }
62 if (IsStandardBinder && args[0] is IDynamicMetaObjectProvider && restrictions == BindingRestrictions.Empty)
63 {
64 throw Error.DynamicBindingNeedsRestrictions(dynamicMetaObject.Value.GetType(), this);
65 }
66 if (expression.NodeType != ExpressionType.Goto)
67 {
68 expression = Expression.Return(returnLabel, expression);
69 }
70 if (restrictions != BindingRestrictions.Empty)
71 {
72 expression = Expression.IfThen(restrictions.ToExpression(), expression);
73 }
74 return expression;
75 }
76
78 {
80 if (args.Length != 1)
81 {
82 array = new DynamicMetaObject[args.Length - 1];
83 for (int i = 1; i < args.Length; i++)
84 {
85 array[i - 1] = DynamicMetaObject.Create(args[i], parameters[i]);
86 }
87 }
88 else
89 {
91 }
92 return array;
93 }
94
96
101
103 {
104 ContractUtils.RequiresNotNull(target, "target");
105 if (args == null)
106 {
107 return MakeDeferred(target.Restrictions, target);
108 }
109 return MakeDeferred(target.Restrictions.Merge(BindingRestrictions.Combine(args)), args.AddFirst<DynamicMetaObject>(target));
110 }
111
113 {
114 return MakeDeferred(BindingRestrictions.Combine(args), args);
115 }
116
123}
static BindingRestrictions Combine(IList< DynamicMetaObject >? contributingObjects)
BindingRestrictions Merge(BindingRestrictions restrictions)
static readonly BindingRestrictions Empty
DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args)
static DynamicMetaObject[] CreateArgumentMetaObjects(object[] args, ReadOnlyCollection< ParameterExpression > parameters)
DynamicMetaObject Defer(params DynamicMetaObject[] args)
DynamicMetaObject MakeDeferred(BindingRestrictions rs, params DynamicMetaObject[] args)
DynamicMetaObject Defer(DynamicMetaObject target, params DynamicMetaObject[]? args)
override Expression Bind(object[] args, ReadOnlyCollection< ParameterExpression > parameters, LabelTarget returnLabel)
static Expression[] GetExpressions(DynamicMetaObject[] objects)
static readonly DynamicMetaObject[] EmptyMetaObjects
static DynamicMetaObject Create(object value, Expression expression)
static void RequiresNotNull(object value, string paramName)
static bool AreReferenceAssignable(Type dest, Type src)
Definition TypeUtils.cs:673
static Type MakeDeferredSiteDelegate(DynamicMetaObject[] args, Type returnType)
static DynamicExpression Make(Type returnType, Type delegateType, CallSiteBinder binder, ReadOnlyCollection< Expression > arguments)
static Exception OutOfRange(string paramName, object p1)
Definition Error.cs:708
static Exception DynamicObjectResultNotAssignable(object p0, object p1, object p2, object p3)
Definition Error.cs:63
static Exception DynamicBindingNeedsRestrictions(object p0, object p1)
Definition Error.cs:58
static Exception BinderNotCompatibleWithCallSite(object p0, object p1, object p2)
Definition Error.cs:53
static Exception BindingCannotBeNull()
Definition Error.cs:73
static Exception DynamicBinderResultNotAssignable(object p0, object p1, object p2)
Definition Error.cs:68
static GotoExpression Return(LabelTarget target)
virtual ExpressionType NodeType
static ConditionalExpression IfThen(Expression test, Expression ifTrue)
static GotoExpression Goto(LabelTarget target)