helper.vb

来自「大名鼎鼎的mono是.NET平台的跨平台(支持linux」· VB 代码 · 共 1,554 行 · 第 1/5 页

VB
1,554
字号
    Shared Function EmitArgumentsAndCallOrCallVirt(ByVal Info As EmitInfo, ByVal InstanceExpression As Expression, ByVal Arguments As ArgumentList, ByVal Method As MethodBase) As Boolean        Dim result As Boolean = True        Dim needsConstrained As Boolean        Dim constrainedLocal As LocalBuilder = Nothing        needsConstrained = InstanceExpression IsNot Nothing AndAlso InstanceExpression.ExpressionType.IsGenericParameter        If InstanceExpression IsNot Nothing Then            Dim ieDesiredType As Type            Dim ieInfo As EmitInfo            If needsConstrained Then                ieDesiredType = InstanceExpression.ExpressionType            Else                ieDesiredType = Method.DeclaringType                If ieDesiredType.IsValueType Then                    ieDesiredType = Info.Compiler.TypeManager.MakeByRefType(CType(Info.Method, ParsedObject), ieDesiredType)                End If            End If            ieInfo = Info.Clone(True, False, ieDesiredType)            Dim derefExp As DeRefExpression = TryCast(InstanceExpression, DeRefExpression)            If needsConstrained AndAlso derefExp IsNot Nothing Then                result = derefExp.Expression.GenerateCode(Info.Clone(True, False, derefExp.Expression.ExpressionType)) AndAlso result            Else                Dim getRef As GetRefExpression = TryCast(InstanceExpression, GetRefExpression)                If getRef IsNot Nothing AndAlso getRef.Expression.ExpressionType.IsValueType AndAlso Helper.CompareType(Method.DeclaringType, Info.Compiler.TypeCache.System_Object)                     result = getRef.Expression.GenerateCode(ieInfo) AndAlso result                    Emitter.EmitBox(Info, getRef.Expression.ExpressionType)                Else                    result = InstanceExpression.GenerateCode(ieInfo) AndAlso result                End If                If needsConstrained Then                    constrainedLocal = Emitter.DeclareLocal(Info, InstanceExpression.ExpressionType)                    Emitter.EmitStoreVariable(Info, constrainedLocal)                    Emitter.EmitLoadVariableLocation(Info, constrainedLocal)                End If            End If        End If        If Arguments IsNot Nothing Then            Dim methodParameters() As ParameterInfo            methodParameters = Helper.GetParameters(Info.Compiler, Method)            result = Arguments.GenerateCode(Info, methodParameters) AndAlso result        End If        If needsConstrained Then            Emitter.EmitConstrainedCallVirt(Info, Method, InstanceExpression.ExpressionType)        ElseIf InstanceExpression IsNot Nothing AndAlso (TypeOf InstanceExpression Is MyClassExpression OrElse TypeOf InstanceExpression Is MyBaseExpression) Then            Emitter.EmitCall(Info, Method)        Else            Emitter.EmitCallOrCallVirt(Info, Method)        End If        If constrainedLocal IsNot Nothing Then            Emitter.FreeLocal(constrainedLocal)        End If        Return result    End Function    Shared Function GetInvokeMethod(ByVal Compiler As Compiler, ByVal DelegateType As Type) As MethodInfo        Helper.Assert(IsDelegate(Compiler, DelegateType), "The type '" & DelegateType.FullName & "' is not a delegate.")        Return DelegateType.GetMethod(DelegateDeclaration.STR_Invoke, BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.Instance)    End Function    Shared Function IsDelegate(ByVal Compiler As Compiler, ByVal Type As Type) As Boolean        Return Helper.IsSubclassOf(Compiler.TypeCache.System_MulticastDelegate, Type)    End Function    ''' <summary>    ''' Returns true if the type has a default property    ''' </summary>    ''' <param name="Type"></param>    ''' <param name="DefaultProperties"></param>    ''' <returns></returns>    ''' <remarks></remarks>    Shared Function HasDefaultProperty(ByVal Compiler As Compiler, ByVal Type As Type, ByRef DefaultProperties As Generic.List(Of PropertyInfo)) As Boolean        Dim attrib As Reflection.DefaultMemberAttribute        Dim tD As TypeDescriptor        tD = TryCast(Type, TypeDescriptor)        If tD Is Nothing Then            Dim members As New Generic.List(Of MemberInfo)            Dim properties As New Generic.List(Of PropertyInfo)            Helper.Assert(Type IsNot Nothing)            attrib = CType(System.Attribute.GetCustomAttribute(Type, GetType(DefaultMemberAttribute), True), DefaultMemberAttribute)            If attrib Is Nothing Then Return False            'members = Helper.FilterByName(Type.GetMembers(), attrib.MemberName)            members = Compiler.TypeManager.GetCache(Type).LookupFlattenedMembers(attrib.MemberName)            If members IsNot Nothing Then                For Each member As MemberInfo In members                    If member.MemberType = MemberTypes.Property Then                        properties.Add(DirectCast(member, PropertyInfo))                    Else                        Throw New InternalException("")                    End If                Next            End If            DefaultProperties = properties            Return True        Else            Dim members As New Generic.List(Of MemberInfo)            Dim properties As New Generic.List(Of PropertyInfo)            'members.AddRange(tD.GetMembers())            members.AddRange(Compiler.TypeManager.GetCache(tD).Cache.GetAllMembers)            For Each member As MemberInfo In members                Dim propD As PropertyDescriptor = TryCast(member, PropertyDescriptor)                Dim prop As PropertyInfo = TryCast(member, PropertyInfo)                If propD IsNot Nothing Then                    If propD.IsDefault Then properties.Add(propD)                ElseIf prop IsNot Nothing Then                    Helper.NotImplemented() 'I don't know if this is a possibility with generic types.                End If            Next            If properties.Count = 0 Then                If tD.BaseType IsNot Nothing Then                    Return Helper.HasDefaultProperty(Compiler, tD.BaseType, DefaultProperties)                Else                    Return False                End If            Else                DefaultProperties = properties                Return True            End If        End If    End Function    Shared Function GetDefaultMemberAttribute(ByVal Type As Type) As DefaultMemberAttribute        Dim attrib As Reflection.DefaultMemberAttribute        Dim tD As TypeDescriptor        tD = TryCast(Type, TypeDescriptor)        If tD Is Nothing Then            attrib = CType(System.Attribute.GetCustomAttribute(Type, GetType(DefaultMemberAttribute), True), DefaultMemberAttribute)        Else            Dim types() As Object            types = tD.GetCustomAttributes(True)            attrib = Nothing        End If        Return attrib    End Function    Shared Function IsShadows(ByVal Member As MemberInfo) As Boolean        Dim result As Boolean = True        Select Case Member.MemberType            Case MemberTypes.Method, MemberTypes.Constructor                Return DirectCast(Member, MethodBase).IsHideBySig = False            Case MemberTypes.Property                Return CBool(Helper.GetPropertyAttributes(DirectCast(Member, PropertyInfo)) And MethodAttributes.HideBySig) = False            Case MemberTypes.Field                Return True            Case MemberTypes.TypeInfo                Return True            Case MemberTypes.NestedType                Return True            Case MemberTypes.Event                Return DirectCast(Member, EventInfo).GetAddMethod.IsHideBySig = False            Case Else                Helper.NotImplemented()                Throw New InternalException("")        End Select    End Function    Shared Function IsShared(ByVal Member As MemberInfo) As Boolean        Dim result As Boolean = True        Select Case Member.MemberType            Case MemberTypes.Method, MemberTypes.Constructor                Return DirectCast(Member, MethodBase).IsStatic            Case MemberTypes.Property                Dim pInfo As PropertyInfo = DirectCast(Member, PropertyInfo)                Return CBool(Helper.GetPropertyAttributes(pInfo) And MethodAttributes.Static)            Case MemberTypes.Field                Dim fInfo As FieldInfo = DirectCast(Member, FieldInfo)                Return fInfo.IsStatic            Case MemberTypes.TypeInfo                Return False            Case MemberTypes.NestedType                Return False            Case MemberTypes.Event                Return DirectCast(Member, EventInfo).GetAddMethod.IsStatic            Case Else                Throw New InternalException("")        End Select    End Function    Shared Function GetTypes(ByVal Params As ParameterInfo()) As Type()        Dim result() As Type = Nothing        If Params Is Nothing Then Return result        ReDim result(Params.GetUpperBound(0))        For i As Integer = 0 To Params.GetUpperBound(0)            result(i) = Params(i).ParameterType        Next        Return result    End Function    Shared Function GetTypes(ByVal Arguments As Generic.List(Of Argument)) As Type()        Dim result() As Type = Type.EmptyTypes        If Arguments Is Nothing Then Return result        ReDim result(Arguments.Count - 1)        For i As Integer = 0 To Arguments.Count - 1            Helper.Assert(Arguments(i) IsNot Nothing)            If Arguments(i) IsNot Nothing AndAlso Arguments(i).Expression IsNot Nothing Then                result(i) = Arguments(i).Expression.ExpressionType            End If        Next        Return result    End Function    Shared Function GetTypes(ByVal Params As ParameterInfo()()) As Type()()        Dim result()() As Type        Helper.Assert(Params IsNot Nothing)        ReDim result(Params.GetUpperBound(0))        For i As Integer = 0 To Params.GetUpperBound(0)            result(i) = Helper.GetTypes(Params(i))        Next        Return result    End Function#If ENABLECECIL Then    Shared Function GetTypeDefinition(ByVal Compiler As Compiler, ByVal Type As Type) As Mono.Cecil.TypeReference        Dim tD As TypeDescriptor = TryCast(Type, TypeDescriptor)        If tD IsNot Nothing Then            Return tD.Declaration.CecilType        Else            Return Compiler.ModuleBuilderCecil.Import(Type)        End If    End Function#End If    Shared Sub ApplyTypeArguments(ByVal Members As Generic.List(Of MemberInfo), ByVal TypeArguments As TypeArgumentList)        If TypeArguments Is Nothing OrElse TypeArguments.Count = 0 Then Return        For i As Integer = Members.Count - 1 To 0 Step -1            Members(i) = ApplyTypeArguments(Members(i), TypeArguments)            If Members(i) Is Nothing Then Members.RemoveAt(i)        Next    End Sub    Shared Function ApplyTypeArguments(ByVal Member As MemberInfo, ByVal TypeArguments As TypeArgumentList) As MemberInfo        Dim result As MemberInfo        Dim minfo As MethodInfo        minfo = TryCast(Member, MethodInfo)        If minfo IsNot Nothing Then            Dim args() As Type            args = minfo.GetGenericArguments()            If args.Length = TypeArguments.Count Then                result = TypeArguments.Compiler.TypeManager.MakeGenericMethod(TypeArguments.Parent, minfo, args, TypeArguments.AsTypeArray)            Else                result = Nothing            End If        Else            result = Nothing            Helper.NotImplemented()        End If        Return result    End Function    Shared Function ApplyTypeArguments(ByVal Parent As ParsedObject, ByVal OpenType As Type, ByVal TypeParameters As Type(), ByVal TypeArguments() As Type) As Type        Dim result As Type = Nothing        If OpenType Is Nothing Then Return Nothing        Helper.Assert(TypeParameters IsNot Nothing AndAlso TypeArguments IsNot Nothing)        Helper.Assert(TypeParameters.Length = TypeArguments.Length)        If OpenType.IsGenericParameter Then            For i As Integer = 0 To TypeParameters.Length - 1                If NameResolution.CompareName(TypeParameters(i).Name, OpenType.Name) Then                    result = TypeArguments(i)                    Exit For                End If            Next            Helper.Assert(result IsNot Nothing)        ElseIf OpenType.IsGenericType Then            Dim typeParams() As Type            Dim typeArgs As New Generic.List(Of Type)            typeParams = OpenType.GetGenericArguments()            For i As Integer = 0 To typeParams.Length - 1                For j As Integer = 0 To TypeParameters.Length - 1                    If NameResolution.CompareName(typeParams(i).Name, TypeParameters(j).Name) Then                        typeArgs.Add(TypeArguments(j))                        Exit For                    End If                Next                If typeArgs.Count - 1 < i Then typeArgs.Add(typeParams(i))            Next            Helper.Assert(typeArgs.Count = typeParams.Length AndAlso typeArgs.Count > 0)            result = Parent.Compiler.TypeManager.MakeGenericType(Parent, OpenType, typ

⌨️ 快捷键说明

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