public void BinderCacheAddition() { CSharpArgumentInfo x = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null); CSharpArgumentInfo y = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null); CallSiteBinder binder = Binder.BinaryOperation( CSharpBinderFlags.None, System.Linq.Expressions.ExpressionType.Add, typeof(TestClass01), new[] { x, y }); var site = CallSite <Func <CallSite, object, object, object> > .Create(binder); Func <CallSite, object, object, object> targ = site.Target; object res = targ(site, 1, 2); Assert.Equal(3, res); var rulesCnt = CallSiteOps.GetCachedRules(CallSiteOps.GetRuleCache((dynamic)site)).Length; Assert.Equal(1, rulesCnt); TestClass01.BindThings(); rulesCnt = CallSiteOps.GetCachedRules(CallSiteOps.GetRuleCache((dynamic)site)).Length; Assert.Equal(3, rulesCnt); }
public void BinderCacheFlushWhenTooBig() { var callSite1 = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, "A", typeof(TestClass01), new CSharpArgumentInfo[1] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); var rules1 = CallSiteOps.GetRuleCache((dynamic)callSite1); var callSite2 = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, "A", typeof(TestClass01), new CSharpArgumentInfo[1] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); var rules2 = CallSiteOps.GetRuleCache((dynamic)callSite2); Assert.Equal(rules1, rules2); // blast through callsite cache for (int i = 0; i < 10000; i++) { var callSiteN = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, i.ToString(), typeof(TestClass01), new CSharpArgumentInfo[1] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); } var callSite3 = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, "A", typeof(TestClass01), new CSharpArgumentInfo[1] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); var rules3 = CallSiteOps.GetRuleCache((dynamic)callSite3); Assert.NotEqual(rules1, rules3); }