Example #1
0
 /// <summary>
 /// Gets the item that is the specified number of elements below the stack top. 0 is the top.
 /// </summary>
 /// <param name="distanceFromStackTop">How far to look down (0=not)</param>
 /// <returns>Stack Item</returns>
 public AVM1DataElement this[uint distanceFromStackTop]
 {
     get
     {
         int realIndex = ( _InternalStack.Count - 1 ) - (int)distanceFromStackTop;
         if ( realIndex >= 0 )
         {
             return _InternalStack[ realIndex ];
         }
         else
         {
             AVM1DataElement e = new AVM1DataElement();
             e.Value = null;
             e.DataType = AVM1DataTypes.AVM_UNKNOWN;
             return e;
         }
     }
 }
Example #2
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="code"></param>
        /// <param name="instructionIndex"></param>
        /// <param name="stackIn"></param>
        /// <param name="argc"></param>
        /// <param name="entry"></param>
        /// <returns></returns>
        public static bool TraceArgument( AVM1Code code, int instructionIndex, AVM1Stack stackIn, uint argc, out AVM1DataElement entry )
        {
            if ( null == stackIn)
                stackIn = new AVM1Stack();

            int indexInBlock;
            BasicBlock home = code.Flowgraph.BlockOfInstruction( ( uint )instructionIndex, out indexInBlock );

            if ( null == home )
            {
                throw new Exception( "FUCKUP: instuction index " + instructionIndex.ToString( "d" ) + " not found in AVM1Code graph" );
            }

            for ( int i = 0; i < indexInBlock; i++ )
            {
                if ( code[ ( int )home.Indices[ i ] ].IsStackPredictable )
                {
                    code[ ( int )home.Indices[ i ] ].PerformStackOperations( stackIn );
                }
                else
                {
                    entry = default( AVM1DataElement );
                    return false;
                }
            }

            if ( stackIn.Count > argc )
            {
                entry = stackIn[ argc ];
                return true;
            }
            else
            {
                entry = default(AVM1DataElement);
                return false;
            }
        }
Example #3
0
 /// <summary>
 /// 
 /// </summary>
 /// <returns></returns>
 public AVM1DataElement Pop()
 {
     _SP--;
     if ( _SP > 0 )
     {
         AVM1DataElement e = _InternalStack[ _InternalStack.Count - 1 ];
         _InternalStack.RemoveAt( _InternalStack.Count - 1 );
         return e;
     }
     else
     {
         AVM1DataElement e = new AVM1DataElement();
         e.Value = null;
         e.DataType = AVM1DataTypes.AVM_UNKNOWN;
         return e;
     }
 }
Example #4
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="element"></param>
 public void Push( AVM1DataElement element )
 {
     _SP++;
     if ( _SP >= 0 )
         _InternalStack.Add( element );
 }
Example #5
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="elements"></param>
 public void Fill( AVM1DataElement[] elements )
 {
     _InternalStack.Clear();
     for ( int i = 0; i < elements.Length; i++ )
     {
         _InternalStack.Add( elements[ i ] );
     }
 }