mirror of https://github.com/icsharpcode/ILSpy.git
2 changed files with 0 additions and 150 deletions
@ -1,149 +0,0 @@ |
|||||||
// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
|
||||||
// software and associated documentation files (the "Software"), to deal in the Software
|
|
||||||
// without restriction, including without limitation the rights to use, copy, modify, merge,
|
|
||||||
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
|
||||||
// to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in all copies or
|
|
||||||
// substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
||||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
|
||||||
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
|
||||||
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
||||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
// DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
using System; |
|
||||||
using System.Collections.Generic; |
|
||||||
using System.Diagnostics; |
|
||||||
using ICSharpCode.Decompiler.Semantics; |
|
||||||
|
|
||||||
namespace ICSharpCode.Decompiler.TypeSystem.Implementation |
|
||||||
{ |
|
||||||
[Serializable] |
|
||||||
public sealed class UnresolvedSecurityDeclarationBlob |
|
||||||
{ |
|
||||||
static readonly ITypeReference securityActionTypeReference = typeof(System.Security.Permissions.SecurityAction).ToTypeReference(); |
|
||||||
static readonly ITypeReference permissionSetAttributeTypeReference = new GetClassTypeReference("System.Security.Permissions", "PermissionSetAttribute"); |
|
||||||
|
|
||||||
readonly IConstantValue securityAction; |
|
||||||
readonly byte[] blob; |
|
||||||
readonly IList<IUnresolvedAttribute> unresolvedAttributes = new List<IUnresolvedAttribute>(); |
|
||||||
|
|
||||||
public UnresolvedSecurityDeclarationBlob(int securityAction, byte[] blob) |
|
||||||
{ |
|
||||||
BlobReader reader = new BlobReader(blob, null); |
|
||||||
this.securityAction = new SimpleConstantValue(securityActionTypeReference, securityAction); |
|
||||||
this.blob = blob; |
|
||||||
if (reader.ReadByte() == '.') { |
|
||||||
// binary attribute
|
|
||||||
uint attributeCount = reader.ReadCompressedUInt32(); |
|
||||||
for (uint i = 0; i < attributeCount; i++) { |
|
||||||
unresolvedAttributes.Add(new UnresolvedSecurityAttribute(this, (int)i)); |
|
||||||
} |
|
||||||
} else { |
|
||||||
// for backward compatibility with .NET 1.0: XML-encoded attribute
|
|
||||||
var attr = new DefaultUnresolvedAttribute(permissionSetAttributeTypeReference); |
|
||||||
attr.ConstructorParameterTypes.Add(securityActionTypeReference); |
|
||||||
attr.PositionalArguments.Add(this.securityAction); |
|
||||||
string xml = System.Text.Encoding.Unicode.GetString(blob); |
|
||||||
attr.AddNamedPropertyArgument("XML", new SimpleConstantValue(KnownTypeReference.String, xml)); |
|
||||||
unresolvedAttributes.Add(attr); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public IList<IUnresolvedAttribute> UnresolvedAttributes { |
|
||||||
get { return unresolvedAttributes; } |
|
||||||
} |
|
||||||
|
|
||||||
public IList<IAttribute> Resolve(IAssembly currentAssembly) |
|
||||||
{ |
|
||||||
// TODO: make this a per-assembly cache
|
|
||||||
// CacheManager cache = currentAssembly.Compilation.CacheManager;
|
|
||||||
// IList<IAttribute> result = (IList<IAttribute>)cache.GetShared(this);
|
|
||||||
// if (result != null)
|
|
||||||
// return result;
|
|
||||||
|
|
||||||
ITypeResolveContext context = new SimpleTypeResolveContext(currentAssembly); |
|
||||||
BlobReader reader = new BlobReader(blob, currentAssembly); |
|
||||||
if (reader.ReadByte() != '.') { |
|
||||||
// should not use UnresolvedSecurityDeclaration for XML secdecls
|
|
||||||
throw new InvalidOperationException(); |
|
||||||
} |
|
||||||
ResolveResult securityActionRR = securityAction.Resolve(context); |
|
||||||
uint attributeCount = reader.ReadCompressedUInt32(); |
|
||||||
IAttribute[] attributes = new IAttribute[attributeCount]; |
|
||||||
try { |
|
||||||
ReadSecurityBlob(reader, attributes, context, securityActionRR); |
|
||||||
} catch (NotSupportedException ex) { |
|
||||||
// ignore invalid blobs
|
|
||||||
Debug.WriteLine(ex.ToString()); |
|
||||||
} |
|
||||||
for (int i = 0; i < attributes.Length; i++) { |
|
||||||
if (attributes[i] == null) |
|
||||||
attributes[i] = new CecilResolvedAttribute(context, SpecialType.UnknownType); |
|
||||||
} |
|
||||||
return attributes; |
|
||||||
// return (IList<IAttribute>)cache.GetOrAddShared(this, attributes);
|
|
||||||
} |
|
||||||
|
|
||||||
void ReadSecurityBlob(BlobReader reader, IAttribute[] attributes, ITypeResolveContext context, ResolveResult securityActionRR) |
|
||||||
{ |
|
||||||
for (int i = 0; i < attributes.Length; i++) { |
|
||||||
string attributeTypeName = reader.ReadSerString(); |
|
||||||
ITypeReference attributeTypeRef = ReflectionHelper.ParseReflectionName(attributeTypeName); |
|
||||||
IType attributeType = attributeTypeRef.Resolve(context); |
|
||||||
|
|
||||||
reader.ReadCompressedUInt32(); // ??
|
|
||||||
// The specification seems to be incorrect here, so I'm using the logic from Cecil instead.
|
|
||||||
uint numNamed = reader.ReadCompressedUInt32(); |
|
||||||
|
|
||||||
var namedArgs = new List<KeyValuePair<IMember, ResolveResult>>((int)numNamed); |
|
||||||
for (uint j = 0; j < numNamed; j++) { |
|
||||||
var namedArg = reader.ReadNamedArg(attributeType); |
|
||||||
if (namedArg.Key != null) |
|
||||||
namedArgs.Add(namedArg); |
|
||||||
|
|
||||||
} |
|
||||||
throw new NotImplementedException(); /* |
|
||||||
attributes[i] = new DefaultAttribute( |
|
||||||
attributeType, |
|
||||||
positionalArguments: new ResolveResult[] { securityActionRR }, |
|
||||||
namedArguments: namedArgs);*/ |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
[Serializable] |
|
||||||
sealed class UnresolvedSecurityAttribute : IUnresolvedAttribute, ISupportsInterning |
|
||||||
{ |
|
||||||
readonly UnresolvedSecurityDeclarationBlob secDecl; |
|
||||||
readonly int index; |
|
||||||
|
|
||||||
public UnresolvedSecurityAttribute(UnresolvedSecurityDeclarationBlob secDecl, int index) |
|
||||||
{ |
|
||||||
Debug.Assert(secDecl != null); |
|
||||||
this.secDecl = secDecl; |
|
||||||
this.index = index; |
|
||||||
} |
|
||||||
|
|
||||||
IAttribute IUnresolvedAttribute.CreateResolvedAttribute(ITypeResolveContext context) |
|
||||||
{ |
|
||||||
return secDecl.Resolve(context.CurrentAssembly)[index]; |
|
||||||
} |
|
||||||
|
|
||||||
int ISupportsInterning.GetHashCodeForInterning() |
|
||||||
{ |
|
||||||
return index ^ secDecl.GetHashCode(); |
|
||||||
} |
|
||||||
|
|
||||||
bool ISupportsInterning.EqualsForInterning(ISupportsInterning other) |
|
||||||
{ |
|
||||||
UnresolvedSecurityAttribute attr = other as UnresolvedSecurityAttribute; |
|
||||||
return attr != null && index == attr.index && secDecl == attr.secDecl; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue