public void L1Cache() { var callSite = CallSite <Func <CallSite, object, object> > .Create(Binder.GetMember(CSharpBinderFlags.None, "A", typeof(CallSiteCachingTests), new CSharpArgumentInfo[1] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); ObjAndRule[] t = new ObjAndRule[200]; for (int i = 0; i < 10; i++) { object newExpando = CallSiteCachingTests.GetNewExpando(i); callSite.Target(callSite, newExpando); t[i].obj = newExpando; t[i].rule = callSite.Target; if (i > 0) { // must not reuse rules for new expandos Assert.NotEqual((object)t[i].rule, t[i - 1].rule); } } for (int i = 0; i < 10; i++) { var L1 = CallSiteOps.GetRules((dynamic)callSite); // L1 must contain rules Assert.Equal((object)t[9 - i].rule, L1[i]); } }
public static CallSite <T> CreateMatchmaker <T>(CallSite <T> site) where T : class { var mm = site.CreateMatchMaker(); CallSiteOps.ClearMatch(mm); return(mm); }
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); }