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); }
/// <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(); } } }
private static void DumpBlock(CodeBlock block, string id) { #if DEBUG AstWriter.Dump(block, id); #endif }