private void AssertPossibleStackOverflow(XzaarExpression expression)
        {
            // TODO: Dependecy Inject a stack guard validation object to do take care of this for us
            if (ctx.StackRecursionCount > 10)
            {
                throw new CompilerException(
                          $"PANIC!! StackOverflow! {expression.GetType()} [{expression.NodeType}] could not be handled.");
            }

            if (ctx.LastVisitedExpression == expression)
            {
                ctx.StackRecursionCount++;
            }
            else
            {
                ctx.StackRecursionCount = 0;
            }

            ctx.LastVisitedExpression = expression;
        }
Exemplo n.º 2
0
        public object Visit(XzaarExpression expression)
        {
            // TODO(Zerratar): Dependecy Inject a stack guard validation object to do take care of this for us
            if (ctx.StackRecursionCount > 10)
            {
                throw new CompilerException("PANIC!! Stackoverflow! " + expression.GetType() + " [" + expression.NodeType + "] not implemented");
            }

            if (ctx.LastVisited == expression)
            {
                ctx.StackRecursionCount++;
            }
            else
            {
                ctx.StackRecursionCount = 0;
            }

            ctx.LastVisited = expression;

            if (expression.NodeType == ExpressionType.Block)
            {
                var block = expression as BlockExpression;
                if (block != null)
                {
                    foreach (var item in block.Expressions)
                    {
                        Visit(item);
                    }
                }
                return(null);
            }

            // NOTE: Blueh! If only we could have used dynamics here, that would have saved us so many darn lines :P But since we are compiling for 3.5, thats not possible
            //

//#if UNITY
            if (expression is LambdaExpression lambda)
            {
                return(Visit(lambda));
            }
            if (expression is UnaryExpression unaryExpression)
            {
                return(Visit(unaryExpression));
            }
            if (expression is IfElseExpression elseExpression)
            {
                return(Visit(elseExpression));
            }
            if (expression is ConditionalExpression conditionalExpression)
            {
                return(Visit(conditionalExpression));
            }
            if (expression is GotoExpression gotoExpression)
            {
                return(Visit(gotoExpression));
            }
            if (expression is MemberExpression memberExpression)
            {
                return(Visit(memberExpression));
            }
            if (expression is BinaryExpression binaryExpression)
            {
                return(Visit(binaryExpression));
            }
            if (expression is MemberAccessChainExpression chainExpression)
            {
                return(Visit(chainExpression));
            }
            if (expression is ForExpression forExpression)
            {
                return(Visit(forExpression));
            }
            if (expression is ForEachExpression eachExpression)
            {
                return(Visit(eachExpression));
            }
            if (expression is SwitchCaseExpression caseExpression)
            {
                return(Visit(caseExpression));
            }
            if (expression is DoWhileExpression whileExpression)
            {
                return(Visit(whileExpression));
            }
            if (expression is LoopExpression loopExpression)
            {
                return(Visit(loopExpression));
            }
            if (expression is SwitchExpression switchExpression)
            {
                return(Visit(switchExpression));
            }
            if (expression is CreateStructExpression structExpression)
            {
                return(Visit(structExpression));
            }
            if (expression is ConstantExpression constantExpression)
            {
                return(Visit(constantExpression));
            }
            if (expression is FunctionCallExpression callExpression)
            {
                return(Visit(callExpression));
            }
            if (expression is VariableDefinitionExpression definitionExpression)
            {
                return(Visit(definitionExpression));
            }
            if (expression is FieldExpression fieldExpression)
            {
                return(Visit(fieldExpression));
            }
            if (expression is LabelExpression labelExpression)
            {
                return(Visit(labelExpression));
            }
            if (expression is ParameterExpression parameterExpression)
            {
                return(Visit(parameterExpression));
            }
            if (expression is FunctionExpression functionExpression)
            {
                return(Visit(functionExpression));
            }
            if (expression is StructExpression expression1)
            {
                return(Visit(expression1));
            }
            return(Visit(expression));
//#else
//            return Visit((dynamic)expression);
//#endif
        }