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);

        }