/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/EEAssemblyBuilder.vb
241 строка
10 KB
Tomáš Matoušek
EnC: Block additions to MethodImpl table when targeting .NET Framework (#81304)
03 дек 2025, 23:18
Не верифицирован
03 дек 2025, 23:18
264f04f
Код
Авторство
О чём код?
' Licensed to the .NET Foundation under one or more agreements. ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. Imports System.Collections.Immutable Imports System.Reflection.Metadata Imports System.Runtime.InteropServices Imports Microsoft.Cci Imports Microsoft.CodeAnalysis.CodeGen Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.Emit Imports Microsoft.CodeAnalysis.ExpressionEvaluator Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Emit Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Symbols.Metadata.PE Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator Friend NotInheritable Class EEAssemblyBuilder Inherits PEAssemblyBuilderBase Friend ReadOnly Methods As ImmutableArray(Of MethodSymbol) Friend Sub New( sourceAssembly As SourceAssemblySymbol, emitOptions As EmitOptions, methods As ImmutableArray(Of MethodSymbol), serializationProperties As ModulePropertiesForSerialization, additionalTypes As ImmutableArray(Of NamedTypeSymbol), testData As CompilationTestData) MyBase.New( sourceAssembly, emitOptions, outputKind:=OutputKind.DynamicallyLinkedLibrary, serializationProperties:=serializationProperties, manifestResources:=SpecializedCollections.EmptyEnumerable(Of ResourceDescription)(), additionalTypes:=additionalTypes) Me.Methods = methods If testData IsNot Nothing Then SetTestData(testData) End If End Sub Protected Overrides Function TranslateModule(symbol As ModuleSymbol, diagnostics As DiagnosticBag) As IModuleReference Dim moduleSymbol = TryCast(symbol, PEModuleSymbol) If moduleSymbol IsNot Nothing Then Dim [module] = moduleSymbol.Module ' Expose the individual runtime Windows.*.winmd modules as assemblies. ' (The modules were wrapped in a placeholder Windows.winmd assembly ' in MetadataUtilities.MakeAssemblyReferences.) If MetadataUtilities.IsWindowsComponent([module].MetadataReader, [module].Name) AndAlso MetadataUtilities.IsWindowsAssemblyName(moduleSymbol.ContainingAssembly.Name) Then Dim identity = [module].ReadAssemblyIdentityOrThrow() Return New Microsoft.CodeAnalysis.ExpressionEvaluator.AssemblyReference(identity) End If End If Return MyBase.TranslateModule(symbol, diagnostics) End Function Friend Overrides ReadOnly Property IgnoreAccessibility As Boolean Get Return True End Get End Property Public Overrides ReadOnly Property EncSymbolChanges As SymbolChanges Get Return Nothing End Get End Property Public Overrides ReadOnly Property PreviousGeneration As EmitBaseline Get Return Nothing End Get End Property Public Overrides ReadOnly Property FieldRvaSupported As Boolean Get Return True End Get End Property Public Overrides ReadOnly Property MethodImplSupported As Boolean Get Return True End Get End Property Public Overrides Function TryGetOrCreateSynthesizedHotReloadExceptionType() As INamedTypeSymbolInternal Return Nothing End Function Public Overrides Function GetOrCreateHotReloadExceptionConstructorDefinition() As IMethodSymbolInternal ' Should only be called when compiling EnC delta. Throw ExceptionUtilities.Unreachable End Function Public Overrides Function GetUsedSynthesizedHotReloadExceptionType() As INamedTypeSymbolInternal Return Nothing End Function Friend Overrides Function TryCreateVariableSlotAllocator(symbol As MethodSymbol, topLevelMethod As MethodSymbol, diagnostics As DiagnosticBag) As VariableSlotAllocator Dim method = TryCast(symbol, EEMethodSymbol) If method IsNot Nothing Then Dim defs = GetLocalDefinitions(method.Locals, diagnostics) Return New SlotAllocator(defs) End If Return Nothing End Function Private Function GetLocalDefinitions(locals As ImmutableArray(Of LocalSymbol), diagnostics As DiagnosticBag) As ImmutableArray(Of LocalDefinition) Dim builder = ArrayBuilder(Of LocalDefinition).GetInstance() For Each local In locals Select Case local.DeclarationKind Case LocalDeclarationKind.Constant, LocalDeclarationKind.Static Continue For Case Else Dim def = ToLocalDefinition(local, builder.Count, diagnostics) Debug.Assert(DirectCast(local, EELocalSymbol).Ordinal = def.SlotIndex) builder.Add(def) End Select Next Return builder.ToImmutableAndFree() End Function Private Function ToLocalDefinition(local As LocalSymbol, index As Integer, diagnostics As DiagnosticBag) As LocalDefinition Dim constraints = If(local.IsPinned, LocalSlotConstraints.Pinned, LocalSlotConstraints.None) Or If(local.IsByRef, LocalSlotConstraints.ByRef, LocalSlotConstraints.None) Return New LocalDefinition( local, local.Name, Translate(local.Type, syntaxNodeOpt:=Nothing, diagnostics), slot:=index, synthesizedKind:=local.SynthesizedKind, id:=Nothing, pdbAttributes:=LocalVariableAttributes.None, constraints:=constraints, dynamicTransformFlags:=ImmutableArray(Of Boolean).Empty, tupleElementNames:=ImmutableArray(Of String).Empty) End Function Friend Overrides ReadOnly Property AllowOmissionOfConditionalCalls As Boolean Get Return False End Get End Property Private NotInheritable Class SlotAllocator Inherits VariableSlotAllocator Private ReadOnly _locals As ImmutableArray(Of LocalDefinition) Friend Sub New(locals As ImmutableArray(Of LocalDefinition)) _locals = locals End Sub Public Overrides Sub AddPreviousLocals(builder As ArrayBuilder(Of ILocalDefinition)) builder.AddRange(_locals) End Sub Public Overrides Function GetPreviousLocal( type As ITypeReference, symbol As ILocalSymbolInternal, nameOpt As String, synthesizedKind As SynthesizedLocalKind, id As LocalDebugId, pdbAttributes As LocalVariableAttributes, constraints As LocalSlotConstraints, dynamicTransformFlags As ImmutableArray(Of Boolean), tupleElementNames As ImmutableArray(Of String)) As LocalDefinition Dim local = TryCast(symbol, EELocalSymbol) If local Is Nothing Then Return Nothing End If Return _locals(local.Ordinal) End Function Public Overrides ReadOnly Property PreviousHoistedLocalSlotCount As Integer Get Return 0 End Get End Property Public Overrides ReadOnly Property PreviousAwaiterSlotCount As Integer Get Return 0 End Get End Property Public Overrides Function TryGetPreviousHoistedLocalSlotIndex(currentDeclarator As SyntaxNode, currentType As ITypeReference, synthesizedKind As SynthesizedLocalKind, currentId As LocalDebugId, diagnostics As DiagnosticBag, <Out> ByRef slotIndex As Integer) As Boolean slotIndex = -1 Return False End Function Public Overrides Function TryGetPreviousAwaiterSlotIndex(currentType As ITypeReference, diagnostics As DiagnosticBag, <Out> ByRef slotIndex As Integer) As Boolean slotIndex = -1 Return False End Function Public Overrides Function TryGetPreviousClosure(closureSyntax As SyntaxNode, parentClosureId As DebugId?, structCaptures As ImmutableArray(Of String), ByRef closureId As DebugId, ByRef runtimeRudeEdit As RuntimeRudeEdit?) As Boolean closureId = Nothing runtimeRudeEdit = Nothing Return False End Function Public Overrides Function TryGetPreviousLambda(lambdaOrLambdaBodySyntax As SyntaxNode, isLambdaBody As Boolean, closureOrdinal As Integer, structClosureIds As ImmutableArray(Of DebugId), ByRef lambdaId As DebugId, ByRef runtimeRudeEdit As RuntimeRudeEdit?) As Boolean lambdaId = Nothing runtimeRudeEdit = Nothing Return False End Function Public Overrides Function TryGetPreviousStateMachineState(syntax As SyntaxNode, awaitId As AwaitDebugId, ByRef state As StateMachineState) As Boolean state = 0 Return False End Function Public Overrides Function GetFirstUnusedStateMachineState(increasing As Boolean) As StateMachineState? Return Nothing End Function Public Overrides ReadOnly Property PreviousStateMachineTypeName As String Get Return Nothing End Get End Property Public Overrides ReadOnly Property MethodId As DebugId? Get Return Nothing End Get End Property End Class End Class End Namespace