예제 #1
0
        public void VisitMethodBodyReference(IReference reference)
        {
            ITypeReference typeReference = reference as ITypeReference;

            if (typeReference != null)
            {
                this.typeReferenceNeedsToken = true;
                this.Visit(typeReference);
                Debug.Assert(!this.typeReferenceNeedsToken);
            }
            else
            {
                IFieldReference fieldReference = reference as IFieldReference;
                if (fieldReference != null)
                {
                    if (fieldReference.IsContextualNamedEntity)
                    {
                        ((IContextualNamedEntity)fieldReference).AssociateWithMetadataWriter(this.metadataWriter);
                    }

                    this.Visit(fieldReference);
                }
                else
                {
                    IMethodReference methodReference = reference as IMethodReference;
                    if (methodReference != null)
                    {
                        this.Visit(methodReference);
                    }
                }
            }
        }
예제 #2
0
        public void WriteMethodReference(IMethodReference methodReference)
        {
            WriteIndent();
            Append("<font color=\"darkgreen\">");
            Append("<a href=\"resource://[");
            Append(methodReference.Resolve().DeclaringType.Assembly.Name);
            Append(']');
            Append(methodReference.Resolve().DeclaringType.Namespace);
            Append('.');
            Append(methodReference.Resolve().DeclaringType.Name);
            Append("::");
            Append(methodReference.Name);
            Append("\">");

            if ((methodReference.Name == ".ctor") || (methodReference.Name == ".cctor"))
            {
                Write(methodReference.Resolve().DeclaringType.Name);
            }
            else
            {
                Write(methodReference.Name);
            }

            Append("</a>");
            Append("</font>");
        }
예제 #3
0
        public override void TraverseChildren(ITokenOf tokenOf)
        {
            base.TraverseChildren(tokenOf);
            ITypeReference        type;
            IFieldReference /*?*/ field = tokenOf.Definition as IFieldReference;

            if (field != null)
            {
                type = this.platformType.SystemRuntimeFieldHandle;
            }
            else
            {
                IMethodReference /*?*/ method = tokenOf.Definition as IMethodReference;
                if (method != null)
                {
                    type = this.platformType.SystemRuntimeMethodHandle;
                }
                else
                {
                    Contract.Assume(tokenOf.Definition is ITypeReference);
                    type = this.platformType.SystemRuntimeTypeHandle;
                }
            }
            ((TokenOf)tokenOf).Type = type;
        }
예제 #4
0
 /// <summary>
 /// Returns the unspecialized version of the given method reference.
 /// </summary>
 public static IMethodReference Unspecialize(IMethodReference method) {
   var smr = method as ISpecializedMethodReference;
   if (smr != null) return smr.UnspecializedVersion;
   var gmir = method as IGenericMethodInstanceReference;
   if (gmir != null) return gmir.GenericMethod;
   return method;
 }
        private void AddDependencyFromMethodBody(IMethodBody methodBody)
        {
            foreach (ILocalDefinition local in methodBody.LocalVariables)
            {
                AddDependency(local.Type);
            }

            foreach (IOperation op in methodBody.Operations)
            {
                switch (op.OperationCode)
                {
                case OperationCode.Castclass:
                case OperationCode.Box:
                case OperationCode.Unbox:
                case OperationCode.Unbox_Any:
                    AddDependency((ITypeReference)op.Value);
                    break;

                case OperationCode.Call:
                //case OperationCode.Calli: Native calls
                case OperationCode.Callvirt:
                case OperationCode.Newobj:
                case OperationCode.Ldftn:
                case OperationCode.Ldvirtftn:
                    IMethodReference methodRef = (IMethodReference)op.Value;
                    AddDependencyForCalledMethod(methodRef);
                    break;
                }
            }
        }
예제 #6
0
        unsafe uint IMetaDataImport.GetMethodProps(uint mb, out uint pClass, IntPtr szMethod, uint cchMethod, out uint pchMethod, IntPtr pdwAttr,
                                                   IntPtr ppvSigBlob, IntPtr pcbSigBlob, IntPtr pulCodeRVA)
        {
            IMethodReference m = null;

            if ((mb & 0xFF000000) == 0x0A000000)
            {
                m = this.writer.memberRefList[(int)(mb & 0xFFFFFF) - 1] as IMethodReference;
            }
            else
            {
                m = this.writer.methodDefList[(int)(mb & 0xFFFFFF) - 1];
            }
            pchMethod = 0;
            pClass    = 0;
            pClass    = this.writer.GetTypeToken(m.ContainingType);
            string methName = m.Name.Value;

            pchMethod = (uint)methName.Length;
            if (pchMethod > cchMethod)
            {
                pchMethod = cchMethod - 1;
            }
            char *pMethName = (char *)szMethod.ToPointer();

            for (int i = 0; i < pchMethod; i++)
            {
                *(pMethName + i) = methName[i];
            }
            *(pMethName + pchMethod) = (char)0;
            return(0);
        }
예제 #7
0
    public DotNetDesktopStubMethodBodyEmitter(IMetadataHost host)
      : base(host) {

      this.consoleWriteLine = new Microsoft.Cci.MethodReference(host,
        GarbageCollectHelper.CreateTypeReference(host, coreAssemblyReference, "System.Console"),
        CallingConvention.Default,
        host.PlatformType.SystemVoid,
        host.NameTable.GetNameFor("WriteLine"),
        0,
        host.PlatformType.SystemString);

      this.environmentGetStackTrace = new Microsoft.Cci.MethodReference(host,
        GarbageCollectHelper.CreateTypeReference(host, coreAssemblyReference, "System.Environment"),
        CallingConvention.Default,
        host.PlatformType.SystemString,
        host.NameTable.GetNameFor("get_StackTrace"),
        0);

      this.environmentExit = new Microsoft.Cci.MethodReference(host,
        GarbageCollectHelper.CreateTypeReference(host, coreAssemblyReference, "System.Environment"),
        CallingConvention.Default,
        host.PlatformType.SystemVoid,
        host.NameTable.GetNameFor("Exit"),
        0,
        host.PlatformType.SystemInt32);
    }
        public IMethodDeclaration Resolve()
        {
            // If we have already resolved this, and the reference is still
            // alive, then return it.
            if (this.methodDeclaration != null && this.methodDeclaration.IsAlive)
            {
                return((IMethodDeclaration)this.methodDeclaration.Target);
            }

            // Try resolving the generic method for which this is a specialization
            IMethodReference genericDecl = this.GenericMethod.Resolve();

            if (genericDecl == null)
            {
                return(null);
            }

            // Build the instance declaration
            IMethodDeclaration instDecl = new XMethodInstanceDeclaration();

            instDecl.GenericMethod = genericDecl;
            instDecl.GenericArguments.AddRange(this.GenericArguments);
            ITypeReference declaringType = this.DeclaringType as ITypeReference;

            if (declaringType != null)
            {
                instDecl.DeclaringType = declaringType.Resolve();
            }
            // Are there other properties of instDecl that we should set?

            this.methodDeclaration = new WeakReference(instDecl);
            return((IMethodDeclaration)this.methodDeclaration.Target);
        }
예제 #9
0
        /// <summary>
        /// Appends the method name, optionally including the containing type name and using special names for methods with IsSpecialName set to true.
        /// </summary>
        protected virtual void AppendMethodName(IMethodReference method, NameFormattingOptions formattingOptions, StringBuilder sb)
        {
            if ((formattingOptions & NameFormattingOptions.OmitContainingType) == 0)
            {
                sb.Append(_typeNameFormatter.GetTypeName(method.ContainingType, formattingOptions));
                sb.Append('.');
            }
            // Special name translation
            string methodName = method.Name.Value;

            if (method.ResolvedMethod.IsSpecialName && (formattingOptions & NameFormattingOptions.PreserveSpecialNames) == 0)
            {
                if (methodName.StartsWith("get_"))
                {
                    //^ assume methodName.Length >= 4;
                    sb.Append(methodName.Substring(4));
                    sb.Append(".get");
                }
                else if (methodName.StartsWith("set_"))
                {
                    //^ assume methodName.Length >= 4;
                    sb.Append(methodName.Substring(4));
                    sb.Append(".set");
                }
                else
                {
                    sb.Append(methodName);
                }
            }
            else
            {
                sb.Append(methodName);
            }
        }
예제 #10
0
        private static bool IsFactoryForPlatformNotSupported(IMethodReference reference)
        {
            if (reference.ResolvedMethod is Dummy || reference.ResolvedMethod.IsAbstract)
            {
                return(false);
            }

            IMethodReference constructorReference = null;

            foreach (var op in reference.ResolvedMethod.Body.Operations)
            {
                switch (op.OperationCode)
                {
                case OperationCode.Newobj:
                    constructorReference = op.Value as IMethodReference;
                    break;

                case OperationCode.Ret:
                    if (constructorReference != null && IsPlatformNotSupported(constructorReference))
                    {
                        return(true);
                    }
                    break;
                }
            }

            return(false);
        }
예제 #11
0
        /// <summary>
        /// Returns a C#-like string that corresponds to the given type member definition and that conforms to the specified formatting options.
        /// </summary>
        //^ [Pure]
        public virtual string GetMemberSignature(ITypeMemberReference member, NameFormattingOptions formattingOptions)
        {
            IMethodReference /*?*/ method = member as IMethodReference;

            if (method != null)
            {
                return(this.GetMethodSignature(method, formattingOptions));
            }
            ITypeReference /*?*/ type = member as ITypeReference;

            if (type != null)
            {
                return(_typeNameFormatter.GetTypeName(type, formattingOptions));
            }
            IEventDefinition /*?*/ eventDef = member as IEventDefinition;

            if (eventDef != null)
            {
                return(this.GetEventSignature(eventDef, formattingOptions));
            }
            IFieldReference /*?*/ field = member as IFieldReference;

            if (field != null)
            {
                return(this.GetFieldSignature(field, formattingOptions));
            }
            IPropertyDefinition /*?*/ property = member as IPropertyDefinition;

            if (property != null)
            {
                return(this.GetPropertySignature(property, formattingOptions));
            }
            return(member.Name.Value);
        }
예제 #12
0
        public DotNetDesktopStubMethodBodyEmitter(IMetadataHost host)
            : base(host)
        {
            this.consoleWriteLine = new Microsoft.Cci.MethodReference(host,
                                                                      GarbageCollectHelper.CreateTypeReference(host, coreAssemblyReference, "System.Console"),
                                                                      CallingConvention.Default,
                                                                      host.PlatformType.SystemVoid,
                                                                      host.NameTable.GetNameFor("WriteLine"),
                                                                      0,
                                                                      host.PlatformType.SystemString);

            this.environmentGetStackTrace = new Microsoft.Cci.MethodReference(host,
                                                                              GarbageCollectHelper.CreateTypeReference(host, coreAssemblyReference, "System.Environment"),
                                                                              CallingConvention.Default,
                                                                              host.PlatformType.SystemString,
                                                                              host.NameTable.GetNameFor("get_StackTrace"),
                                                                              0);

            this.environmentExit = new Microsoft.Cci.MethodReference(host,
                                                                     GarbageCollectHelper.CreateTypeReference(host, coreAssemblyReference, "System.Environment"),
                                                                     CallingConvention.Default,
                                                                     host.PlatformType.SystemVoid,
                                                                     host.NameTable.GetNameFor("Exit"),
                                                                     0,
                                                                     host.PlatformType.SystemInt32);
        }
예제 #13
0
        public WindowsPhoneStubMethodBodyEmitter(IMetadataHost host)
            : base(host)
        {
            this.consoleWriteLine = new Microsoft.Cci.MethodReference(host,
                                                                      GarbageCollectHelper.CreateTypeReference(host, coreAssemblyReference, "System.Console"),
                                                                      CallingConvention.Default,
                                                                      host.PlatformType.SystemVoid,
                                                                      host.NameTable.GetNameFor("WriteLine"),
                                                                      0,
                                                                      host.PlatformType.SystemString);

            this.stackTraceConstructor = new Microsoft.Cci.MethodReference(host,
                                                                           GarbageCollectHelper.CreateTypeReference(host, coreAssemblyReference, "System.Diagnostics.StackTrace"),
                                                                           CallingConvention.HasThis,
                                                                           host.PlatformType.SystemVoid,
                                                                           host.NameTable.GetNameFor(".ctor"),
                                                                           0);

            this.toString = new Microsoft.Cci.MethodReference(host,
                                                              host.PlatformType.SystemObject,
                                                              CallingConvention.HasThis,
                                                              host.PlatformType.SystemString,
                                                              host.NameTable.GetNameFor("ToString"),
                                                              0);
        }
예제 #14
0
        public static IMethodReference CanonicalizeMethodReference(IMethodReference method)
        {
            // function pointers don't have declaring types and they don't
            // really fit our model, so we ignore them.
            if (null == method.ContainingType)
            {
                return(null);
            }

            //
            // first canonicalize the method...
            //
            IGenericMethodInstanceReference genMeth = method as IGenericMethodInstanceReference;

            if ((genMeth != null))
            {
                method = genMeth.GenericMethod;
            }

            //ITypeDefinitionMember memberDef;

            ISpecializedMethodReference specializedMethodRef = method as ISpecializedMethodReference;

            if (specializedMethodRef != null)
            {
                method = specializedMethodRef.UnspecializedVersion;
            }
            //else
            //member = member as ITypeDefinitionMember;

            return(method);
        }
예제 #15
0
 public string GetNameWithParameterList(IMethodReference value)
 {
     using (StringWriter writer = new StringWriter(CultureInfo.InvariantCulture)) {
         writer.Write(this.GetName(value));
         writer.Write("(");
         IParameterDeclarationCollection parameters = value.Parameters;
         for (int i = 0; i < parameters.Count; i++)
         {
             if (i != 0)
             {
                 writer.Write(", ");
             }
             writer.Write(parameters[i].ParameterType.ToString());
         }
         if (value.CallingConvention == MethodCallingConvention.VariableArguments)
         {
             if (value.Parameters.Count > 0)
             {
                 writer.Write(", ");
             }
             writer.Write("...");
         }
         writer.Write(")");
         if ((value.Name != ".ctor") && (value.Name != ".cctor"))
         {
             writer.Write(" : ");
             writer.Write(value.ReturnType.Type.ToString());
         }
         return(writer.ToString());
     }
 }
예제 #16
0
 public bool Matches(IMethodReference method)
 {
     var sig = CreateIdentifier(method);
     _log.Debug("matching: "+sig);
     //AKB to rethink
     return sig.MethodNameWithoutParams == _identifier.MethodNameWithoutParams;
 }
예제 #17
0
        public V ReceiverValueForVirtualCallInstruction(IOperation operation)
        {
            Contract.Requires(operation.Value is IMethodReference);
            IMethodReference methodCalled = operation.Value as IMethodReference;

            return(FindReceiverInPreStateOperandStack(preStatesByOperation[operation], methodCalled));
        }
예제 #18
0
        private bool IsCallToContractMethod(IOperation op)
        {
            if (op.OperationCode != OperationCode.Call)
            {
                return(false);
            }
            IMethodReference method = op.Value as IMethodReference;

            if (method == null)
            {
                return(false);
            }
            ITypeReference contractClass = method.ContainingType;

            if (!TypeHelper.TypesAreEquivalent(contractClass, this.contractClassType))
            {
                return(false);
            }
            switch (method.Name.Value)
            {
            case "Requires":
            case "RequiresAlways": // TODO: Remove once RequiresAlways is gone from the library
            case "Ensures":
            case "EnsuresOnThrow":
            case "Invariant":
            case "Assert":
            case "Assume":
                return(true);

            default:
                return(false);
            }
        }
예제 #19
0
파일: Helpers.cs 프로젝트: m7nu3l/TinyBCT
 public static Boolean IsCurrentlyMissing(IMethodReference methodReference)
 {
     // The value of this condition can change throughout the execution of the translation.
     // For that reason, it should be called at the end of the translation again to confirm
     // the method is actually missing from the binary.
     return(!methodsTranslated.Contains(BoogieMethod.From(methodReference).Name));
 }
예제 #20
0
        /// <summary>
        /// Methods that are iterators or async methods must have their bodies preserved
        /// in the reference assembly because (for now) their contracts are left in the
        /// MoveNext method found in the nested type defined in the containing type of this
        /// method. The contract extraction that is done by downstream tools depends on
        /// *this* method containing the preamble that creates an instance of that nested
        /// type, otherwise they assume the method does *not* have any contracts (which
        /// is incorrect).
        /// </summary>
        private bool IsIteratorOrAsyncMethod(IMethodDefinition currentMethod)
        {
            // walk the Operations looking for the first newobj instruction
            IMethodReference ctor = null;

            foreach (var op in currentMethod.Body.Operations)
            {
                if (op.OperationCode == OperationCode.Newobj)
                {
                    ctor = op.Value as IMethodReference;
                    break;
                }
            }
            if (ctor == null)
            {
                return(false);
            }
            var nestedType = ctor.ContainingType as INestedTypeReference;

            if (nestedType == null)
            {
                return(false);
            }
            if (nestedType.ContainingType.InternedKey != currentMethod.ContainingType.InternedKey)
            {
                return(false);
            }
            if (!TypeHelper.IsCompilerGenerated(ctor.ResolvedMethod.ContainingTypeDefinition))
            {
                return(false);
            }
            var m = TypeHelper.GetMethod(nestedType.ResolvedType, this.host.NameTable.GetNameFor("MoveNext"));

            return(!(m is Dummy));
        }
 private static IMethodDefinition ResolveUnspecializedMethodOrThrow(IMethodReference methodReference) {
   var resolvedMethod = Sink.Unspecialize(methodReference).ResolvedMethod;
   if (resolvedMethod == Dummy.Method) { // avoid downstream errors, fail early
     throw new TranslationException(ExceptionType.UnresolvedMethod, MemberHelper.GetMethodSignature(methodReference, NameFormattingOptions.None));
   }
   return resolvedMethod;
 }
예제 #22
0
 public CustomAttribute(
     IMethodReference constructor,
     ITypeReference type,
     ReadOnlyArray<MetadataConstant> positionalArguments) :
     this(constructor, type, positionalArguments, ReadOnlyArray<IMetadataNamedArgument>.Empty)
 {
 }
예제 #23
0
        public IEnumerable <MethodInfo> GetUsedMethods(object method)
        {
            var analyzedMethod = method as IMethodDeclaration;

            if (analyzedMethod.Body == null)
            {
                yield break;
            }

            var body         = analyzedMethod.Body as IMethodBody;
            var instructions = body.Instructions.OfType <IInstruction>();

            foreach (IInstruction instr in instructions)
            {
                IMethodReference mr = instr.Value as IMethodReference;
                if (mr != null)
                {
                    IMethodDeclaration def = mr.Resolve();
                    if (def != null)
                    {
                        yield return(HAL.Converter.Method(def));
                    }
                }
            }
            yield break;
        }
        private void AddDependency(IMethodReference method)
        {
            method = method.UnWrapMember <IMethodReference>();

            // We are not directly interested in generic instances, they will get broken down into
            // their various pieces from the traversal and that is what we are interested in.
            if (method.IsGenericInstance())
            {
                return;
            }

            // We don't care about WindowsRuntime methods
            if (method.IsWindowsRuntimeMember())
            {
                return;
            }

            AddGeneralDependency(method);

            if (this.ComputeFullClosure)
            {
                IMethodDefinition methodDef = method.ResolvedMethod;

                if (methodDef is Dummy)
                {
                    _unresolvedDependencies.Add(method);
                }
                else
                {
                    base.Traverse(methodDef);
                }
            }
        }
예제 #25
0
        /// <summary>
        /// Get the reference of a method in the closure class as used by other methods in the same class.
        /// </summary>
        private IMethodReference GetReferenceOfMethodUsedByPeers(IMethodDefinition method)
        {
            IMethodReference methodReference = null;
            ITypeReference   typeReference   = this.ClosureDefinitionReference;
            ISpecializedNestedTypeReference specializedNestedTypeRef = typeReference as ISpecializedNestedTypeReference;
            IGenericTypeInstanceReference   genericInstanceRef       = typeReference as IGenericTypeInstanceReference;

            if (specializedNestedTypeRef != null || genericInstanceRef != null)
            {
                methodReference = new SpecializedMethodReference()
                {
                    ContainingType        = typeReference,
                    GenericParameterCount = method.GenericParameterCount,
                    InternFactory         = this.host.InternFactory,
                    UnspecializedVersion  = method,
                    Type = method.Type,
                    Name = method.Name,
                    CallingConvention     = method.CallingConvention,
                    Parameters            = method.ParameterCount == 0 ? null : new List <IParameterTypeInformation>(((IMethodReference)method).Parameters),
                    ExtraParameters       = null,
                    ReturnValueIsByRef    = method.ReturnValueIsByRef,
                    ReturnValueIsModified = method.ReturnValueIsModified,
                    Attributes            = null,
                };
            }
            else
            {
                methodReference = method;
            }
            return(methodReference);
        }
예제 #26
0
        public static MethodVisibility GetVisibility(IPropertyReference value)
        {
            MethodVisibility visibility = MethodVisibility.Public;

            IPropertyDeclaration propertyDeclaration = value.Resolve();

            if (propertyDeclaration != null)
            {
                IMethodReference   setMethodReference = propertyDeclaration.SetMethod;
                IMethodDeclaration setMethod          = (setMethodReference == null) ? null : setMethodReference.Resolve();

                IMethodReference   getMethodReference = propertyDeclaration.GetMethod;
                IMethodDeclaration getMethod          = (getMethodReference == null) ? null : getMethodReference.Resolve();

                if ((setMethod != null) && (getMethod != null))
                {
                    if (getMethod.Visibility == setMethod.Visibility)
                    {
                        visibility = getMethod.Visibility;
                    }
                }
                else if (setMethod != null)
                {
                    visibility = setMethod.Visibility;
                }
                else if (getMethod != null)
                {
                    visibility = getMethod.Visibility;
                }
            }

            return(visibility);
        }
예제 #27
0
        public void SetPEEntryPoint(IMethodSymbol method, DiagnosticBag diagnostics)
        {
            Debug.Assert(method == null || IsSourceDefinition(method));
            Debug.Assert(OutputKind.IsApplication());

            PEEntryPoint = Translate(method, diagnostics, needDeclaration: true);
        }
예제 #28
0
        /// <summary>
        /// A rewriter for CodeModel method bodies, which changes any foreach loops found in the body into lower level structures.
        /// </summary>
        /// <param name="host">An object representing the application that is hosting the converter. It is used to obtain access to some global
        /// objects and services such as the shared name table and the table for interning references.</param>
        /// <param name="sourceLocationProvider">An object that can map the ILocation objects found in a block of statements to IPrimarySourceLocation objects. May be null.</param>
        public ForEachRemover(IMetadataHost host, ISourceLocationProvider /*?*/ sourceLocationProvider)
            : base(host)
        {
            this.sourceLocationProvider = sourceLocationProvider;


            this.moveNext = new MethodReference()
            {
                CallingConvention = CallingConvention.HasThis,
                ContainingType    = host.PlatformType.SystemCollectionsIEnumerator,
                InternFactory     = host.InternFactory,
                Name       = host.NameTable.GetNameFor("MoveNext"),
                Parameters = new List <IParameterTypeInformation>(),
                Type       = host.PlatformType.SystemBoolean,
            };

            var assemblyReference      = new Immutable.AssemblyReference(this.host, this.host.CoreAssemblySymbolicIdentity);
            IUnitNamespaceReference ns = new Immutable.RootUnitNamespaceReference(assemblyReference);

            ns = new Immutable.NestedUnitNamespaceReference(ns, this.host.NameTable.GetNameFor("System"));
            var iDisposable = new Immutable.NamespaceTypeReference(this.host, ns, this.host.NameTable.GetNameFor("IDisposable"), 0, false, false, true, PrimitiveTypeCode.Reference);

            this.disposeMethod = new MethodReference()
            {
                CallingConvention = CallingConvention.HasThis,
                ContainingType    = iDisposable,
                InternFactory     = host.InternFactory,
                Name       = this.host.NameTable.GetNameFor("Dispose"),
                Parameters = new List <IParameterTypeInformation>(),
                Type       = this.host.PlatformType.SystemVoid,
            };
        }
예제 #29
0
 private bool TryGetOffsetOfLastContractCall(List <IOperation> /*?*/ instrs, out uint offset)
 {
     offset = uint.MaxValue;
     if (instrs == null)
     {
         return(false);          // not found
     }
     for (int i = instrs.Count - 1; 0 <= i; i--)
     {
         IOperation op = instrs[i];
         if (op.OperationCode != OperationCode.Call)
         {
             continue;
         }
         IMethodReference method = op.Value as IMethodReference;
         if (method == null)
         {
             continue;
         }
         if (Microsoft.Cci.MutableContracts.ContractHelper.IsValidatorOrAbbreviator(method))
         {
             offset = op.Offset;
             return(true);
         }
         var methodName = method.Name.Value;
         if (TypeHelper.TypesAreEquivalent(method.ContainingType, this.contractClassType) &&
             IsNameOfPublicContractMethod(methodName)
             )
         {
             offset = op.Offset;
             return(true);
         }
     }
     return(false); // not found
 }
예제 #30
0
 public void Test()
 {
     // Get method body information.
     MethodInfo         mi = typeof(Sample).GetMethod("MethodBodyExample", BindingFlags.Instance | BindingFlags.NonPublic);
     IMethodReference   methodReference = AssemblyManager.FindMethod(mi);
     IList <IStatement> statements      = methodReference.Resolve().Body.Statements;
 }
예제 #31
0
 // Put return type after the signature
 public override string GetMethodSignature(IMethodReference method, NameFormattingOptions formattingOptions)
 {
     string baseSig = base.GetMethodSignature(method, (formattingOptions & ~NameFormattingOptions.ReturnType));
     StringBuilder sb = new StringBuilder(baseSig);
     AppendReturnTypeSignature(method, (formattingOptions | NameFormattingOptions.ReturnType), sb);
     return sb.ToString();
 }
        /// <summary>
        /// Tests is the given Assembly is a BizTalk assembly or not.
        /// </summary>
        /// <param name="assembly">Assembly to test.</param>
        /// <returns>true if this is a BizTalk assembly, false otherwise.</returns>
        private static bool TestForBizTalkAssembly(IAssembly assembly)
        {
            bool isBTSAssembly = false;

            if (assembly != null)
            {
                // A BizTalk assembly is a Library
                if (assembly.Type == AssemblyType.Library)
                {
                    // A BizTalk assembly has the "BizTalkAssemblyAttribute" set
                    foreach (ICustomAttribute attribute in assembly.Attributes)
                    {
                        // Get the constructor MethodReference for this attribute
                        IMethodReference ctorReference = attribute.Constructor as IMethodReference;
                        if (ctorReference != null)
                        {
                            // Get the declaring type for the constructor
                            ITypeReference ctorDeclaringType = ctorReference.DeclaringType as ITypeReference;
                            if (ctorDeclaringType != null)
                            {
                                isBTSAssembly = (String.CompareOrdinal(ctorDeclaringType.Owner.ToString(), Constants.XLANGBaseTypesFullyQualifiedAssemblyName) == 0) &&
                                                (String.CompareOrdinal(Constants.BizTalkAssemblyAttribute, ctorDeclaringType.ToString()) == 0);

                                // If we found the attribute we expect, we can declare it is a BizTalk assembly
                                if (isBTSAssembly)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            return(isBTSAssembly);
        }
예제 #33
0
        internal IMethodReference Map(IMethodReference methodReference)
        {
            var result   = new MetadataDeepCopier(host).Copy(methodReference);
            var rewriter = new ActualMutator(host, targetUnit, sourceUnitIdentity);

            return(rewriter.Rewrite(result));
        }
예제 #34
0
        public static bool IsVisible(IMethodReference value, IVisibilityConfiguration visibility)
        {
            if (IsVisible(value.DeclaringType, visibility))
            {
                switch (value.Resolve().Visibility)
                {
                case MethodVisibility.PrivateScope:
                case MethodVisibility.Private:
                    return(visibility.Private);

                case MethodVisibility.FamilyAndAssembly:
                    return(visibility.FamilyAndAssembly);

                case MethodVisibility.Assembly:
                    return(visibility.Assembly);

                case MethodVisibility.Family:
                    return(visibility.Family);

                case MethodVisibility.FamilyOrAssembly:
                    return(visibility.FamilyOrAssembly);

                case MethodVisibility.Public:
                    return(visibility.Public);
                }
                throw new NotSupportedException();
            }
            return(false);
        }
예제 #35
0
        /// <summary>
        /// A rewriter for CodeModel method bodies, which changes any foreach loops found in the body into lower level structures.
        /// </summary>
        /// <param name="host">An object representing the application that is hosting the converter. It is used to obtain access to some global
        /// objects and services such as the shared name table and the table for interning references.</param>
        /// <param name="sourceLocationProvider">An object that can map the ILocation objects found in a block of statements to IPrimarySourceLocation objects. May be null.</param>
        public ForEachRemover(IMetadataHost host, ISourceLocationProvider/*?*/ sourceLocationProvider)
            : base(host)
        {
            this.sourceLocationProvider = sourceLocationProvider;


            this.moveNext = new MethodReference()
            {
                CallingConvention = CallingConvention.HasThis,
                ContainingType = host.PlatformType.SystemCollectionsIEnumerator,
                InternFactory = host.InternFactory,
                Name = host.NameTable.GetNameFor("MoveNext"),
                Parameters = new List<IParameterTypeInformation>(),
                Type = host.PlatformType.SystemBoolean,
            };

            var assemblyReference = new Immutable.AssemblyReference(this.host, this.host.CoreAssemblySymbolicIdentity);
            IUnitNamespaceReference ns = new Immutable.RootUnitNamespaceReference(assemblyReference);
            ns = new Immutable.NestedUnitNamespaceReference(ns, this.host.NameTable.GetNameFor("System"));
            var iDisposable = new Immutable.NamespaceTypeReference(this.host, ns, this.host.NameTable.GetNameFor("IDisposable"), 0, false, false, true, PrimitiveTypeCode.Reference);
            this.disposeMethod = new MethodReference()
            {
                CallingConvention = CallingConvention.HasThis,
                ContainingType = iDisposable,
                InternFactory = host.InternFactory,
                Name = this.host.NameTable.GetNameFor("Dispose"),
                Parameters = new List<IParameterTypeInformation>(),
                Type = this.host.PlatformType.SystemVoid,
            };
        }
예제 #36
0
        public string GetName(IMethodReference value)
        {
            ITypeCollection genericArguments = value.GenericArguments;

            if (genericArguments.Count > 0)
            {
                using (StringWriter writer = new StringWriter(CultureInfo.InvariantCulture)) {
                    for (int i = 0; i < genericArguments.Count; i++)
                    {
                        if (i != 0)
                        {
                            writer.Write(", ");
                        }
                        IType type = genericArguments[i];
                        if (type != null)
                        {
                            writer.Write(type.ToString());
                        }
                        else
                        {
                            writer.Write("???");
                        }
                    }
                    return(value.Name + "<" + writer.ToString() + ">");
                }
            }
            return(value.Name);
        }
예제 #37
0
 public CustomAttribute(
     IMethodReference constructor,
     ITypeReference type,
     ReadOnlyArray <MetadataConstant> positionalArguments) :
     this(constructor, type, positionalArguments, ReadOnlyArray <IMetadataNamedArgument> .Empty)
 {
 }
        private void AddAlternativeInvocation(BlockStatement block,
            IMethodDefinition fakeMethod, IMethodReference originalCall)
        {
            var context = new ReplacementMethodConstructionContext(host, originalCall, fakeMethod, block, log, null);
            var methodBuilder = context.GetMethodBuilder();

            methodBuilder.BuildMethod();
        }
예제 #39
0
 public static MethodIdentifier CreateIdentifier(IMethodReference method)
 {
     method = MemberHelper.UninstantiateAndUnspecialize(method);
     return new MethodIdentifier(MemberHelper.GetMethodSignature(method,
             NameFormattingOptions.Signature |
             NameFormattingOptions.TypeParameters |
             NameFormattingOptions.ParameterModifiers));
 }
        public ReplacementMethodConstructionContext(IMetadataHost host, IMethodReference originalCall, IMethodDefinition fakeMethod, BlockStatement block, ILogger log, IReplaceableReference originalReference)
        {
            this.host = host;
            this.block = block;
            this.log = log;
            this.originalReference = originalReference;
            this.originalCall = originalCall;

            fakeMethodParameters = fakeMethod.Parameters;
            returnType = fakeMethod.Type;
        }
예제 #41
0
 public CustomAttribute(
     IMethodReference constructor,
     ITypeReference type,
     ReadOnlyArray<MetadataConstant> positionalArguments,
     ReadOnlyArray<IMetadataNamedArgument> namedArguments)
 {
     this.constructor = constructor;
     this.type = type;
     this.positionalArguments = positionalArguments;
     this.namedArguments = namedArguments;
 }
예제 #42
0
파일: Util.cs 프로젝트: dsgouda/buildtools
        public static IMethodDefinition ResolveMethodThrowing(IMethodReference method)
        {
            IMethodDefinition result = method.ResolvedMethod;
            if (result == Dummy.Method ||
                result == null)
            {
                throw new Exception(String.Format("Cannot resolve member '{0}'. Are all dependent assemblies loaded?", method.ToString()));
            }

            Debug.Assert(!result.GetType().Name.Contains("Dummy"));
            return result;
        }
        private static bool TryGetCompatibileModifier(IMethodDefinition resolvedMethod, out IMethodReference accessor)
        {
            var result = resolvedMethod.ContainingTypeDefinition.Properties
                .FirstOrDefault(p => p.Setter != null && p.Setter.Name.UniqueKey != resolvedMethod.Name.UniqueKey
                && TypeHelper.ParameterListsAreEquivalent(p.Setter.Parameters, resolvedMethod.Parameters));
            if (result == null)
            {
                accessor = null;
                return false;
            }
            else
            {
                accessor = result.Setter;
                return true;
            }

        }
예제 #44
0
    internal string Mangle(IMethodReference method) {
      Contract.Requires(method != null);

      method.ResolvedMethod.Dispatch(this); //compute the hash
      var sb = new StringBuilder();
      sb.Append('_');
      sb.Append((uint)this.hash);
      sb.Append('_');
      this.AppendSanitizedName(sb, TypeHelper.GetTypeName(method.ContainingType));
      sb.Append('_');
      this.AppendSanitizedName(sb, method.Name.Value);
      foreach (var par in method.Parameters) {
        sb.Append('_');
        this.AppendSanitizedName(sb, TypeHelper.GetTypeName(par.Type, NameFormattingOptions.OmitContainingType));
      }
      return sb.ToString();
    }
예제 #45
0
    /// <summary>
    /// Creates the normalize method definition.
    /// </summary>
    /// <param name="methodReference">The method reference.</param>
    /// <returns>A new NormalizeMethodDefinition instance, based on the input.</returns>
    internal static NormalizeMethodDefinition CreateNormalizeMethodDefinition(IMethodReference methodReference)
    {
      if (methodReference == null)
      {
        throw new ArgumentNullException("methodReference");
      }

      ITypeReference typeReference = methodReference.DeclaringType as ITypeReference;

      return new NormalizeMethodDefinition(
        typeReference.Name,
        typeReference.Namespace,
        methodReference.Name,
        BuildParameterList(methodReference.Parameters),
        methodReference.ReturnType.Type.ToString(),
        string.Empty);
    }
예제 #46
0
    /// <summary>
    /// Returns the interned key for the generic method parameter constructed with the given index
    /// </summary>
    /// <param name="definingMethodReference">A reference to the method defining the referenced generic parameter.</param>
    /// <param name="index">The index of the referenced generic parameter. This is an index rather than a name because metadata in CLR
    /// PE files contain only the index, not the name.</param>
    uint GetGenericMethodParameterReferenceInternId(IMethodReference definingMethodReference, uint index) {
      Contract.Requires(definingMethodReference != null);

      if (!(this.CurrentMethodReference is Dummy)) {
        //this happens when the defining method reference contains a type in its signature which either is, or contains,
        //a reference to this generic method type parameter. In that case we break the cycle by just using the index of 
        //the generic parameter. Only method references that refer to their own type parameters will ever
        //get this version of the interned id.
        return index+1000000; //provide a big offset to minimize the chances of a structural type in the 
        //signature of the method interning onto some other type that is parameterized by a type whose intern key is index.
      }
      this.CurrentMethodReference = definingMethodReference; //short circuit recursive calls back to this method
      uint definingMethodReferenceInternId = this.GetMethodReferenceInternedId(definingMethodReference);
      this.CurrentMethodReference = Dummy.MethodReference;
      uint value = this.GenericMethodTypeParameterHashTable.Find(definingMethodReferenceInternId, index);
      if (value == 0) {
        value = this.CurrentTypeInternValue++;
        this.GenericMethodTypeParameterHashTable.Add(definingMethodReferenceInternId, index, value);
      }
      return value;
    }
예제 #47
0
 /// <summary>
 /// 
 /// </summary>
 public InternFactory() {
   this.CurrentAssemblyInternValue = 0x00001000;
   this.CurrentMethodReference = Dummy.MethodReference;
   this.CurrentModuleInternValue = 0x00000001;
   this.CurrentNamespaceInternValue = 0x00000001;
   this.CurrentTypeInternValue = 0x00000100;
   this.CurrentTypeListInternValue = 0x00000001;
   this.CurrentCustomModifierInternValue = 0x00000001;
   this.CurrentCustomModifierListInternValue = 0x00000001;
   this.CurrentMethodReferenceInternValue = 0x00000001;
   this.CurrentFieldReferenceInternValue = 0x00000001;
   this.CurrentParameterTypeInternValue = 0x00000001;
   this.CurrentParameterTypeListInternValue = 0x00000001;
   this.CurrentSignatureInternValue = 0x00000001;
   this.AssemblyHashtable = new MultiHashtable<AssemblyStore>();
   this.ModuleHashtable = new MultiHashtable<ModuleStore>();
   this.NestedNamespaceHashtable = new DoubleHashtable();
   this.NamespaceTypeHashtable = new MultiHashtable<NamespaceTypeStore>();
   this.NestedTypeHashtable = new MultiHashtable<NestedTypeStore>();
   this.VectorTypeHashTable = new Hashtable();
   this.PointerTypeHashTable = new Hashtable();
   this.ManagedPointerTypeHashTable = new Hashtable();
   this.MatrixTypeHashtable = new MultiHashtable<MatrixTypeStore>();
   this.TypeListHashtable = new DoubleHashtable();
   this.GenericTypeInstanceHashtable = new DoubleHashtable();
   this.GenericMethodInstanceHashtable = new DoubleHashtable();
   this.GenericTypeParameterHashtable = new DoubleHashtable();
   this.GenericMethodTypeParameterHashTable = new DoubleHashtable();
   this.CustomModifierHashTable = new DoubleHashtable();
   this.CustomModifierListHashTable = new DoubleHashtable();
   this.ParameterTypeHashtable = new MultiHashtable<ParameterTypeStore>();
   this.ParameterTypeListHashtable = new DoubleHashtable();
   this.SignatureHashtable = new MultiHashtable<SignatureStore>();
   this.FunctionTypeHashTable = new Hashtable();
   this.ModifiedTypeHashtable = new DoubleHashtable();
   this.MethodReferenceHashtable = new Hashtable<MultiHashtable<SignatureStore>>();
   this.FieldReferenceHashtable = new Hashtable<DoubleHashtable>();
 }
예제 #48
0
 public virtual void onMetadataElement(IMethodReference methodReference) { }
예제 #49
0
        private void AddDependencyForCalledMethod(IMethodReference method)
        {
            AddDependency(method.ContainingType, false);

            this._methodDependents.Add(method);
        }
예제 #50
0
 uint IInternFactory.GetGenericMethodParameterReferenceInternedKey(IMethodReference methodReference, int index) {
   lock (GlobalLock.LockingObject) {
     return this.GetGenericMethodParameterReferenceInternId(methodReference, (uint)index);
   }
 }
예제 #51
0
 internal CustomAttributeDecoder(PEFileToObjectModel peFileToObjectModel, MemoryReader signatureMemoryReader, uint customAttributeRowId,
   IMethodReference attributeConstructor)
   : base(peFileToObjectModel, signatureMemoryReader) {
   this.CustomAttribute = Dummy.CustomAttribute;
   ushort prolog = this.SignatureMemoryReader.ReadUInt16();
   if (prolog != SerializationType.CustomAttributeStart) return;
   int len = attributeConstructor.ParameterCount;
   IMetadataExpression[]/*?*/ exprList = len == 0 ? null : new IMetadataExpression[len];
   int i = 0;
   foreach (var parameter in attributeConstructor.Parameters) {
     var parameterType = parameter.Type;
     if (parameterType is Dummy) {
       //  Error...
       return;
     }
     ExpressionBase/*?*/ argument = this.ReadSerializedValue(parameterType);
     if (argument == null) {
       //  Error...
       this.decodeFailed = true;
       return;
     }
     exprList[i++] = argument;
   }
   IMetadataNamedArgument[]/*?*/ namedArgumentArray = null;
   if (2 <= (int)this.SignatureMemoryReader.RemainingBytes) {
     ushort numOfNamedArgs = this.SignatureMemoryReader.ReadUInt16();
     if (numOfNamedArgs > 0) {
       namedArgumentArray = new IMetadataNamedArgument[numOfNamedArgs];
       for (i = 0; i < numOfNamedArgs; ++i) {
         if (0 >= (int)this.SignatureMemoryReader.RemainingBytes) break;
         bool isField = this.SignatureMemoryReader.ReadByte() == SerializationType.Field;
         ITypeReference/*?*/ memberType = this.GetFieldOrPropType();
         if (memberType == null) {
           //  Error...
           return;
         }
         string/*?*/ memberStr = this.GetSerializedString();
         if (memberStr == null)
           return;
         IName memberName = this.PEFileToObjectModel.NameTable.GetNameFor(memberStr);
         ExpressionBase/*?*/ value = this.ReadSerializedValue(memberType);
         if (value == null) {
           //  Error...
           return;
         }
         ITypeReference/*?*/ moduleTypeRef = attributeConstructor.ContainingType;
         if (moduleTypeRef == null) {
           //  Error...
           return;
         }
         FieldOrPropertyNamedArgumentExpression namedArg = new FieldOrPropertyNamedArgumentExpression(memberName, moduleTypeRef, isField, memberType, value);
         namedArgumentArray[i] = namedArg;
       }
     }
   }
   this.CustomAttribute = peFileToObjectModel.ModuleReader.metadataReaderHost.Rewrite(peFileToObjectModel.Module,
     new CustomAttribute(peFileToObjectModel, customAttributeRowId, attributeConstructor, exprList, namedArgumentArray));
 }
 public override void TraverseChildren(IMethodReference methodReference) {
   base.TraverseChildren(methodReference);
 }
예제 #53
0
 /// <summary>
 /// Performs some computation with the given method reference.
 /// </summary>
 public void Visit(IMethodReference methodReference)
 {
 }
예제 #54
0
 /// <summary>
 /// Wraps a call to GetMethodContractFor inside of a try-catch statement.
 /// </summary>
 public static bool TryGetMethodContract(CodeContractAwareHostEnvironment host, IMethodReference method, out IMethodContract methodContract, DocTracker docTracker) {
   Contract.Requires(host != null);
   Contract.Requires(method != null);
   Contract.Ensures(!Contract.Result<bool>() || Contract.ValueAtReturn(out methodContract) != null);
   try {
     methodContract = ContractHelper.GetMethodContractFor(host, method.ResolvedMethod);
   } catch (NullReferenceException) {
     docTracker.WriteLine("ERROR: NullReferenceException was thrown in CCI!");
     methodContract = null;
   }
   //} catch (Exception e) {
   //  docTracker.WriteLine("ERROR: Exception of type '{0}' was thrown in CCI!", e.GetType().Name);
   //  docTracker.WriteLine("\t'{0}'", e.Message);
   //  methodContract = null;
   //}
   return methodContract != null;
 }
예제 #55
0
 protected override void ReserveMethodToken(IMethodReference methodReference)
 {
     this.metadataWriter.GetMethodToken(methodReference);
 }
예제 #56
0
    uint GetMethodReferenceInternedId(IMethodReference methodReference) {
      Contract.Requires(methodReference != null);

      var genInstanceRef = methodReference as IGenericMethodInstanceReference;
      if (genInstanceRef != null) return this.GetGenericMethodInstanceReferenceInternedKey(genInstanceRef);
      uint containingTypeReferenceInternedId = this.GetTypeReferenceInternId(methodReference.ContainingType);
      uint requiredParameterTypesInternedId = this.GetParameterTypeListInternId(methodReference.Parameters.GetEnumerator());
      uint returnValueCustomModifiersInternedId = 0;
      uint genericParameterCount = methodReference.GenericParameterCount;
      if (methodReference.ReturnValueIsModified)
        returnValueCustomModifiersInternedId = this.GetCustomModifierListInternId(methodReference.ReturnValueCustomModifiers.GetEnumerator());
      uint returnTypeReferenceInternedId = this.GetTypeReferenceInternId(methodReference.Type);
      MultiHashtable<SignatureStore>/*?*/ methods = this.MethodReferenceHashtable.Find(containingTypeReferenceInternedId);
      if (methods == null) {
        methods = new MultiHashtable<SignatureStore>();
        this.MethodReferenceHashtable.Add(containingTypeReferenceInternedId, methods);
      }
      foreach (SignatureStore signatureStore in methods.GetValuesFor((uint)methodReference.Name.UniqueKey)) {
        if (
          signatureStore.CallingConvention == methodReference.CallingConvention
          && signatureStore.RequiredParameterListInternedId == requiredParameterTypesInternedId
          && signatureStore.ReturnValueCustomModifiersListInteredId == returnValueCustomModifiersInternedId
          && signatureStore.ReturnValueIsByRef == methodReference.ReturnValueIsByRef
          && signatureStore.ReturnTypeReferenceInternedId == returnTypeReferenceInternedId
          && signatureStore.GenericParameterCount == genericParameterCount
        ) {
          return signatureStore.InternedId;
        }
      }
      SignatureStore signatureStore1 = new SignatureStore(methodReference.CallingConvention, requiredParameterTypesInternedId,
        0, methodReference.ReturnValueIsByRef, returnValueCustomModifiersInternedId, returnTypeReferenceInternedId, genericParameterCount,
        this.CurrentMethodReferenceInternValue++);
      methods.Add((uint)methodReference.Name.UniqueKey, signatureStore1);
      return signatureStore1.InternedId;
    }
예제 #57
0
 uint IInternFactory.GetMethodInternedKey(IMethodReference methodReference) {
   lock (GlobalLock.LockingObject) {
     return this.GetMethodReferenceInternedId(methodReference);
   }
 }
예제 #58
0
 internal CustomAttribute(PEFileToObjectModel peFileToObjectModel, uint attributeRowId, IMethodReference constructor,
   IMetadataExpression[]/*?*/ arguments, IMetadataNamedArgument[]/*?*/ namedArguments)
   : base(peFileToObjectModel) {
   this.AttributeRowId = attributeRowId;
   this.Constructor = constructor;
   this.Arguments = arguments;
   this.NamedArguments = namedArguments;
 }
예제 #59
0
 internal SecurityCustomAttribute(SecurityAttribute containingSecurityAttribute, IMethodReference constructorReference, IMetadataNamedArgument[]/*?*/ namedArguments) {
   this.ContainingSecurityAttribute = containingSecurityAttribute;
   this.ConstructorReference = constructorReference;
   this.NamedArguments = namedArguments;
 }
예제 #60
0
 public abstract bool Matches(IMethodReference method);