protected void PopRecursiveValues(Value[] values, EmitContext context)
        {
            if (values.Length == 0)
            {
                return;
            }

            Value stack     = context.RecursiveStackValue;
            Value stackAddr = context.RecursiveStackAddressValue;
            BoundAccessExpression stackAddrAccess = BoundAccessExpression.BindAccess(stackAddr);
            TypeSymbol            intType         = context.GetTypeSymbol(SpecialType.System_Int32);
            TypeSymbol            objectType      = context.GetTypeSymbol(SpecialType.System_Object);
            TypeSymbol            objectArrayType = objectType.MakeArrayType(context);

            context.Module.AddCommentTag("Recursive stack pop");

            BoundInvocationExpression decrementExpression = new BoundPrefixOperatorExpression(context, SyntaxNode,
                                                                                              stackAddrAccess, new ExternSynthesizedOperatorSymbol(BuiltinOperatorType.Subtraction, intType, context));

            foreach (var valueToPop in values.Reverse())
            {
                context.Emit(decrementExpression);

                ExternSynthesizedMethodSymbol arrayGetMethod = new ExternSynthesizedMethodSymbol(context, "Get",
                                                                                                 objectArrayType, new [] { intType }, objectType, false);

                context.Module.AddPush(stack);
                context.Module.AddPush(stackAddr);
                context.Module.AddPush(valueToPop);
                context.Module.AddExtern(arrayGetMethod);
            }

            context.Module.AddCommentTag("Recursive stack pop end");
        }
        protected void PushRecursiveValues(Value[] values, EmitContext context)
        {
            if (values.Length == 0)
            {
                return;
            }

            Value stack = context.RecursiveStackValue;
            BoundAccessExpression stackAccess = BoundAccessExpression.BindAccess(stack);
            Value stackAddr = context.RecursiveStackAddressValue;
            BoundAccessExpression stackAddrAccess = BoundAccessExpression.BindAccess(stackAddr);

            context.Module.AddCommentTag("Recursive stack push");

            // Now we start copying values over to the stack
            BoundInvocationExpression incrementExpression = new BoundPrefixOperatorExpression(context, SyntaxNode,
                                                                                              stackAddrAccess, new ExternSynthesizedOperatorSymbol(BuiltinOperatorType.Addition, context.GetTypeSymbol(SpecialType.System_Int32), context));

            foreach (var valueToPush in values)
            {
                BoundArrayAccessExpression arraySet = new BoundArrayAccessExpression(null, context, stackAccess,
                                                                                     new BoundExpression[] { stackAddrAccess });

                context.EmitSet(arraySet, BoundAccessExpression.BindAccess(valueToPush));

                context.Emit(incrementExpression);
            }

            context.Module.AddCommentTag("Recursive stack push end");
        }