Ejemplo n.º 1
0
        public StandardRule <T> GetRule <T>(CodeContext callerContext, DynamicAction action, object[] args)
        {
            Contract.RequiresNotNull(action, "action");
            //Debug.Assert(action.Kind != ActionKind.GetMember || ((GetMemberAction)action).Name != SymbolTable.StringToId("x"));

            StandardRule <T> rule = _ruleCache.FindRule <T>(callerContext, action, args);

            if (rule != null)
            {
                return(rule);
            }

            NoteRuleCreation(action, args);

            IDynamicObject ndo = args[0] as IDynamicObject;

            if (ndo != null)
            {
                rule = ndo.GetRule <T>(action, callerContext, args);
                Debug.Assert(rule == null || rule.Target != null && rule.Test != null);
            }

            rule = rule ?? MakeRule <T>(callerContext, action, args);
            Debug.Assert(rule != null && rule.Target != null && rule.Test != null);
#if DEBUG
            AstWriter.Dump(rule);
#endif
            return(rule);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Gets a rule, updates the site that called, and then returns the result of executing the rule.
        /// </summary>
        /// <typeparam name="T">The type of the DynamicSite the rule is being produced for.</typeparam>
        /// <param name="action">The Action the rule is being produced for.</param>
        /// <param name="args">The arguments to the rule as provided from the call site at runtime.</param>
        /// <param name="callerContext">The CodeContext that is requesting the rule and that should be used for conversions.</param>
        /// <param name="rules"></param>
        /// <param name="site"></param>
        /// <param name="target"></param>
        /// <returns>The result of executing the rule.</returns>
        internal object UpdateSiteAndExecute <T>(CodeContext callerContext, DynamicAction action, object[] args, object site, ref T target, ref RuleSet <T> rules)
        {
            Contract.RequiresNotNull(action, "action");
            //Debug.Assert(action.Kind != ActionKind.GetMember || ((GetMemberAction)action).Name != SymbolTable.StringToId("x"));
            object result;

            StandardRule <T> rule = _ruleCache.ExecuteRuleAndUpdateSite <T>(callerContext, action, args, site, ref target, ref rules, out result);

            if (rule != null)
            {
                return(result);
            }

            NoteRuleCreation(action, args);

            for (; ;)
            {
                IDynamicObject ndo = args[0] as IDynamicObject;
                if (ndo != null)
                {
                    rule = ndo.GetRule <T>(action, callerContext, args);
                    Debug.Assert(rule == null || rule.Target != null && rule.Test != null);
                }

                rule = rule ?? MakeRule <T>(callerContext, action, args);
                Debug.Assert(rule != null && rule.Target != null && rule.Test != null);
#if DEBUG
                AstWriter.Dump(rule);
#endif
                object[] callArgs = args;
                if (args.Length > 6)
                {
                    // BigDynamicSite
                    callArgs = new object[] { Tuple.MakeTuple(rule.ParamVariables[0].Type, args) };
                }

                CodeContext tmpCtx = callerContext.Scope.GetTemporaryVariableContext(callerContext, rule.ParamVariables, callArgs);
                try {
                    if ((bool)rule.Test.Evaluate(tmpCtx))
                    {
                        if (site != null)
                        {
                            DynamicSiteHelpers.UpdateSite <T>(callerContext, site, ref target, ref rules, rule);
                        }

                        _ruleCache.AddRule(action, args, rule);

                        return(rule.Target.Execute(tmpCtx));
                    }
                } finally {
                    tmpCtx.Scope.TemporaryStorage.Clear();
                }
            }
        }
Ejemplo n.º 3
0
        private static void DumpBlock(CodeBlock block, string id)
        {
#if DEBUG
            AstWriter.Dump(block, id);
#endif
        }