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

📄 variabledeclaration.vb

📁 大名鼎鼎的mono是.NET平台的跨平台(支持linux
💻 VB
📖 第 1 页 / 共 2 页
字号:
        Helper.Assert(m_FieldType IsNot Nothing)        Return result    End Function    Public Overrides Function ResolveCode(ByVal Info As ResolveInfo) As Boolean        Dim result As Boolean = True        result = MyBase.ResolveCode(ResolveInfo.Default(Info.Compiler)) AndAlso result        If m_ArgumentList IsNot Nothing Then result = m_ArgumentList.ResolveCode(ResolveInfo.Default(Info.Compiler)) AndAlso result        If m_NewExpression IsNot Nothing Then            result = m_NewExpression.ResolveExpression(ResolveInfo.Default(Info.Compiler)) AndAlso result        End If        If m_VariableIdentifier IsNot Nothing AndAlso m_VariableIdentifier.HasArrayNameModifier Then            If m_FieldType.IsArray Then                Helper.AddError("Cannot specify array modifier on both type name and on variable name.")            Else                If m_VariableIdentifier.ArrayNameModifier.IsArraySizeInitializationModifier Then                    m_FieldType = m_VariableIdentifier.ArrayNameModifier.AsArraySizeInitializationModifier.CreateArrayType(m_FieldType)                ElseIf m_VariableIdentifier.ArrayNameModifier.IsArrayTypeModifiers Then                    m_FieldType = m_VariableIdentifier.ArrayNameModifier.AsArrayTypeModifiers.CreateArrayType(m_FieldType)                Else                    Throw New InternalException(Me)                End If            End If        End If        If m_VariableInitializer IsNot Nothing Then            result = m_VariableInitializer.ResolveCode(New ExpressionResolveInfo(Compiler, m_FieldType)) AndAlso result        End If        Return result    End Function    Public Function DefineMember() As Boolean Implements IDefinableMember.DefineMember        Dim result As Boolean = True        If IsLocalVariable Then            'Local builder will be defined in GenerateCode        Else            m_FieldBuilder = Me.DeclaringType.TypeBuilder.DefineField(Me.Name, VariableTypeOrTypeBuilder, m_Descriptor.Attributes)        End If        Return result    End Function    Friend Function DefineStaticMember() As Boolean        Dim result As Boolean = True        If m_FieldBuilder Is Nothing Then            Dim staticName As String            staticName = "$STATIC$" & Me.FindFirstParent(Of INameable).Name & "$" & Me.ObjectID.ToString & "$" & Me.Name            m_FieldBuilder = Me.DeclaringType.TypeBuilder.DefineField(staticName, VariableTypeOrTypeBuilder, m_Descriptor.Attributes)            If Me.HasInitializer Then                m_StaticInitBuilder = Me.DeclaringType.TypeBuilder.DefineField(m_FieldBuilder.Name & "$Init", Compiler.TypeCache.MS_VB_CS_StaticLocalInitFlag, m_FieldBuilder.Attributes)            End If        End If        Return result    End Function    Friend Function DefineLocalVariable(ByVal Info As EmitInfo) As Boolean        Dim result As Boolean = True        If Me.IsStaticVariable Then Return result        Helper.Assert(IsLocalVariable)        If m_LocalBuilder Is Nothing Then            m_LocalBuilder = Emitter.DeclareLocal(Info, VariableTypeOrTypeBuilder, Me.Name)        End If        Return result    End Function    Friend Overrides Function GenerateCode(ByVal Info As EmitInfo) As Boolean        Dim result As Boolean = True        Helper.Assert(VariableType IsNot Nothing)        If Me.GeneratedCode = False Then            If IsLocalVariable Then                If m_LocalBuilder Is Nothing Then result = DefineLocalVariable(Info) AndAlso result                Helper.Assert(m_LocalBuilder IsNot Nothing)                result = EmitVariableInitializer(Info) AndAlso result            ElseIf Me.Modifiers.Is(ModifierMasks.Static) Then                result = EmitStaticInitializer(Info) AndAlso result            Else                'Field builder has been defined in DefineMember                'EmitVariableInitializer will be called by the constructor declaration            End If            result = MyBase.GenerateCode(Info) AndAlso result        End If        Return result    End Function    Private Sub EmitStore(ByVal Info As EmitInfo)        If m_LocalBuilder IsNot Nothing Then            Emitter.EmitStoreVariable(Info, m_LocalBuilder)        ElseIf m_FieldBuilder IsNot Nothing Then            Emitter.EmitStoreField(Info, m_FieldBuilder)        Else            Helper.NotImplemented()        End If    End Sub    Private Sub EmitThisIfNecessary(ByVal Info As EmitInfo)        If m_FieldBuilder IsNot Nothing AndAlso m_FieldBuilder.IsStatic = False Then            Emitter.EmitLoadMe(Info, m_FieldBuilder.DeclaringType)        End If    End Sub    Private Function EmitStaticInitializer(ByVal Info As EmitInfo) As Boolean        Dim result As Boolean = True        Dim elseIfLabel As Label        Dim endIfLabel As Label        If Me.HasInitializer = False Then Return result        elseIfLabel = Emitter.DefineLabel(Info)        endIfLabel = Emitter.DefineLabel(Info)        'Monitor.Enter(initvar)        If Not m_StaticInitBuilder.IsStatic Then Emitter.EmitLoadMe(Info, Me.DeclaringType.TypeDescriptor)        Emitter.EmitLoadVariable(Info, m_StaticInitBuilder)        Emitter.EmitCall(Info, Compiler.TypeCache.System_Threading_Monitor__Enter_Object)        'Try        Dim exBlock As Label        exBlock = Info.ILGen.BeginExceptionBlock()        '   If initvar.State = 0 Then        If Not m_StaticInitBuilder.IsStatic Then Emitter.EmitLoadMe(Info, Me.DeclaringType.TypeDescriptor)        Emitter.EmitLoadVariable(Info, m_StaticInitBuilder)        Emitter.EmitLoadVariable(Info, Compiler.TypeCache.MS_VB_CS_StaticLocalInitFlag__State)        Emitter.EmitLoadI4Value(Info, 0I)        Info.ILGen.Emit(OpCodes.Bne_Un_S, elseIfLabel)        '       initvar.State = 2        If Not m_StaticInitBuilder.IsStatic Then Emitter.EmitLoadMe(Info, Me.DeclaringType.TypeDescriptor)        Emitter.EmitLoadVariable(Info, m_StaticInitBuilder)        Emitter.EmitLoadI4Value(Info, 2I)        Emitter.EmitStoreField(Info, Compiler.TypeCache.MS_VB_CS_StaticLocalInitFlag__State)        '       (initalization)        result = EmitVariableInitializer(Info) AndAlso result        Emitter.EmitBranch(Info, endIfLabel)        '   ElseIf initvar.State = 2 Then        Emitter.MarkLabel(Info, elseIfLabel)        If Not m_StaticInitBuilder.IsStatic Then Emitter.EmitLoadMe(Info, Me.DeclaringType.TypeDescriptor)        Emitter.EmitLoadVariable(Info, m_StaticInitBuilder)        Emitter.EmitLoadVariable(Info, Compiler.TypeCache.MS_VB_CS_StaticLocalInitFlag__State)        Emitter.EmitLoadI4Value(Info, 2I)        Info.ILGen.Emit(OpCodes.Bne_Un_S, endIfLabel)        '       Throw New IncompleteInitializationException        Emitter.EmitNew(Info, Compiler.TypeCache.MS_VB_CS_IncompleteInitialization__ctor)        Emitter.EmitThrow(Info)        '   End If        Emitter.MarkLabel(Info, endIfLabel)        Emitter.EmitLeave(Info, exBlock)        'Finally        Info.ILGen.BeginFinallyBlock()        '   initvar.State = 1        If Not m_StaticInitBuilder.IsStatic Then Emitter.EmitLoadMe(Info, Me.DeclaringType.TypeDescriptor)        Emitter.EmitLoadVariable(Info, m_StaticInitBuilder)        Emitter.EmitLoadI4Value(Info, 1I)        Emitter.EmitStoreField(Info, Compiler.TypeCache.MS_VB_CS_StaticLocalInitFlag__State)        '   Monitor.Exit(initvar)        If Not m_StaticInitBuilder.IsStatic Then Emitter.EmitLoadMe(Info, Me.DeclaringType.TypeDescriptor)        Emitter.EmitLoadVariable(Info, m_StaticInitBuilder)        Emitter.EmitCall(Info, Compiler.TypeCache.System_Threading_Monitor__Exit_Object)        'End Try        Info.ILGen.EndExceptionBlock()        Return result    End Function    Function EmitVariableInitializer(ByVal Info As EmitInfo) As Boolean        Dim result As Boolean = True        Dim varType As Type = VariableType        If m_VariableInitializer IsNot Nothing Then            EmitThisIfNecessary(Info)            result = m_VariableInitializer.GenerateCode(Info.Clone(True, False, varType)) AndAlso result            EmitStore(Info)        ElseIf m_IsNew Then            Helper.Assert(m_NewExpression IsNot Nothing)            EmitThisIfNecessary(Info)            result = m_NewExpression.GenerateCode(Info.Clone(True, False, varType)) AndAlso result            EmitStore(Info)        End If        If m_VariableIdentifier.ArrayNameModifier IsNot Nothing AndAlso m_VariableIdentifier.ArrayNameModifier.IsArraySizeInitializationModifier Then            EmitThisIfNecessary(Info)            ArrayCreationExpression.EmitArrayCreation(Me, Info, varType, m_VariableIdentifier.ArrayNameModifier.AsArraySizeInitializationModifier)            EmitStore(Info)        End If        Return result    End Function    ''' <summary>    ''' Checks for this grammar:    ''' VariableMemberDeclaration  ::=	[  Attributes  ]  VariableModifier+  VariableDeclarators  StatementTerminator    ''' </summary>    Shared Function IsMe(ByVal tm As tm) As Boolean        Dim i As Integer        While tm.PeekToken(i).Equals(ModifierMasks.VariableModifiers)            i += 1        End While        Return i > 0 AndAlso tm.PeekToken(i).IsIdentifier    End Function    Public ReadOnly Property FieldDescriptor() As FieldDescriptor Implements IFieldMember.FieldDescriptor        Get            Return m_Descriptor        End Get    End Property    Public Function CreateImplicitMembers() As Boolean Implements IHasImplicitMembers.CreateImplicitMembers        Dim result As Boolean = True        If Me.Modifiers.Is(ModifierMasks.WithEvents) = False Then Return result        Dim parentType As TypeDeclaration = Me.FindFirstParent(Of TypeDeclaration)()        Dim propertyAccessor As New PropertyDeclaration(parentType)        Dim modifiers As New Modifiers(ModifierMasks.Private)        If Me.Modifiers.Is(ModifierMasks.Shared) Then            modifiers.AddModifiers(ModifierMasks.Shared)        End If        modifiers.AddModifiers(Me.Modifiers.Mask And ModifierMasks.AccessModifiers)        propertyAccessor.Init(New Attributes(propertyAccessor), modifiers, Name, m_TypeName)        result = propertyAccessor.ResolveTypeReferences() AndAlso result        propertyAccessor.HandlesField = Me        Rename("_" & Name)        parentType.Members.Add(propertyAccessor)        Return result    End FunctionEnd Class

⌨️ 快捷键说明

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