﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using System.Diagnostics;
using Microsoft.CodeAnalysis.Text;

namespace Microsoft.CodeAnalysis.CodeGen
{
    internal partial class ILBuilder
    {
        /// <summary>
        /// Abstract Execution state. 
        /// If we know something interesting about IL stream we put it here.
        /// </summary>
        private struct EmitState
        {
            private int _maxStack;
            private int _curStack;
            private int _instructionsEmitted;

            internal int InstructionsEmitted
            {
                get
                {
                    return _instructionsEmitted;
                }
            }

            internal void InstructionAdded()
            {
                _instructionsEmitted += 1;
            }

            /// <summary>
            /// Eval stack's high watermark.
            /// </summary>
            internal int MaxStack
            {
                get
                {
                    return _maxStack;
                }
                private set
                {
                    Debug.Assert(value >= 0 && value <= ushort.MaxValue);
                    _maxStack = value;
                }
            }

            /// <summary>
            /// Current evaluation stack depth.
            /// </summary>
            internal int CurStack
            {
                get
                {
                    return _curStack;
                }
                private set
                {
                    Debug.Assert(value >= 0 && value <= ushort.MaxValue);
                    _curStack = value;
                }
            }

            //TODO: for debugging we could also record what we have in the stack (I, F, O, &, ...)

            /// <summary>
            /// Record effects of that currently emitted instruction on the eval stack.
            /// </summary>
            internal void AdjustStack(int count)
            {
                CurStack += count;
                MaxStack = Math.Max(MaxStack, CurStack);
            }
        }
    }
}
