/// <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; } } }
/// <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; } }
/// <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; } }
/// <summary> /// /// </summary> /// <param name="element"></param> public void Push( AVM1DataElement element ) { _SP++; if ( _SP >= 0 ) _InternalStack.Add( element ); }
/// <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 ] ); } }