📄 variabledeclaration.vb
字号:
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 + -