Imported Upstream version 5.2.0.175

Former-commit-id: bb0468d0f257ff100aa895eb5fe583fb5dfbf900
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2017-06-07 13:16:24 +00:00
parent 4bdbaf4a88
commit 966bba02bb
8776 changed files with 346420 additions and 149650 deletions

View File

@ -72,7 +72,13 @@ namespace Mono.Cecil {
static class ModuleWriter {
public static void WriteModuleTo (ModuleDefinition module, Disposable<Stream> stream, WriterParameters parameters)
public static void WriteModule (ModuleDefinition module, Disposable<Stream> stream, WriterParameters parameters)
{
using (stream)
Write (module, stream, parameters);
}
static void Write (ModuleDefinition module, Disposable<Stream> stream, WriterParameters parameters)
{
if ((module.Attributes & ModuleAttributes.ILOnly) == 0)
throw new NotSupportedException ("Writing mixed-mode assemblies is not supported");
@ -90,38 +96,32 @@ namespace Mono.Cecil {
var name = module.assembly != null ? module.assembly.Name : null;
var fq_name = stream.value.GetFileName ();
var timestamp = parameters.Timestamp ?? module.timestamp;
var symbol_writer_provider = parameters.SymbolWriterProvider;
#if !PCL && !NET_CORE
if (symbol_writer_provider == null && parameters.WriteSymbols)
symbol_writer_provider = new DefaultSymbolWriterProvider ();
#endif
var symbol_writer = GetSymbolWriter (module, fq_name, symbol_writer_provider, parameters);
#if !PCL && !NET_CORE
#if !NET_CORE
if (parameters.StrongNameKeyPair != null && name != null) {
name.PublicKey = parameters.StrongNameKeyPair.PublicKey;
module.Attributes |= ModuleAttributes.StrongNameSigned;
}
#endif
var metadata = new MetadataBuilder (module, fq_name, symbol_writer_provider, symbol_writer);
using (var symbol_writer = GetSymbolWriter (module, fq_name, symbol_writer_provider, parameters)) {
var metadata = new MetadataBuilder (module, fq_name, timestamp, symbol_writer_provider, symbol_writer);
BuildMetadata (module, metadata);
BuildMetadata (module, metadata);
var writer = ImageWriter.CreateWriter (module, metadata, stream);
stream.value.SetLength (0);
writer.WriteImage ();
var writer = ImageWriter.CreateWriter (module, metadata, stream);
stream.value.SetLength (0);
writer.WriteImage ();
if (metadata.symbol_writer != null)
metadata.symbol_writer.Dispose ();
#if !PCL && !NET_CORE
if (parameters.StrongNameKeyPair != null)
CryptoService.StrongName (stream.value, writer, parameters.StrongNameKeyPair);
stream.Dispose ();
#if !NET_CORE
if (parameters.StrongNameKeyPair != null)
CryptoService.StrongName (stream.value, writer, parameters.StrongNameKeyPair);
#endif
}
}
static void BuildMetadata (ModuleDefinition module, MetadataBuilder metadata)
@ -145,11 +145,7 @@ namespace Mono.Cecil {
if (parameters.SymbolStream != null)
return symbol_writer_provider.GetSymbolWriter (module, parameters.SymbolStream);
#if !PCL
return symbol_writer_provider.GetSymbolWriter (module, fq_name);
#else
return null;
#endif
}
}
@ -797,7 +793,7 @@ namespace Mono.Cecil {
readonly internal ISymbolWriter symbol_writer;
readonly internal TextMap text_map;
readonly internal string fq_name;
readonly internal uint time_stamp;
readonly internal uint timestamp;
readonly Dictionary<TypeRefRow, MetadataToken> type_ref_map;
readonly Dictionary<uint, MetadataToken> type_spec_map;
@ -860,14 +856,12 @@ namespace Mono.Cecil {
readonly Dictionary<ImportScopeRow, MetadataToken> import_scope_map;
readonly Dictionary<string, MetadataToken> document_map;
readonly internal bool write_symbols;
public MetadataBuilder (ModuleDefinition module, string fq_name, ISymbolWriterProvider symbol_writer_provider, ISymbolWriter symbol_writer)
public MetadataBuilder (ModuleDefinition module, string fq_name, uint timestamp, ISymbolWriterProvider symbol_writer_provider, ISymbolWriter symbol_writer)
{
this.module = module;
this.text_map = CreateTextMap ();
this.fq_name = fq_name;
this.time_stamp = module.timestamp;
this.timestamp = timestamp;
this.symbol_writer_provider = symbol_writer_provider;
if (symbol_writer == null && module.HasImage && module.Image.HasDebugTables ()) {
@ -875,12 +869,11 @@ namespace Mono.Cecil {
}
this.symbol_writer = symbol_writer;
this.write_symbols = symbol_writer != null;
var pdb_writer = symbol_writer as PortablePdbWriter;
var pdb_writer = symbol_writer as IMetadataSymbolWriter;
if (pdb_writer != null) {
portable_pdb = true;
pdb_writer.SetModuleMetadata (this);
pdb_writer.SetMetadata (this);
}
this.code = new CodeWriter (this);
@ -1085,7 +1078,7 @@ namespace Mono.Cecil {
if (module.IsMain)
continue;
#if PCL || NET_CORE
#if NET_CORE
throw new NotSupportedException ();
#else
var parameters = new WriterParameters {
@ -1105,7 +1098,7 @@ namespace Mono.Cecil {
}
}
#if !PCL && !NET_CORE
#if !NET_CORE
string GetModuleFileName (string name)
{
if (string.IsNullOrEmpty (name))
@ -1206,7 +1199,7 @@ namespace Mono.Cecil {
var table = GetTable<FileTable> (Table.File);
var hash = resource.Hash;
#if !PCL && !NET_CORE
#if !NET_CORE
if (hash.IsNullOrEmpty ())
hash = CryptoService.ComputeHash (resource.File);
#endif
@ -2061,6 +2054,11 @@ namespace Mono.Cecil {
return GetBlobIndex (GetMethodSignature (call_site));
}
public uint GetConstantTypeBlobIndex (TypeReference constant_type)
{
return GetBlobIndex (GetConstantTypeSignature (constant_type));
}
SignatureWriter GetVariablesSignature (Collection<VariableDefinition> variables)
{
var signature = CreateSignatureWriter ();
@ -2071,6 +2069,14 @@ namespace Mono.Cecil {
return signature;
}
SignatureWriter GetConstantTypeSignature (TypeReference constant_type)
{
var signature = CreateSignatureWriter ();
signature.WriteByte (0x6);
signature.WriteTypeSignature (constant_type);
return signature;
}
SignatureWriter GetFieldSignature (FieldReference field)
{
var signature = CreateSignatureWriter ();