public void BlobEncoder_MethodSpecificationSignature() { var b = new BlobBuilder(); var e = new BlobEncoder(b); var s = e.MethodSpecificationSignature(genericArgumentCount: 0); AssertEx.Equal(new byte[] { 0x0A, 0x00 }, b.ToArray()); Assert.Same(b, s.Builder); b.Clear(); e.MethodSpecificationSignature(genericArgumentCount: 1234); AssertEx.Equal(new byte[] { 0x0A, 0x84, 0xD2 }, b.ToArray()); b.Clear(); Assert.Throws<ArgumentOutOfRangeException>(() => e.MethodSpecificationSignature(genericArgumentCount: -1)); Assert.Throws<ArgumentOutOfRangeException>(() => e.MethodSpecificationSignature(genericArgumentCount: ushort.MaxValue + 1)); }
public void BlobEncoder_MethodSpecificationSignature() { var b = new BlobBuilder(); var e = new BlobEncoder(b); var s = e.MethodSpecificationSignature(genericArgumentCount: 0); AssertEx.Equal(new byte[] { 0x0A, 0x00 }, b.ToArray()); Assert.Same(b, s.Builder); b.Clear(); e.MethodSpecificationSignature(genericArgumentCount: 1234); AssertEx.Equal(new byte[] { 0x0A, 0x84, 0xD2 }, b.ToArray()); b.Clear(); Assert.Throws <ArgumentOutOfRangeException>(() => e.MethodSpecificationSignature(genericArgumentCount: -1)); Assert.Throws <ArgumentOutOfRangeException>(() => e.MethodSpecificationSignature(genericArgumentCount: ushort.MaxValue + 1)); }
public EntityHandle GetMethodRef(MethodDesc method) { if (_methodRefs.TryGetValue(method, out var handle)) { return(handle); } EntityHandle methodHandle; if (method.HasInstantiation && (method.GetMethodDefinition() != method)) { EntityHandle uninstantiatedHandle = GetMethodRef(method.GetMethodDefinition()); BlobBuilder methodSpecSig = new BlobBuilder(); BlobEncoder methodSpecEncoder = new BlobEncoder(methodSpecSig); methodSpecEncoder.MethodSpecificationSignature(method.Instantiation.Length); foreach (var type in method.Instantiation) { EncodeType(methodSpecSig, type, EmbeddedSignatureDataEmitter.EmptySingleton); } var methodSpecSigHandle = _metadataBuilder.GetOrAddBlob(methodSpecSig); methodHandle = _metadataBuilder.AddMethodSpecification(uninstantiatedHandle, methodSpecSigHandle); } else { EntityHandle typeHandle = GetTypeRef((MetadataType)method.OwningType); StringHandle methodName = _metadataBuilder.GetOrAddString(method.Name); var sig = method.GetTypicalMethodDefinition().Signature; EmbeddedSignatureDataEmitter signatureDataEmitter; if (sig.HasEmbeddedSignatureData) { signatureDataEmitter = new EmbeddedSignatureDataEmitter(sig.GetEmbeddedSignatureData(), this); } else { signatureDataEmitter = EmbeddedSignatureDataEmitter.EmptySingleton; } BlobBuilder memberRefSig = new BlobBuilder(); EncodeMethodSignature(memberRefSig, sig, signatureDataEmitter); if (!signatureDataEmitter.Complete) { throw new ArgumentException(); } var sigBlob = _metadataBuilder.GetOrAddBlob(memberRefSig); methodHandle = _metadataBuilder.AddMemberReference(typeHandle, methodName, sigBlob); } _methodRefs.Add(method, methodHandle); return(methodHandle); }
private EntityHandle MakeMemberReferenceHandle(TypeSystemEntity methodOrField) { EntityHandle handle; if (!_memberRefOrSpecHandles.TryGetValue(methodOrField, out handle)) { MethodDesc method = methodOrField as MethodDesc; FieldDesc field = methodOrField as FieldDesc; TypeDesc owningType = (method != null ? method.OwningType : field.OwningType); string name = (method != null ? method.Name : field.Name); BlobHandle signature = method != null? MakeSignatureHandle(method.GetTypicalMethodDefinition()) : MakeSignatureHandle(field); handle = _metadataBuilder.AddMemberReference( MakeTypeRefOrSpecHandle(owningType), _metadataBuilder.GetOrAddString(name), signature); if (method != null && method.HasInstantiation && !method.IsTypicalMethodDefinition) { BlobEncoder methodSpecEncoder = new BlobEncoder(new BlobBuilder()); GenericTypeArgumentsEncoder argEncoder = methodSpecEncoder.MethodSpecificationSignature(method.Instantiation.Length); for (int i = 0; i < method.Instantiation.Length; i++) { SignatureTypeEncoder argTypeEncoder = argEncoder.AddArgument(); _signatureEmitter.EncodeTypeSignature(argTypeEncoder, method.Instantiation[i]); } handle = _metadataBuilder.AddMethodSpecification(handle, _metadataBuilder.GetOrAddBlob(methodSpecEncoder.Builder)); } _memberRefOrSpecHandles[methodOrField] = handle; } return(handle); }
public EntityHandle GetMethodRef(MethodDesc method) { if (_methodRefs.TryGetValue(method, out var handle)) { return(handle); } EntityHandle methodHandle; if (method.HasInstantiation && (method.GetMethodDefinition() != method)) { EntityHandle uninstantiatedHandle = GetMethodRef(method.GetMethodDefinition()); BlobBuilder methodSpecSig = new BlobBuilder(); BlobEncoder methodSpecEncoder = new BlobEncoder(methodSpecSig); methodSpecEncoder.MethodSpecificationSignature(method.Instantiation.Length); foreach (var type in method.Instantiation) { EncodeType(methodSpecSig, type); } var methodSpecSigHandle = _metadataBuilder.GetOrAddBlob(methodSpecSig); methodHandle = _metadataBuilder.AddMethodSpecification(uninstantiatedHandle, methodSpecSigHandle); } else { EntityHandle typeHandle = GetTypeRef((MetadataType)method.OwningType); StringHandle methodName = _metadataBuilder.GetOrAddString(method.Name); var sig = method.GetTypicalMethodDefinition().Signature; BlobBuilder memberRefSig = new BlobBuilder(); EncodeMethodSignature(memberRefSig, sig); var sigBlob = _metadataBuilder.GetOrAddBlob(memberRefSig); methodHandle = _metadataBuilder.AddMemberReference(typeHandle, methodName, sigBlob); } _methodRefs.Add(method, methodHandle); return(methodHandle); }