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