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

📄 lateboundaccesstoexpression.vb

📁 大名鼎鼎的mono是.NET平台的跨平台(支持linux
💻 VB
📖 第 1 页 / 共 2 页
字号:

        If CopyBacks Is Nothing OrElse CopyBacks.Length = 0 Then Return result

        args = LateBoundAccess.Arguments

        For i As Integer = 0 To CopyBacks.Length - 1
            Dim branch As Label

            If CopyBacks(i) = False Then Continue For

            Dim arg As Argument
            Dim exp As Expression

            arg = args.Arguments(i)
            exp = arg.Expression

            branch = Emitter.DefineLabel(Info)
            Emitter.EmitLoadVariable(Info, array)
            Emitter.EmitLoadI4Value(Info, i)
            Emitter.EmitLoadElement(Info, Info.Compiler.TypeCache.System_Boolean_Array)
            Emitter.EmitBranchIfFalse(Info, branch)

            Dim tmpVar As LocalBuilder
            tmpVar = Emitter.DeclareLocal(Info, exp.ExpressionType)

            Emitter.EmitLoadVariable(Info, arguments)
            Emitter.EmitLoadI4Value(Info, i)
            Emitter.EmitLoadElement(Info, Info.Compiler.TypeCache.System_Object_Array)
            Emitter.EmitCall(Info, Info.Compiler.TypeCache.System_Runtime_CompilerServices_RuntimeHelpers__GetObjectValue_Object)
            Emitter.EmitLoadToken(Info, exp.ExpressionType)
            Emitter.EmitCall(Info, Info.Compiler.TypeCache.System_Type__GetTypeFromHandle_RuntimeTypeHandle)
            Emitter.EmitCall(Info, Info.Compiler.TypeCache.MS_VB_CS_Conversions__ChangeType_Object_Type)

            Dim vosExp As New ValueOnStackExpression(exp, Info.Compiler.TypeCache.System_Object)
            Dim convExp As DirectCastExpression
            convExp = New DirectCastExpression(exp)
            convExp.Init(vosExp, exp.ExpressionType)
            result = convExp.GenerateCode(Info) AndAlso result
            Emitter.EmitStoreVariable(Info, tmpVar)
            result = exp.GenerateCode(Info.Clone(New LoadLocalExpression(exp, tmpVar))) AndAlso result

            Emitter.MarkLabel(Info, branch)
        Next

        Return result
    End Function

    Public Shared Function EmitLateGet(ByVal Info As EmitInfo, ByVal LateBoundAccess As LateBoundAccessClassification) As Boolean
        Dim result As Boolean = True
        Dim copyBacks As LocalBuilder = Nothing, arguments As LocalBuilder = Nothing
        Dim copyBackHints As Boolean() = Nothing

        'We need to emit a call to LateGet

        '1 - the instance expression
        result = LateBoundAccess.InstanceExpression.GenerateCode(Info) AndAlso result

        '2 - Type ??? - haven't found an example where this isn't nothing yet
        Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_Type))

        '3 - The member name
        Emitter.EmitLoadValue(Info, LateBoundAccess.Name)

        '4 - The arguments
        EmitArguments(Info, LateBoundAccess, arguments)

        '5 - ArgumentNames
        Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_String_Array))

        '6 - TypeArguments
        If LateBoundAccess.TypeArguments IsNot Nothing Then
            Helper.NotImplemented("LateGet with type arguments.")
        Else
            Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_Type_Array))
        End If

        '7 - CopyBack
        EmitCopyBacks(Info, LateBoundAccess, copyBackHints, copyBacks)

        Emitter.EmitCall(Info, Info.Compiler.TypeCache.MS_VB_CS_NewLateBinding__LateGet_Object_Type_String_Array_Array_Array_Array)
        Emitter.EmitCall(Info, Info.Compiler.TypeCache.System_Runtime_CompilerServices_RuntimeHelpers__GetObjectValue_Object)

        EmitStoreBacks(Info, LateBoundAccess, copyBackHints, copyBacks, arguments)

        Return result
    End Function

    Public Shared Function EmitLateIndexGet(ByVal Info As EmitInfo, ByVal LateBoundAccess As LateBoundAccessClassification) As Boolean
        Dim result As Boolean = True
        Dim arguments As LocalBuilder = Nothing

        'We need to emit a call to LateIndexGet

        '1 - the instance expression
        result = LateBoundAccess.InstanceExpression.GenerateCode(Info) AndAlso result

        '2 - The arguments
        EmitArguments(Info, LateBoundAccess, arguments)

        '5 - ArgumentNames
        Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_String_Array))

        Emitter.EmitCall(Info, Info.Compiler.TypeCache.MS_VB_CS_NewLateBinding__LateIndexGet_Object_Array_Array)
        Emitter.EmitCall(Info, Info.Compiler.TypeCache.System_Runtime_CompilerServices_RuntimeHelpers__GetObjectValue_Object)

        Return result
    End Function

    Public Shared Function EmitLateSet(ByVal Info As EmitInfo, ByVal LateBoundAccess As LateBoundAccessClassification) As Boolean
        Dim result As Boolean = True
        Dim arguments As LocalBuilder = Nothing

        'We need to emit a call to LateSet

        '1 - the instance expression
        result = LateBoundAccess.InstanceExpression.GenerateCode(Info.Clone(True, False, LateBoundAccess.InstanceExpression.ExpressionType)) AndAlso result

        '2 - Type ??? - haven't found an example where this isn't nothing yet
        Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_Type))

        '3 - The member name
        Emitter.EmitLoadValue(Info, LateBoundAccess.Name)

        '4 - The arguments
        EmitArguments(Info, LateBoundAccess, arguments)

        '5 - ArgumentNames
        Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_String_Array))

        '6 - TypeArguments
        If LateBoundAccess.TypeArguments IsNot Nothing Then
            Helper.NotImplemented("LateSet with type arguments.")
        Else
            Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_Type_Array))
        End If

        Emitter.EmitCall(Info, Info.Compiler.TypeCache.MS_VB_CS_NewLateBinding__LateSet_Object_Type_String_Array_Array_Array)

        Return result
    End Function

    Public Shared Function EmitLateIndexSet(ByVal Info As EmitInfo, ByVal LateBoundAccess As LateBoundAccessClassification) As Boolean
        Dim result As Boolean = True
        Dim arguments As LocalBuilder = Nothing

        'We need to emit a call to LateIndexSet

        '1 - the instance expression
        result = LateBoundAccess.InstanceExpression.GenerateCode(Info.Clone(True, False, LateBoundAccess.InstanceExpression.ExpressionType)) AndAlso result

        '2 - The arguments
        EmitArguments(Info, LateBoundAccess, arguments)

        '3 - ArgumentNames
        Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_String_Array))

        Emitter.EmitCall(Info, Info.Compiler.TypeCache.MS_VB_CS_NewLateBinding__LateIndexSet_Object_Array_Array)

        Return result
    End Function

    Public Shared Function EmitLateCall(ByVal Info As EmitInfo, ByVal LateBoundAccess As LateBoundAccessClassification) As Boolean
        Dim result As Boolean = True
        Dim copyBacks As LocalBuilder = Nothing, arguments As LocalBuilder = Nothing
        Dim copyBackHints As Boolean() = Nothing

        'We need to emit a call to LateCall

        '1 - the instance expression
        If LateBoundAccess.InstanceExpression IsNot Nothing Then
            result = LateBoundAccess.InstanceExpression.GenerateCode(Info.Clone(True, False, LateBoundAccess.InstanceExpression.ExpressionType)) AndAlso result
        Else
            Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_Object))
        End If

        '2 - Type
        If LateBoundAccess.LateBoundType Is Nothing Then
            Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_Type))
        Else
            Emitter.EmitLoadToken(Info, LateBoundAccess.LateBoundType)
            Emitter.EmitCall(Info, Info.Compiler.TypeCache.System_Type__GetTypeFromHandle_RuntimeTypeHandle)
        End If

        '3 - The member name
        Emitter.EmitLoadValue(Info, LateBoundAccess.Name)

        '4 - The arguments
        EmitArguments(Info, LateBoundAccess, arguments)

        '5 - ArgumentNames
        Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_String_Array))

        '6 - TypeArguments
        If LateBoundAccess.TypeArguments IsNot Nothing Then
            Helper.NotImplemented("LateCall with type arguments.")
        Else
            Emitter.EmitLoadNull(Info.Clone(Info.Compiler.TypeCache.System_Type_Array))
        End If

        '7 - CopyBack
        EmitCopyBacks(Info, LateBoundAccess, copyBackHints, copyBacks)

        '8 - Ignore return
        Emitter.EmitLoadI4Value(Info, 1)
        Emitter.EmitCall(Info, Info.Compiler.TypeCache.MS_VB_CS_NewLateBinding__LateCall_Object_Type_String_Array_Array_Array_Array_Boolean)

        Emitter.EmitPop(Info, Info.Compiler.TypeCache.System_Object)

        EmitStoreBacks(Info, LateBoundAccess, copyBackHints, copyBacks, arguments)

        Return result
    End Function
End Class

⌨️ 快捷键说明

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