GetFieldSigHelper() public static method

public static GetFieldSigHelper ( System mod ) : System.Reflection.Emit.SignatureHelper
mod System
return System.Reflection.Emit.SignatureHelper
Esempio n. 1
0
        public void SetLocalSymInfo(String name, int startOffset, int endOffset)
        {
            ModuleBuilder   dynMod;
            SignatureHelper sigHelp;
            int             sigLength;

            byte[] signature;
            byte[] mungedSig;
            int    index;

            MethodBuilder methodBuilder = m_methodBuilder as MethodBuilder;

            if (methodBuilder == null)
            {
                // it's a light code gen entity
                throw new NotSupportedException();
            }
            dynMod = (ModuleBuilder)methodBuilder.Module;
            if (methodBuilder.IsTypeCreated())
            {
                // cannot change method after its containing type has been created
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_TypeHasBeenCreated"));
            }

            // set the name and range of offset for the local
            if (dynMod.GetSymWriter() == null)
            {
                // cannot set local name if not debug module
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotADebugModule"));
            }

            sigHelp = SignatureHelper.GetFieldSigHelper(dynMod);
            sigHelp.AddArgument(m_localType);
            signature = sigHelp.InternalGetSignature(out sigLength);

            // The symbol store doesn't want the calling convention on the
            // front of the signature, but InternalGetSignature returns
            // the callinging convention. So we strip it off. This is a
            // bit unfortunate, since it means that we need to allocate
            // yet another array of bytes...
            mungedSig = new byte[sigLength - 1];
            Array.Copy(signature, 1, mungedSig, 0, sigLength - 1);

            index = methodBuilder.GetILGenerator().m_ScopeTree.GetCurrentActiveScopeIndex();
            if (index == -1)
            {
                // top level scope information is kept with methodBuilder
                methodBuilder.m_localSymInfo.AddLocalSymInfo(
                    name,
                    mungedSig,
                    m_localIndex,
                    startOffset,
                    endOffset);
            }
            else
            {
                methodBuilder.GetILGenerator().m_ScopeTree.AddLocalSymInfoToCurrentScope(
                    name,
                    mungedSig,
                    m_localIndex,
                    startOffset,
                    endOffset);
            }
        }