Ejemplo n.º 1
0
        private void EmitTypeToken(EcmaType type, SignatureContext context)
        {
            ModuleToken token = context.GetModuleTokenForType(type);

            EmitToken(token.Token);
        }
Ejemplo n.º 2
0
        public void EmitTypeSignature(TypeDesc typeDesc, SignatureContext context)
        {
            if (typeDesc is RuntimeDeterminedType runtimeDeterminedType)
            {
                switch (runtimeDeterminedType.RuntimeDeterminedDetailsType.Kind)
                {
                case GenericParameterKind.Type:
                    EmitElementType(CorElementType.ELEMENT_TYPE_VAR);
                    break;

                case GenericParameterKind.Method:
                    EmitElementType(CorElementType.ELEMENT_TYPE_MVAR);
                    break;

                default:
                    throw new NotImplementedException();
                }
                EmitUInt((uint)runtimeDeterminedType.RuntimeDeterminedDetailsType.Index);
                return;
            }

            if (typeDesc.HasInstantiation && !typeDesc.IsGenericDefinition)
            {
                EmitInstantiatedTypeSignature((InstantiatedType)typeDesc, context);
                return;
            }

            switch (typeDesc.Category)
            {
            case TypeFlags.Array:
                EmitArrayTypeSignature((ArrayType)typeDesc, context);
                return;

            case TypeFlags.SzArray:
                EmitSzArrayTypeSignature((ArrayType)typeDesc, context);
                return;

            case TypeFlags.Pointer:
                EmitPointerTypeSignature((PointerType)typeDesc, context);
                return;

            case TypeFlags.ByRef:
                EmitByRefTypeSignature((ByRefType)typeDesc, context);
                break;

            case TypeFlags.Void:
                EmitElementType(CorElementType.ELEMENT_TYPE_VOID);
                return;

            case TypeFlags.Boolean:
                EmitElementType(CorElementType.ELEMENT_TYPE_BOOLEAN);
                return;

            case TypeFlags.Char:
                EmitElementType(CorElementType.ELEMENT_TYPE_CHAR);
                return;

            case TypeFlags.SByte:
                EmitElementType(CorElementType.ELEMENT_TYPE_I1);
                return;

            case TypeFlags.Byte:
                EmitElementType(CorElementType.ELEMENT_TYPE_U1);
                return;

            case TypeFlags.Int16:
                EmitElementType(CorElementType.ELEMENT_TYPE_I2);
                return;

            case TypeFlags.UInt16:
                EmitElementType(CorElementType.ELEMENT_TYPE_U2);
                return;

            case TypeFlags.Int32:
                EmitElementType(CorElementType.ELEMENT_TYPE_I4);
                return;

            case TypeFlags.UInt32:
                EmitElementType(CorElementType.ELEMENT_TYPE_U4);
                return;

            case TypeFlags.Int64:
                EmitElementType(CorElementType.ELEMENT_TYPE_I8);
                return;

            case TypeFlags.UInt64:
                EmitElementType(CorElementType.ELEMENT_TYPE_U8);
                return;

            case TypeFlags.IntPtr:
                EmitElementType(CorElementType.ELEMENT_TYPE_I);
                return;

            case TypeFlags.UIntPtr:
                EmitElementType(CorElementType.ELEMENT_TYPE_U);
                return;

            case TypeFlags.Single:
                EmitElementType(CorElementType.ELEMENT_TYPE_R4);
                return;

            case TypeFlags.Double:
                EmitElementType(CorElementType.ELEMENT_TYPE_R8);
                return;

            case TypeFlags.Interface:
            case TypeFlags.Class:
                if (typeDesc.IsString)
                {
                    EmitElementType(CorElementType.ELEMENT_TYPE_STRING);
                }
                else if (typeDesc.IsObject)
                {
                    EmitElementType(CorElementType.ELEMENT_TYPE_OBJECT);
                }
                else if (typeDesc.IsCanonicalDefinitionType(CanonicalFormKind.Specific))
                {
                    EmitElementType(CorElementType.ELEMENT_TYPE_CANON_ZAPSIG);
                }
                else
                {
                    ModuleToken token = context.GetModuleTokenForType((EcmaType)typeDesc);
                    EmitModuleOverride(token.Module, context);
                    EmitElementType(CorElementType.ELEMENT_TYPE_CLASS);
                    EmitToken(token.Token);
                }
                return;

            case TypeFlags.ValueType:
            case TypeFlags.Nullable:
            case TypeFlags.Enum:
                if (typeDesc.IsWellKnownType(WellKnownType.TypedReference))
                {
                    EmitElementType(CorElementType.ELEMENT_TYPE_TYPEDBYREF);
                    return;
                }

                {
                    ModuleToken token = context.GetModuleTokenForType((EcmaType)typeDesc);
                    EmitModuleOverride(token.Module, context);
                    EmitElementType(CorElementType.ELEMENT_TYPE_VALUETYPE);
                    EmitToken(token.Token);
                    return;
                }

            default:
                throw new NotImplementedException();
            }
        }