getrefexpression.vb
来自「大名鼎鼎的mono是.NET平台的跨平台(支持linux」· VB 代码 · 共 171 行
VB
171 行
' ' Visual Basic.Net Compiler' Copyright (C) 2004 - 2007 Rolf Bjarne Kvinge, RKvinge@novell.com' ' This library is free software; you can redistribute it and/or' modify it under the terms of the GNU Lesser General Public' License as published by the Free Software Foundation; either' version 2.1 of the License, or (at your option) any later version.' ' This library is distributed in the hope that it will be useful,' but WITHOUT ANY WARRANTY; without even the implied warranty of' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU' Lesser General Public License for more details.' ' You should have received a copy of the GNU Lesser General Public' License along with this library; if not, write to the Free Software' Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA' ''' <summary>''' ''' </summary>''' <remarks></remarks>Public Class GetRefExpression Inherits Expression Private m_Expression As Expression Private m_ExpressionType As Type ReadOnly Property Expression() As Expression Get Return m_Expression End Get End Property ''' <summary> ''' Automatically resolved. ''' </summary> ''' <param name="Parent"></param> ''' <param name="Expression"></param> ''' <remarks></remarks> Sub New(ByVal Parent As ParsedObject, ByVal Expression As Expression) MyBase.new(Parent) m_Expression = Expression m_ExpressionType = Parent.Compiler.TypeManager.MakeByRefType(Parent, Expression.ExpressionType) 'Helper.Assert(Expression.Classification.IsVariableClassification = False OrElse TypeOf Expression.Classification.AsVariableClassification.Expression Is GetRefExpression = False) If MyBase.ResolveExpression(ResolveInfo.Default(Parent.Compiler)) = False Then Helper.NotImplemented() Throw New InternalException(Me) End If End Sub Protected Overrides Function ResolveExpressionInternal(ByVal Info As ResolveInfo) As Boolean Dim result As Boolean = True Classification = New ValueClassification(Me, m_ExpressionType) Return result End Function Protected Overrides Function GenerateCodeInternal(ByVal Info As EmitInfo) As Boolean Dim result As Boolean = True Dim refInfo As EmitInfo = Info.Clone(Me.ExpressionType) Select Case m_Expression.Classification.Classification Case ExpressionClassification.Classifications.Variable Dim varC As VariableClassification = m_Expression.Classification.AsVariableClassification If varC.InstanceExpression IsNot Nothing Then result = varC.InstanceExpression.GenerateCode(Info.Clone(varC.InstanceExpression.ExpressionType)) AndAlso result 'result = varC.InstanceExpression.GenerateCode(refInfo) AndAlso result End If If varC.LocalBuilder IsNot Nothing Then Emitter.EmitLoadVariableLocation(refInfo, varC.LocalBuilder) ElseIf varC.ParameterInfo IsNot Nothing Then Emitter.EmitLoadVariableLocation(refInfo, varC.ParameterInfo) ElseIf varC.FieldInfo IsNot Nothing Then If varC.FieldInfo.IsLiteral Then Dim local As LocalBuilder local = Emitter.DeclareLocal(Info, varC.FieldInfo.FieldType) Emitter.EmitLoadVariable(Info, varC.FieldInfo) Emitter.EmitStoreVariable(Info, local) Emitter.EmitLoadVariableLocation(refInfo, local) Else Emitter.EmitLoadVariableLocation(refInfo, varC.FieldInfo) End If ElseIf varC.ArrayVariable IsNot Nothing Then Dim arrtype As Type = varC.ArrayVariable.ExpressionType Dim elementtype As Type = arrtype.GetElementType Dim isnonprimitivevaluetype As Boolean = elementtype.IsPrimitive = False AndAlso elementtype.IsValueType result = varC.ArrayVariable.GenerateCode(Info.Clone(True, False, arrtype)) AndAlso result Dim methodtypes As New Generic.List(Of Type) Dim elementInfo As EmitInfo = Info.Clone(True, False, Compiler.TypeCache.System_Int32) For i As Integer = 0 To varC.Arguments.Count - 1 result = varC.Arguments(i).GenerateCode(elementInfo) AndAlso result Emitter.EmitConversion(varC.Arguments(i).Expression.ExpressionType, Compiler.TypeCache.System_Int32, Info) methodtypes.Add(Compiler.TypeCache.System_Int32) Next Dim rInfo As EmitInfo = Info.Clone(True, False, elementtype) methodtypes.Add(elementtype) If arrtype.GetArrayRank = 1 Then If isnonprimitivevaluetype Then Emitter.EmitLoadElementAddress(Info, elementtype, arrtype) 'result = Info.RHSExpression.Classification.GenerateCode(rInfo) AndAlso result 'Emitter.EmitStoreObject(Info, elementtype) Else Emitter.EmitLoadElementAddress(Info, elementtype, arrtype) 'result = Info.RHSExpression.Classification.GenerateCode(rInfo) AndAlso result 'Emitter.EmitStoreElement(Info, elementtype, arrtype) End If Else Helper.NotImplemented() 'Dim method As MethodInfo = ArrayElementInitializer.GetSetMethod(arrtype) 'If isnonprimitivevaluetype Then ' Helper.NotImplemented() 'Else ' result = Info.RHSExpression.Classification.GenerateCode(rInfo) AndAlso result ' Emitter.EmitCallVirt(Info, method) 'End If End If ElseIf varC.Expression IsNot Nothing Then If TypeOf varC.Expression Is MeExpression Then Dim local As LocalBuilder local = Emitter.DeclareLocal(Info, varC.Expression.ExpressionType) Emitter.EmitLoadMe(Info, varC.Expression.ExpressionType) Emitter.EmitStoreVariable(Info, local) Emitter.EmitLoadVariableLocation(refInfo, local) ElseIf TypeOf varC.Expression Is GetRefExpression AndAlso varC.Expression IsNot Me Then result = varC.Expression.GenerateCode(Info) AndAlso result Else Helper.NotImplemented(Me.Location.ToString(Compiler)) End If Else Helper.NotImplemented() End If Case ExpressionClassification.Classifications.Value result = m_Expression.GenerateCode(Info.Clone(m_Expression.ExpressionType)) AndAlso result Dim local As LocalBuilder local = Emitter.DeclareLocal(Info, m_Expression.ExpressionType) Emitter.EmitStoreVariable(Info, local) Emitter.EmitLoadVariableLocation(Info, local) Case ExpressionClassification.Classifications.PropertyAccess Helper.NotImplemented() Case ExpressionClassification.Classifications.MethodPointer Helper.NotImplemented() Case Else Helper.NotImplemented() Throw New InternalException(Me) End Select Return result End Function Overrides ReadOnly Property ExpressionType() As Type Get Return m_ExpressionType End Get End PropertyEnd Class
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?