public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false) { ObjectDataSignatureBuilder dataBuilder = new ObjectDataSignatureBuilder(); if (!relocsOnly) { dataBuilder.AddSymbol(this); ModuleToken moduleToken = GetModuleToken(factory); IEcmaModule targetModule = moduleToken.Module; SignatureContext innerContext = dataBuilder.EmitFixup(factory, _fixupKind, targetModule, factory.SignatureContext); var metadata = ReadyToRunStandaloneMethodMetadata.Compute(_method); dataBuilder.EmitUInt(checked ((uint)metadata.ConstantData.Length)); dataBuilder.EmitBytes(metadata.ConstantData); dataBuilder.EmitUInt(checked ((uint)metadata.TypeRefs.Length)); foreach (var typeRef in metadata.TypeRefs) { if (factory.SignatureContext.Resolver.GetModuleTokenForType((EcmaType)typeRef, allowDynamicallyCreatedReference: true, throwIfNotFound: false).Module == null) { // If there isn't a module token yet for this type, force it to exist factory.ManifestMetadataTable._mutableModule.TryGetEntityHandle(typeRef); } dataBuilder.EmitTypeSignature(typeRef, innerContext); } MethodWithToken method = new MethodWithToken(_method, moduleToken, null, unboxing: false, context: null); dataBuilder.EmitMethodSignature(method, enforceDefEncoding: false, enforceOwningType: false, innerContext, false); } return(dataBuilder.ToObjectData()); }
public bool Initialize(MutableModule mutableModule, EcmaMethodIL wrappedMethod) { bool failedToReplaceToken = false; try { Debug.Assert(mutableModule.ModuleThatIsCurrentlyTheSourceOfNewReferences == null); mutableModule.ModuleThatIsCurrentlyTheSourceOfNewReferences = ((EcmaMethod)wrappedMethod.OwningMethod).Module; var owningMethodHandle = mutableModule.TryGetEntityHandle(wrappedMethod.OwningMethod); if (!owningMethodHandle.HasValue) { return(false); } _mutableModule = mutableModule; _maxStack = wrappedMethod.MaxStack; _isInitLocals = wrappedMethod.IsInitLocals; _owningMethod = wrappedMethod.OwningMethod; _exceptionRegions = (ILExceptionRegion[])wrappedMethod.GetExceptionRegions().Clone(); _ilBytes = (byte[])wrappedMethod.GetILBytes().Clone(); _locals = (LocalVariableDefinition[])wrappedMethod.GetLocals(); for (int i = 0; i < _exceptionRegions.Length; i++) { var region = _exceptionRegions[i]; if (region.Kind == ILExceptionRegionKind.Catch) { var newHandle = _mutableModule.TryGetHandle((TypeSystemEntity)wrappedMethod.GetObject(region.ClassToken)); if (!newHandle.HasValue) { return(false); } _exceptionRegions[i] = new ILExceptionRegion(region.Kind, region.TryOffset, region.TryLength, region.HandlerOffset, region.HandlerLength, newHandle.Value, newHandle.Value); } } ILTokenReplacer.Replace(_ilBytes, GetMutableModuleToken); #if DEBUG Debug.Assert(ReadyToRunStandaloneMethodMetadata.Compute((EcmaMethod)_owningMethod) != null); #endif // DEBUG } finally { mutableModule.ModuleThatIsCurrentlyTheSourceOfNewReferences = null; } return(!failedToReplaceToken); int GetMutableModuleToken(int token) { object result = wrappedMethod.GetObject(token); int? newToken; if (result is string str) { newToken = mutableModule.TryGetStringHandle(str); } else { newToken = mutableModule.TryGetHandle((TypeSystemEntity)result); } if (!newToken.HasValue) { // Toekn replacement has failed. Do not attempt to use this IL. failedToReplaceToken = true; return(1); } return(newToken.Value); } }