public void BlobEncoder_MethodSignature() { var b = new BlobBuilder(); var e = new BlobEncoder(b); Assert.Same(b, e.Builder); var s = e.MethodSignature(); AssertEx.Equal(new byte[] { 0x00 }, b.ToArray()); Assert.Same(b, s.Builder); Assert.False(s.HasVarArgs); b.Clear(); s = e.MethodSignature( convention: SignatureCallingConvention.StdCall, genericParameterCount: 1234, isInstanceMethod: true); AssertEx.Equal(new byte[] { 0x32, 0x84, 0xD2 }, b.ToArray()); Assert.False(s.HasVarArgs); b.Clear(); s = e.MethodSignature( convention: SignatureCallingConvention.VarArgs, genericParameterCount: 1, isInstanceMethod: false); AssertEx.Equal(new byte[] { 0x15, 0x01 }, b.ToArray()); Assert.True(s.HasVarArgs); b.Clear(); Assert.Throws <ArgumentOutOfRangeException>(() => e.MethodSignature(genericParameterCount: -1)); Assert.Throws <ArgumentOutOfRangeException>(() => e.MethodSignature(genericParameterCount: ushort.MaxValue + 1)); }
public void BlobEncoder_MethodSignature() { var b = new BlobBuilder(); var e = new BlobEncoder(b); var s = e.MethodSignature(); AssertEx.Equal(new byte[] { 0x00 }, b.ToArray()); Assert.Same(b, s.Builder); Assert.False(s.HasVarArgs); b.Clear(); s = e.MethodSignature( convention: SignatureCallingConvention.StdCall, genericParameterCount: 1234, isInstanceMethod: true); AssertEx.Equal(new byte[] { 0x32, 0x84, 0xD2 }, b.ToArray()); Assert.False(s.HasVarArgs); b.Clear(); s = e.MethodSignature( convention: SignatureCallingConvention.VarArgs, genericParameterCount: 1, isInstanceMethod: false); AssertEx.Equal(new byte[] { 0x15, 0x01 }, b.ToArray()); Assert.True(s.HasVarArgs); b.Clear(); Assert.Throws<ArgumentOutOfRangeException>(() => e.MethodSignature(genericParameterCount: -1)); Assert.Throws<ArgumentOutOfRangeException>(() => e.MethodSignature(genericParameterCount: ushort.MaxValue + 1)); }
void EncodeMethodSignature(BlobBuilder signatureBuilder, MethodSignature sig) { BlobEncoder signatureEncoder = new BlobEncoder(signatureBuilder); int genericParameterCount = sig.GenericParameterCount; bool isInstanceMethod = !sig.IsStatic; SignatureCallingConvention sigCallingConvention = SignatureCallingConvention.Default; switch (sig.Flags & MethodSignatureFlags.UnmanagedCallingConventionMask) { case MethodSignatureFlags.CallingConventionVarargs: sigCallingConvention = SignatureCallingConvention.VarArgs; break; case MethodSignatureFlags.UnmanagedCallingConventionCdecl: sigCallingConvention = SignatureCallingConvention.CDecl; break; case MethodSignatureFlags.UnmanagedCallingConventionStdCall: sigCallingConvention = SignatureCallingConvention.StdCall; break; case MethodSignatureFlags.UnmanagedCallingConventionThisCall: sigCallingConvention = SignatureCallingConvention.ThisCall; break; } signatureEncoder.MethodSignature(sigCallingConvention, genericParameterCount, isInstanceMethod); signatureBuilder.WriteCompressedInteger(sig.Length); // TODO Process custom modifiers in some way EncodeType(signatureBuilder, sig.ReturnType); for (int i = 0; i < sig.Length; i++) { EncodeType(signatureBuilder, sig[i]); } }
public void AllowUseOfAddGlobalMethod() { BlobBuilder noArgsNoReturnStaticMethodSig = new BlobBuilder(); BlobEncoder signatureEncoder = new BlobEncoder(noArgsNoReturnStaticMethodSig); signatureEncoder.MethodSignature(SignatureCallingConvention.Default, 0, false); noArgsNoReturnStaticMethodSig.WriteCompressedInteger(0); noArgsNoReturnStaticMethodSig.WriteByte((byte)SignatureTypeCode.Void); _noArgsVoidReturnStaticMethodSigHandle = _metadataBuilder.GetOrAddBlob(noArgsNoReturnStaticMethodSig); }
public TypeSystemMetadataEmitter(AssemblyName assemblyName, TypeSystemContext context, AssemblyFlags flags = default(AssemblyFlags)) { _metadataBuilder = new MetadataBuilder(); _ilBuilder = new BlobBuilder(); _methodBodyStream = new MethodBodyStreamEncoder(_ilBuilder); StringHandle assemblyNameHandle = _metadataBuilder.GetOrAddString(assemblyName.Name); if (assemblyName.CultureName != null) { throw new ArgumentException("assemblyName"); } if (assemblyName.GetPublicKeyToken() != null) { throw new ArgumentException("assemblyName"); } var mvid = _metadataBuilder.ReserveGuid(); _mvidFixup = mvid.Content; _metadataBuilder.AddModule(0, assemblyNameHandle, mvid.Handle, default(GuidHandle), default(GuidHandle)); _metadataBuilder.AddAssembly(assemblyNameHandle, assemblyName.Version ?? new Version(0, 0, 0, 0), default(StringHandle), default(BlobHandle), flags, AssemblyHashAlgorithm.None); var canonAssemblyNameHandle = _metadataBuilder.GetOrAddString("System.Private.Canon"); var canonAssemblyRef = _metadataBuilder.AddAssemblyReference(canonAssemblyNameHandle, new Version(0, 0, 0, 0), default(StringHandle), default(BlobHandle), (AssemblyFlags)0, default(BlobHandle)); var systemStringHandle = _metadataBuilder.GetOrAddString("System"); var canonStringHandle = _metadataBuilder.GetOrAddString("__Canon"); var canonTypeRef = _metadataBuilder.AddTypeReference(canonAssemblyRef, systemStringHandle, canonStringHandle); _typeRefs.Add(context.CanonType, canonTypeRef); _metadataBuilder.AddTypeDefinition( default(TypeAttributes), default(StringHandle), _metadataBuilder.GetOrAddString("<Module>"), baseType: default(EntityHandle), fieldList: MetadataTokens.FieldDefinitionHandle(1), methodList: MetadataTokens.MethodDefinitionHandle(1)); BlobBuilder noArgsNoReturnStaticMethodSig = new BlobBuilder(); BlobEncoder signatureEncoder = new BlobEncoder(noArgsNoReturnStaticMethodSig); signatureEncoder.MethodSignature(SignatureCallingConvention.Default, 0, false); noArgsNoReturnStaticMethodSig.WriteCompressedInteger(0); noArgsNoReturnStaticMethodSig.WriteByte((byte)SignatureTypeCode.Void); _noArgsVoidReturnStaticMethodSigHandle = _metadataBuilder.GetOrAddBlob(noArgsNoReturnStaticMethodSig); }
void EncodeMethodSignature(BlobBuilder signatureBuilder, MethodSignature sig, EmbeddedSignatureDataEmitter signatureDataEmitter) { signatureDataEmitter.Push(); BlobEncoder signatureEncoder = new BlobEncoder(signatureBuilder); int genericParameterCount = sig.GenericParameterCount; bool isInstanceMethod = !sig.IsStatic; SignatureCallingConvention sigCallingConvention = SignatureCallingConvention.Default; switch (sig.Flags & MethodSignatureFlags.UnmanagedCallingConventionMask) { case MethodSignatureFlags.CallingConventionVarargs: sigCallingConvention = SignatureCallingConvention.VarArgs; break; case MethodSignatureFlags.UnmanagedCallingConventionCdecl: sigCallingConvention = SignatureCallingConvention.CDecl; break; case MethodSignatureFlags.UnmanagedCallingConventionStdCall: sigCallingConvention = SignatureCallingConvention.StdCall; break; case MethodSignatureFlags.UnmanagedCallingConventionThisCall: sigCallingConvention = SignatureCallingConvention.ThisCall; break; case MethodSignatureFlags.UnmanagedCallingConvention: // [TODO] sigCallingConvention = SignatureCallingConvention.Unmanaged; sigCallingConvention = (SignatureCallingConvention)9; break; } signatureEncoder.MethodSignature(sigCallingConvention, genericParameterCount, isInstanceMethod); signatureBuilder.WriteCompressedInteger(sig.Length); EncodeType(signatureBuilder, sig.ReturnType, signatureDataEmitter); for (int i = 0; i < sig.Length; i++) { EncodeType(signatureBuilder, sig[i], signatureDataEmitter); } signatureDataEmitter.Pop(); }
public void EncodeMethodSignature(BlobBuilder methodSignatureBlob, MethodSignature signature) { BlobEncoder encoder = new BlobEncoder(methodSignatureBlob); MethodSignatureEncoder methodSigEncoder = encoder.MethodSignature( SignatureCallingConvention.Default, signature.GenericParameterCount, !signature.IsStatic); ReturnTypeEncoder returnTypeEncoder; ParametersEncoder parametersEncoder; methodSigEncoder.Parameters(signature.Length, out returnTypeEncoder, out parametersEncoder); // Return Type Sig EncodeTypeSignature(returnTypeEncoder.Type(), signature.ReturnType); // Parameter Types Sig for (int i = 0; i < signature.Length; i++) { EncodeTypeSignature(parametersEncoder.AddParameter().Type(), signature[i]); } }