261 {
262 CallSite<Func<CallSite, T0, T1, T2, T3, TRet>> callSite = (
CallSite<Func<CallSite, T0, T1, T2, T3, TRet>>)site;
263 Func<CallSite, T0, T1, T2, T3, TRet> target = callSite.
Target;
265 Func<CallSite, T0, T1, T2, T3, TRet>[] rules;
266 Func<CallSite, T0, T1, T2, T3, TRet>
func;
267 if ((rules =
CallSiteOps.GetRules(callSite)) !=
null)
268 {
269 for (
int i = 0;
i < rules.Length;
i++)
270 {
272 if ((
object)
func != target)
273 {
274 callSite.Target =
func;
275 TRet result =
func(site, arg0, arg1, arg2, arg3);
277 {
280 return result;
281 }
283 }
284 }
285 }
288 for (int j = 0; j < rules.Length; j++)
289 {
290 func = (callSite.Target = rules[j]);
291 try
292 {
293 TRet result =
func(site, arg0, arg1, arg2, arg3);
295 {
297 return result;
298 }
299 }
300 finally
301 {
303 {
306 }
307 }
309 }
311 object[] args = new object[4] { arg0, arg1, arg2, arg3 };
312 while (true)
313 {
314 callSite.Target = target;
315 func = (callSite.Target = callSite.
Binder.BindCore(callSite, args));
316 try
317 {
318 TRet result =
func(site, arg0, arg1, arg2, arg3);
320 {
322 return result;
323 }
324 }
325 finally
326 {
328 {
330 }
331 }
333 }
334 }
static bool GetMatch(CallSite site)
static void ClearMatch(CallSite site)
void ReleaseMatchmaker(CallSite matchMaker)