Exemple #1
0
        public DekiScriptDom Visit(DekiScriptDomIfElse expr, DekiScriptOptimizerState state)
        {
            List <Tuplet <DekiScriptExpression, DekiScriptDom> > conditionals = new List <Tuplet <DekiScriptExpression, DekiScriptDom> >();

            for (int i = 0; i < expr.Conditionals.Length; i++)
            {
                Tuplet <DekiScriptExpression, DekiScriptDom> conditional = expr.Conditionals[i];

                // evaluate current branch
                DekiScriptExpression inner = conditional.Item1.VisitWith(DekiScriptExpressionOptimizer.Instance, state);
                DekiScriptDom        node  = conditional.Item2.VisitWith(this, state);

                // check if test has a constant outcome
                if (inner is DekiScriptLiteral)
                {
                    if (((DekiScriptLiteral)inner).IsNilFalseZero)
                    {
                        // NOTE (steveb): this conditional will never be successful; skip it
                    }
                    else
                    {
                        // NOTE (steveb): this conditional will is always successful; make it the "else" branch

                        // check if there are any previous branches
                        if (conditionals.Count == 0)
                        {
                            // just return the inner node structure
                            return(node);
                        }

                        // add branch as final "else" branch
                        conditionals.Add(new Tuplet <DekiScriptExpression, DekiScriptDom>(null, node));
                        break;
                    }
                }
                else
                {
                    conditionals.Add(new Tuplet <DekiScriptExpression, DekiScriptDom>(inner, node));
                }
            }
            return(new DekiScriptDomIfElse(expr.Location, conditionals.ToArray()));
        }
        public Empty Visit(DekiScriptDomIfElse expr, DekiScriptDomEvaluationState state)
        {
            var context = state.Context;
            var env     = state.Env;
            var parent  = state.Parent;

            try {
                foreach (Tuplet <DekiScriptExpression, DekiScriptDom> conditional in expr.Conditionals)
                {
                    // check if conditional is false
                    if ((conditional.Item1 != null) && conditional.Item1.VisitWith(DekiScriptExpressionEvaluation.Instance, env.NewLocalScope()).IsNilFalseZero)
                    {
                        continue;
                    }

                    // embed conditional branch
                    conditional.Item2.VisitWith(this, new DekiScriptDomEvaluationState(context, parent, env));
                    break;
                }
            } catch (Exception e) {
                EmbedExceptionMessage(expr, env, context, e, parent);
            }
            return(Empty.Value);
        }