⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emitstack.vb

📁 大名鼎鼎的mono是.NET平台的跨平台(支持linux
💻 VB
字号:
' ' Visual Basic.Net Compiler' Copyright (C) 2004 - 2007 Rolf Bjarne Kvinge, RKvinge@novell.com' ' This library is free software; you can redistribute it and/or' modify it under the terms of the GNU Lesser General Public' License as published by the Free Software Foundation; either' version 2.1 of the License, or (at your option) any later version.' ' This library is distributed in the hope that it will be useful,' but WITHOUT ANY WARRANTY; without even the implied warranty of' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU' Lesser General Public License for more details.' ' You should have received a copy of the GNU Lesser General Public' License along with this library; if not, write to the Free Software' Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA' #If DEBUG Then#Const DEBUGSTACKTYPES = 0#Const LOGDEBUGSTACKTYPES = 0#End IfPublic Class EmitStack    Inherits Generic.Stack(Of Type)    Private m_Compiler As Compiler    Shadows Function Peek() As Type        Return MyBase.Peek    End Function    '<Diagnostics.Conditional("DEBUG")> _    Public Sub SwitchHead(ByVal FromType As Type, ByVal ToType As Type)        Me.Pop(FromType)        Me.Push(ToType)    End Sub    <Diagnostics.Conditional("DEBUG")> Sub CheckStackEmpty(ByVal MessageOnError As String)        If Count > 0 Then            Compiler.Report.WriteLine(vbnc.Report.ReportLevels.Debug, MessageOnError)            Helper.StopIfDebugging(False)            Clear()        End If    End Sub    '<Diagnostics.Conditional("DEBUG")> _    Shadows Sub Clear()#If LOGDEBUGSTACKTYPES Then        Compiler.Report.WriteLine(vbnc.Report.ReportLevels.Debug, "Clearing the stack!")#End If        MyBase.Clear()    End Sub    Sub New(ByVal Compiler As Compiler)        MyBase.New()        m_Compiler = Compiler    End Sub    ReadOnly Property Compiler() As Compiler        Get            Return m_Compiler        End Get    End Property    '<Diagnostics.Conditional("DEBUG")> _    Shadows Sub Push(ByVal Type As Type)        MyBase.Push(Type)#If LOGDEBUGSTACKTYPES Then        Compiler.Report.WriteLine(vbnc.Report.ReportLevels.Debug, String.Format("Pushed stack type ({1} left on the stack): {0,-30} Stack now: {2}", Type.ToString, Count.ToString, StackState))#End If    End Sub    Private Function StackState() As String        Dim tmp() As Object = ToArray()        Dim cnt As Integer        Dim result As String = ""        For i As Integer = 0 To tmp.GetUpperBound(0)            result = String.Format("{0}", DirectCast(tmp(i), Type).ToString) & ", " & result            cnt += 1        Next        If result.Length > 0 Then result = result.Substring(0, result.Length - 2)        Return result    End Function    '<Diagnostics.Conditional("DEBUG")> _    Shadows Sub Pop(ByVal Type As Type)        Dim logStack As Boolean = False#If LOGDEBUGSTACKTYPES Then        logStack = True#End If#If DEBUGSTACKTYPES Then        If Count = 0 Then            Compiler.Report.WriteLine(vbnc.Report.ReportLevels.Debug, String.Format("Trying to pop type '{0}' off the stack, but stack is empty.", Type.ToString))            'Helper.Stop()            Return Nothing        End If        Dim tmp As Type        tmp = MyBase.Pop()        If Helper.CompareType(tmp, Type) = False AndAlso Helper.IsAssignable(Compiler, tmp, Type) = False AndAlso Helper.IsInterface(Compiler, Type) = False Then            If Helper.IsEnum(tmp) = False Then 'OrElse Helper.CompareType(tmp.GetField("value__").FieldType, Type) = False Then                If Type.ToString <> tmp.ToString Then                    If Type.ContainsGenericParameters = False AndAlso tmp.ContainsGenericParameters Then                        Compiler.Report.WriteLine(vbnc.Report.ReportLevels.Debug, String.Format("Trying to pop type '{0}' when type on the stack is '{1}'.", Type.ToString, tmp.ToString))                        Helper.StopIfDebugging(False)                    End If                End If            End If        End If        If logStack Then            Compiler.Report.WriteLine(vbnc.Report.ReportLevels.Debug, String.Format("Popped stack type ({1} left on the stack): {0,-30} Stack now: {2}", tmp.ToString, Count.ToString, StackState))        End If        Return tmp#Else        If Count > 0 Then            MyBase.Pop()        Else            'Return Nothing        End If#End If    End Sub    ''' <summary>    ''' Are there any values left on the stack?    ''' </summary>    ''' <value></value>    ''' <remarks></remarks>    ReadOnly Property IsStackEmpty() As Boolean        Get            Return Count = 0        End Get    End PropertyEnd Class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -