public InstantiatedMethodIL(MethodDesc owningMethod, MethodIL methodIL) { Debug.Assert(methodIL.GetMethodILDefinition() == methodIL); Debug.Assert(owningMethod.HasInstantiation || owningMethod.OwningType.HasInstantiation); Debug.Assert(owningMethod.GetTypicalMethodDefinition() == methodIL.OwningMethod); _methodIL = methodIL; _method = owningMethod; _typeInstantiation = owningMethod.OwningType.Instantiation; _methodInstantiation = owningMethod.Instantiation; }
public ILImporter(ILScanner compilation, MethodDesc method, MethodIL methodIL = null) { if (methodIL == null) { methodIL = compilation.GetMethodIL(method); } else { _isFallbackBodyCompilation = true; } // This is e.g. an "extern" method in C# without a DllImport or InternalCall. if (methodIL == null) { ThrowHelper.ThrowInvalidProgramException(ExceptionStringID.InvalidProgramSpecific, method); } _compilation = compilation; _factory = (ILScanNodeFactory)compilation.NodeFactory; _ilBytes = methodIL.GetILBytes(); _canonMethodIL = methodIL; // Get the runtime determined method IL so that this works right in shared code // and tokens in shared code resolve to runtime determined types. MethodIL uninstantiatiedMethodIL = methodIL.GetMethodILDefinition(); if (methodIL != uninstantiatiedMethodIL) { MethodDesc sharedMethod = method.GetSharedRuntimeFormMethodTarget(); _methodIL = new InstantiatedMethodIL(sharedMethod, uninstantiatiedMethodIL); } else { _methodIL = methodIL; } _canonMethod = method; var ilExceptionRegions = methodIL.GetExceptionRegions(); _exceptionRegions = new ExceptionRegion[ilExceptionRegions.Length]; for (int i = 0; i < ilExceptionRegions.Length; i++) { _exceptionRegions[i] = new ExceptionRegion() { ILRegion = ilExceptionRegions[i] }; } }