本文整理汇总了C#中PEModuleBuilder类的典型用法代码示例。如果您正苦于以下问题:C# PEModuleBuilder类的具体用法?C# PEModuleBuilder怎么用?C# PEModuleBuilder使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
PEModuleBuilder类属于命名空间,在下文中一共展示了PEModuleBuilder类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CodeGenerator
public CodeGenerator(
MethodSymbol method,
BoundStatement boundBody,
ILBuilder builder,
PEModuleBuilder moduleBuilder,
DiagnosticBag diagnostics,
OptimizationLevel optimizations,
bool emittingPdb)
{
Debug.Assert((object)method != null);
Debug.Assert(boundBody != null);
Debug.Assert(builder != null);
Debug.Assert(moduleBuilder != null);
Debug.Assert(diagnostics != null);
_method = method;
_boundBody = boundBody;
_builder = builder;
_module = moduleBuilder;
_diagnostics = diagnostics;
if (!method.GenerateDebugInfo)
{
// Always optimize synthesized methods that don't contain user code.
//
// Specifically, always optimize synthesized explicit interface implementation methods
// (aka bridge methods) with by-ref returns because peverify produces errors if we
// return a ref local (which the return local will be in such cases).
_ilEmitStyle = ILEmitStyle.Release;
}
else
{
if (optimizations == OptimizationLevel.Debug)
{
_ilEmitStyle = ILEmitStyle.Debug;
}
else
{
_ilEmitStyle = IsDebugPlus() ?
ILEmitStyle.DebugFriendlyRelease :
ILEmitStyle.Release;
}
}
// Emit sequence points unless
// - the PDBs are not being generated
// - debug information for the method is not generated since the method does not contain
// user code that can be stepped through, or changed during EnC.
//
// This setting only affects generating PDB sequence points, it shall not affect generated IL in any way.
_emitPdbSequencePoints = emittingPdb && method.GenerateDebugInfo;
_boundBody = Optimizer.Optimize(
boundBody,
debugFriendly: _ilEmitStyle != ILEmitStyle.Release,
stackLocals: out _stackLocals);
_methodBodySyntaxOpt = (method as SourceMethodSymbol)?.BodySyntax;
}
示例2: ModuleReference
internal ModuleReference(PEModuleBuilder moduleBeingBuilt, ModuleSymbol underlyingModule)
{
Debug.Assert(moduleBeingBuilt != null);
Debug.Assert((object)underlyingModule != null);
this.moduleBeingBuilt = moduleBeingBuilt;
this.underlyingModule = underlyingModule;
}
示例3: ProcessSynthesizedMembers
/// <summary>
/// Traverse the symbol table and call Module.AddSynthesizedDefinition for each
/// synthesized explicit implementation stub that has been generated (e.g. when the real
/// implementation doesn't have the appropriate custom modifiers).
/// </summary>
public static void ProcessSynthesizedMembers(
CSharpCompilation compilation,
PEModuleBuilder moduleBeingBuilt,
CancellationToken cancellationToken)
{
Debug.Assert(moduleBeingBuilt != null);
var compiler = new SynthesizedMetadataCompiler(moduleBeingBuilt, cancellationToken);
compiler.Visit(compilation.SourceModule.GlobalNamespace);
}
示例4: ResolvedFieldImpl
private Cci.IFieldDefinition ResolvedFieldImpl(PEModuleBuilder moduleBeingBuilt)
{
Debug.Assert(this.IsDefinitionOrDistinct());
if (this.IsDefinition &&
this.ContainingModule == moduleBeingBuilt.SourceModule)
{
return this;
}
return null;
}
示例5: ProcessSynthesizedMembers
/// <summary>
/// Traverse the symbol table and call Module.AddSynthesizedDefinition for each
/// synthesized explicit implementation stub that has been generated (e.g. when the real
/// implementation doesn't have the appropriate custom modifiers).
/// </summary>
public static void ProcessSynthesizedMembers(
CSharpCompilation compilation,
PEModuleBuilder moduleBeingBuilt,
CancellationToken cancellationToken)
{
Debug.Assert(moduleBeingBuilt != null);
using (Logger.LogBlock(FunctionId.CSharp_Compiler_CompileSynthesizedMethodMetadata, message: compilation.AssemblyName, cancellationToken: cancellationToken))
{
var compiler = new SynthesizedMetadataCompiler(moduleBeingBuilt, cancellationToken);
compiler.Visit(compilation.SourceModule.GlobalNamespace);
}
}
示例6: CodeGenerator
private CodeGenerator(MethodSymbol method,
BoundStatement block,
ILBuilder builder,
PEModuleBuilder module,
DiagnosticBag diagnostics,
bool optimize,
bool emitSequencePoints)
{
this.method = method;
this.block = block;
this.builder = builder;
this.module = module;
this.diagnostics = diagnostics;
this.noOptimizations = !optimize;
this.debugInformationKind = module.Compilation.Options.DebugInformationKind;
if (!this.debugInformationKind.IsValid())
{
this.debugInformationKind = DebugInformationKind.None;
}
// Special case: always optimize synthesized explicit interface implementation methods
// (aka bridge methods) with by-ref returns because peverify produces errors if we
// return a ref local (which the return local will be in such cases).
if (this.noOptimizations && method.ReturnType is ByRefReturnErrorTypeSymbol)
{
Debug.Assert(method is SynthesizedExplicitImplementationMethod);
this.noOptimizations = false;
}
this.emitSequencePoints = emitSequencePoints;
if (!this.noOptimizations)
{
this.block = Optimizer.Optimize(block, out stackLocals);
}
Debug.Assert((object)method != null);
Debug.Assert(block != null);
Debug.Assert(builder != null);
Debug.Assert(module != null);
var asSourceMethod = method as SourceMethodSymbol;
if ((object)asSourceMethod != null)
{
methodBlockSyntax = asSourceMethod.BlockSyntax;
}
}
示例7: CodeGenerator
private CodeGenerator(
MethodSymbol method,
BoundStatement block,
ILBuilder builder,
PEModuleBuilder moduleBuilder,
DiagnosticBag diagnostics,
OptimizationLevel optimizations,
bool emittingPdbs)
{
this.method = method;
this.block = block;
this.builder = builder;
this.module = moduleBuilder;
this.diagnostics = diagnostics;
// Always optimize synthesized methods that don't contain user code.
//
// Specifically, always optimize synthesized explicit interface implementation methods
// (aka bridge methods) with by-ref returns because peverify produces errors if we
// return a ref local (which the return local will be in such cases).
this.optimizations = method.GenerateDebugInfo ? optimizations : OptimizationLevel.Release;
// Emit sequence points unless
// - the PDBs are not being generated
// - debug information for the method is not generated since the method does not contain
// user code that can be stepped thru, or changed during EnC.
//
// This setting only affects generating PDB sequence points, it shall not affect generated IL in any way.
this.emitPdbSequencePoints = emittingPdbs && method.GenerateDebugInfo;
if (this.optimizations == OptimizationLevel.Release)
{
this.block = Optimizer.Optimize(block, out stackLocals);
}
Debug.Assert((object)method != null);
Debug.Assert(block != null);
Debug.Assert(builder != null);
Debug.Assert(moduleBuilder != null);
var asSourceMethod = method as SourceMethodSymbol;
if ((object)asSourceMethod != null)
{
methodBlockSyntax = asSourceMethod.BlockSyntax;
}
}
示例8: CompileMethodBodies
public static void CompileMethodBodies(
CSharpCompilation compilation,
PEModuleBuilder moduleBeingBuilt,
bool generateDebugInfo,
bool hasDeclarationErrors,
Predicate<Symbol> filter,
SyntaxTree filterTree,
TextSpan? filterSpanWithinTree,
DiagnosticBag diagnostics,
CancellationToken cancellationToken)
{
using (Logger.LogBlock(FunctionId.CSharp_Compiler_CompileMethodBodies, message: compilation.AssemblyName, cancellationToken: cancellationToken))
{
Debug.Assert(filter == null || filterTree == null, "Cannot provide both a filter predicate and a filter tree.");
if (filter == null && filterTree != null)
{
filter = s => s.IsDefinedInSourceTree(filterTree, filterSpanWithinTree);
}
if (compilation.PreviousSubmission != null)
{
// In case there is a previous submission, we should ensure
// it has already created anonymous type/delegates templates
// NOTE: if there are any errors, we will pick up what was created anyway
compilation.PreviousSubmission.EnsureAnonymousTypeTemplates(cancellationToken);
// TODO: revise to use a loop instead of a recursion
}
MethodBodyCompiler.CompileMethodBodies(compilation, moduleBeingBuilt, generateDebugInfo, hasDeclarationErrors, diagnostics, filter, cancellationToken);
MethodSymbol entryPoint = GetEntryPoint(compilation, moduleBeingBuilt, hasDeclarationErrors, diagnostics, cancellationToken);
if (moduleBeingBuilt != null)
{
moduleBeingBuilt.SetEntryPoint(entryPoint);
}
}
}
示例9: SynthesizedMetadataCompiler
private SynthesizedMetadataCompiler(PEModuleBuilder moduleBeingBuilt, CancellationToken cancellationToken)
{
Debug.Assert(moduleBeingBuilt != null);
_moduleBeingBuilt = moduleBeingBuilt;
_cancellationToken = cancellationToken;
}
示例10: AddDebugSourceDocumentsForChecksumDirectives
private static void AddDebugSourceDocumentsForChecksumDirectives(
PEModuleBuilder moduleBeingBuilt,
SyntaxTree tree,
DiagnosticBag diagnostics)
{
var checksumDirectives = tree.GetRoot().GetDirectives(d => d.Kind == SyntaxKind.PragmaChecksumDirectiveTrivia &&
!d.ContainsDiagnostics);
foreach (var directive in checksumDirectives)
{
var checkSumDirective = (PragmaChecksumDirectiveTriviaSyntax)directive;
var path = checkSumDirective.File.ValueText;
var checkSumText = checkSumDirective.Bytes.ValueText;
var normalizedPath = moduleBeingBuilt.NormalizeDebugDocumentPath(path, basePath: tree.FilePath);
var existingDoc = moduleBeingBuilt.TryGetDebugDocumentForNormalizedPath(normalizedPath);
// duplicate checksum pragmas are valid as long as values match
// if we have seen this document already, check for matching values.
if (existingDoc != null)
{
// pragma matches a file path on an actual tree.
// Dev12 compiler just ignores the pragma in this case which means that
// checksum of the actual tree always wins and no warning is given.
// We will continue doing the same.
if (existingDoc.IsComputedChecksum)
{
continue;
}
if (CheckSumMatches(checkSumText, existingDoc.SourceHash))
{
var guid = Guid.Parse(checkSumDirective.Guid.ValueText);
if (guid == existingDoc.SourceHashKind)
{
// all parts match, nothing to do
continue;
}
}
// did not match to an existing document
// produce a warning and ignore the pragma
diagnostics.Add(ErrorCode.WRN_ConflictingChecksum, new SourceLocation(checkSumDirective), path);
}
else
{
var newDocument = new Cci.DebugSourceDocument(
normalizedPath,
Cci.DebugSourceDocument.CorSymLanguageTypeCSharp,
MakeCheckSumBytes(checkSumDirective.Bytes.ValueText),
Guid.Parse(checkSumDirective.Guid.ValueText));
moduleBeingBuilt.AddDebugDocument(newDocument);
}
}
}
示例11: GetType
protected override Cci.ITypeReference GetType(PEModuleBuilder moduleBuilder, CSharpSyntaxNode syntaxNodeOpt, DiagnosticBag diagnostics)
{
return moduleBuilder.Translate(UnderlyingProperty.Type, syntaxNodeOpt, diagnostics);
}
示例12: FixedImplementationType
internal override NamedTypeSymbol FixedImplementationType(PEModuleBuilder emitModule)
{
return emitModule.SetFixedImplementationType(this);
}
示例13: AddToType
internal void AddToType(NamedTypeSymbol containingType, PEModuleBuilder moduleBeingBuilt)
{
foreach (var field in FieldSymbols)
{
moduleBeingBuilt.AddSynthesizedDefinition(containingType, field);
}
FieldSymbol hostObjectField = GetHostObjectField();
if ((object)hostObjectField != null)
{
moduleBeingBuilt.AddSynthesizedDefinition(containingType, hostObjectField);
}
}
示例14: SynthesizedMethodMetadataCompiler
public SynthesizedMethodMetadataCompiler(PEModuleBuilder moduleBeingBuilt, CancellationToken cancellationToken)
{
Debug.Assert(moduleBeingBuilt != null);
this.moduleBeingBuilt = moduleBeingBuilt;
this.cancellationToken = cancellationToken;
}
示例15: FixedImplementationType
internal override NamedTypeSymbol FixedImplementationType(PEModuleBuilder emitModule)
{
EnsureSignatureIsLoaded();
return _lazyFixedImplementationType;
}