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