Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ UpdateAndExecute2< T0, T1, TRet >()

static TRet System.Dynamic.UpdateDelegates.UpdateAndExecute2< T0, T1, TRet > ( CallSite site,
T0 arg0,
T1 arg1 )
inlinestaticpackage

Definition at line 92 of file UpdateDelegates.cs.

93 {
95 Func<CallSite, T0, T1, TRet> target = callSite.Target;
96 site = callSite.GetMatchmaker();
97 Func<CallSite, T0, T1, TRet>[] rules;
98 Func<CallSite, T0, T1, TRet> func;
99 if ((rules = CallSiteOps.GetRules(callSite)) != null)
100 {
101 for (int i = 0; i < rules.Length; i++)
102 {
103 func = rules[i];
104 if ((object)func != target)
105 {
106 callSite.Target = func;
107 TRet result = func(site, arg0, arg1);
108 if (CallSiteOps.GetMatch(site))
109 {
110 CallSiteOps.UpdateRules(callSite, i);
111 callSite.ReleaseMatchmaker(site);
112 return result;
113 }
115 }
116 }
117 }
118 RuleCache<Func<CallSite, T0, T1, TRet>> ruleCache = CallSiteOps.GetRuleCache(callSite);
119 rules = ruleCache.GetRules();
120 for (int j = 0; j < rules.Length; j++)
121 {
122 func = (callSite.Target = rules[j]);
123 try
124 {
125 TRet result = func(site, arg0, arg1);
126 if (CallSiteOps.GetMatch(site))
127 {
128 callSite.ReleaseMatchmaker(site);
129 return result;
130 }
131 }
132 finally
133 {
134 if (CallSiteOps.GetMatch(site))
135 {
136 CallSiteOps.AddRule(callSite, func);
137 CallSiteOps.MoveRule(ruleCache, func, j);
138 }
139 }
141 }
142 func = null;
143 object[] args = new object[2] { arg0, arg1 };
144 while (true)
145 {
146 callSite.Target = target;
147 func = (callSite.Target = callSite.Binder.BindCore(callSite, args));
148 try
149 {
150 TRet result = func(site, arg0, arg1);
151 if (CallSiteOps.GetMatch(site))
152 {
153 callSite.ReleaseMatchmaker(site);
154 return result;
155 }
156 }
157 finally
158 {
159 if (CallSiteOps.GetMatch(site))
160 {
161 CallSiteOps.AddRule(callSite, func);
162 }
163 }
165 }
166 }
static bool GetMatch(CallSite site)
static void ClearMatch(CallSite site)
void ReleaseMatchmaker(CallSite matchMaker)
Definition CallSite.cs:106

References System.Runtime.CompilerServices.CallSite< T >.Binder, System.Runtime.CompilerServices.CallSiteOps.ClearMatch(), System.Runtime.CompilerServices.CallSiteOps.GetMatch(), System.Runtime.CompilerServices.CallSite< T >.GetMatchmaker(), System.Runtime.CompilerServices.RuleCache< T >.GetRules(), System.Runtime.CompilerServices.CallSite< T >.ReleaseMatchmaker(), and System.Runtime.CompilerServices.CallSite< T >.Target.