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]);
            }
        }
Beispiel #2
0
        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);

        }