The Labs \ Source Viewer \ SSCLI \ System.Reflection.Emit \ TypeKind

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace System.Reflection.Emit
  16. {
  17.     using System.Runtime.InteropServices;
  18.     using System;
  19.     using System.Reflection;
  20.     using CultureInfo = System.Globalization.CultureInfo;
  21.    
  22.     [Serializable()]
  23.     internal enum TypeKind
  24.     {
  25.         IsArray = 1,
  26.         IsPointer = 2,
  27.         IsByRef = 3
  28.     }
  29.    
  30.     // This is a kind of Type object that will represent the compound expression of a parameter type or field type.
  31.     internal sealed class SymbolType : Type
  32.     {
  33.         #region Static Members
  34.         static internal Type FormCompoundType(char[] bFormat, Type baseType, int curIndex)
  35.         {
  36.             // This function takes a string to describe the compound type, such as "[,][]", and a baseType.
  37.             //
  38.             // Example: [2..4] - one dimension array with lower bound 2 and size of 3
  39.             // Example: [3, 5, 6] - three dimension array with lower bound 3, 5, 6
  40.             // Example: [-3, ] [] - one dimensional array of two dimensional array (with lower bound -3 for
  41.             // the first dimension)
  42.             // Example: []* - pointer to a one dimensional array
  43.             // Example: *[] - one dimensional array. The element type is a pointer to the baseType
  44.             // Example: []& - ByRef of a single dimensional array. Only one & is allowed and it must appear the last!
  45.             // Example: [?] - Array with unknown bound
  46.            
  47.             SymbolType symbolType;
  48.             int iLowerBound;
  49.             int iUpperBound;
  50.            
  51.             if (bFormat == null || curIndex == bFormat.Length) {
  52.                 // we have consumed all of the format string
  53.                 return baseType;
  54.             }
  55.            
  56.            
  57.            
  58.            
  59.             if (bFormat[curIndex] == '&') {
  60.                 // ByRef case
  61.                
  62.                 symbolType = new SymbolType(TypeKind.IsByRef);
  63.                 symbolType.SetFormat(bFormat, curIndex, 1);
  64.                 curIndex++;
  65.                
  66.                 if (curIndex != bFormat.Length)
  67.                     // ByRef has to be the last char!!
  68.                     throw new ArgumentException(Environment.GetResourceString("Argument_BadSigFormat"));
  69.                
  70.                 symbolType.SetElementType(baseType);
  71.                 return symbolType;
  72.             }
  73.            
  74.             if (bFormat[curIndex] == '[') {
  75.                 // Array type.
  76.                 symbolType = new SymbolType(TypeKind.IsArray);
  77.                 int startIndex = curIndex;
  78.                 curIndex++;
  79.                
  80.                 iLowerBound = 0;
  81.                 iUpperBound = -1;
  82.                
  83.                 // Example: [2..4] - one dimension array with lower bound 2 and size of 3
  84.                 // Example: [3, 5, 6] - three dimension array with lower bound 3, 5, 6
  85.                 // Example: [-3, ] [] - one dimensional array of two dimensional array (with lower bound -3 sepcified)
  86.                
  87.                 while (bFormat[curIndex] != ']') {
  88.                     if (bFormat[curIndex] == '*') {
  89.                         symbolType.m_isSzArray = false;
  90.                         curIndex++;
  91.                     }
  92.                     // consume, one dimension at a time
  93.                     if ((bFormat[curIndex] >= '0' && bFormat[curIndex] <= '9') || bFormat[curIndex] == '-') {
  94.                         bool isNegative = false;
  95.                         if (bFormat[curIndex] == '-') {
  96.                             isNegative = true;
  97.                             curIndex++;
  98.                         }
  99.                        
  100.                         // lower bound is specified. Consume the low bound
  101.                         while (bFormat[curIndex] >= '0' && bFormat[curIndex] <= '9') {
  102.                             iLowerBound = iLowerBound * 10;
  103.                             iLowerBound += bFormat[curIndex] - '0';
  104.                             curIndex++;
  105.                         }
  106.                        
  107.                         if (isNegative) {
  108.                             iLowerBound = 0 - iLowerBound;
  109.                         }
  110.                        
  111.                         // set the upper bound to be less than LowerBound to indicate that upper bound it not specified yet!
  112.                         iUpperBound = iLowerBound - 1;
  113.                        
  114.                     }
  115.                     if (bFormat[curIndex] == '.') {
  116.                         // upper bound is specified
  117.                        
  118.                         // skip over ".."
  119.                         curIndex++;
  120.                         if (bFormat[curIndex] != '.') {
  121.                             // bad format!! Throw exception
  122.                             throw new ArgumentException(Environment.GetResourceString("Argument_BadSigFormat"));
  123.                         }
  124.                        
  125.                         curIndex++;
  126.                         // consume the upper bound
  127.                         if ((bFormat[curIndex] >= '0' && bFormat[curIndex] <= '9') || bFormat[curIndex] == '-') {
  128.                             bool isNegative = false;
  129.                             iUpperBound = 0;
  130.                             if (bFormat[curIndex] == '-') {
  131.                                 isNegative = true;
  132.                                 curIndex++;
  133.                             }
  134.                            
  135.                             // lower bound is specified. Consume the low bound
  136.                             while (bFormat[curIndex] >= '0' && bFormat[curIndex] <= '9') {
  137.                                 iUpperBound = iUpperBound * 10;
  138.                                 iUpperBound += bFormat[curIndex] - '0';
  139.                                 curIndex++;
  140.                             }
  141.                             if (isNegative) {
  142.                                 iUpperBound = 0 - iUpperBound;
  143.                             }
  144.                             if (iUpperBound < iLowerBound) {
  145.                                 // User specified upper bound less than lower bound, this is an error.
  146.                                 // Throw error exception.
  147.                                 throw new ArgumentException(Environment.GetResourceString("Argument_BadSigFormat"));
  148.                             }
  149.                         }
  150.                     }
  151.                    
  152.                     if (bFormat[curIndex] == ',') {
  153.                         // We have more dimension to deal with.
  154.                         // now set the lower bound, the size, and increase the dimension count!
  155.                         curIndex++;
  156.                         symbolType.SetBounds(iLowerBound, iUpperBound);
  157.                        
  158.                         // clear the lower and upper bound information for next dimension
  159.                         iLowerBound = 0;
  160.                         iUpperBound = -1;
  161.                     }
  162.                     else if (bFormat[curIndex] != ']') {
  163.                         throw new ArgumentException(Environment.GetResourceString("Argument_BadSigFormat"));
  164.                     }
  165.                 }
  166.                
  167.                 // The last dimension information
  168.                 symbolType.SetBounds(iLowerBound, iUpperBound);
  169.                
  170.                 // skip over ']'
  171.                 curIndex++;
  172.                
  173.                 symbolType.SetFormat(bFormat, startIndex, curIndex - startIndex);
  174.                
  175.                 // set the base type of array
  176.                 symbolType.SetElementType(baseType);
  177.                 return FormCompoundType(bFormat, symbolType, curIndex);
  178.             }
  179.             else if (bFormat[curIndex] == '*') {
  180.                 // pointer type.
  181.                
  182.                 symbolType = new SymbolType(TypeKind.IsPointer);
  183.                 symbolType.SetFormat(bFormat, curIndex, 1);
  184.                 curIndex++;
  185.                 symbolType.SetElementType(baseType);
  186.                 return FormCompoundType(bFormat, symbolType, curIndex);
  187.             }
  188.            
  189.             return null;
  190.         }
  191.        
  192.         #endregion
  193.        
  194.         #region Data Members
  195.         internal TypeKind m_typeKind;
  196.         internal Type m_baseType;
  197.         internal int m_cRank;
  198.         // count of dimension
  199.         // If LowerBound and UpperBound is equal, that means one element.
  200.         // If UpperBound is less than LowerBound, then the size is not specified.
  201.         internal int[] m_iaLowerBound;
  202.         internal int[] m_iaUpperBound;
  203.         // count of dimension
  204.         private char[] m_bFormat;
  205.         // format string to form the full name.
  206.         private bool m_isSzArray = true;
  207.         #endregion
  208.        
  209.         #region Constructor
  210.         internal SymbolType(TypeKind typeKind)
  211.         {
  212.             m_typeKind = typeKind;
  213.             m_iaLowerBound = new int[4];
  214.             m_iaUpperBound = new int[4];
  215.         }
  216.        
  217.         #endregion
  218.        
  219.         #region Internal Members
  220.         internal void SetElementType(Type baseType)
  221.         {
  222.             if (baseType == null)
  223.                 throw new ArgumentNullException("baseType");
  224.            
  225.             m_baseType = baseType;
  226.         }
  227.        
  228.         internal void SetBounds(int lower, int upper)
  229.         {
  230.             // Increase the rank, set lower and upper bound
  231.            
  232.             if (lower != 0 || upper != -1)
  233.                 m_isSzArray = false;
  234.            
  235.             if (m_iaLowerBound.Length <= m_cRank) {
  236.                 // resize the bound array
  237.                 int[] iaTemp = new int[m_cRank * 2];
  238.                 Array.Copy(m_iaLowerBound, iaTemp, m_cRank);
  239.                 m_iaLowerBound = iaTemp;
  240.                 Array.Copy(m_iaUpperBound, iaTemp, m_cRank);
  241.                 m_iaUpperBound = iaTemp;
  242.             }
  243.            
  244.             m_iaLowerBound[m_cRank] = lower;
  245.             m_iaUpperBound[m_cRank] = upper;
  246.             m_cRank++;
  247.         }
  248.        
  249.         internal void SetFormat(char[] bFormat, int curIndex, int length)
  250.         {
  251.             // Cache the text display format for this SymbolType
  252.            
  253.             char[] bFormatTemp = new char[length];
  254.             Array.Copy(bFormat, curIndex, bFormatTemp, 0, length);
  255.             m_bFormat = bFormatTemp;
  256.         }
  257.         #endregion
  258.        
  259.         #region Type Overrides
  260.         internal override bool IsSzArray {
  261.             get {
  262.                 if (m_cRank > 1)
  263.                     return false;
  264.                
  265.                 return m_isSzArray;
  266.             }
  267.         }
  268.        
  269.         public override Type MakePointerType()
  270.         {
  271.             return SymbolType.FormCompoundType((new string(m_bFormat) + "*").ToCharArray(), m_baseType, 0);
  272.         }
  273.        
  274.         public override Type MakeByRefType()
  275.         {
  276.             return SymbolType.FormCompoundType((new string(m_bFormat) + "&").ToCharArray(), m_baseType, 0);
  277.         }
  278.        
  279.         public override Type MakeArrayType()
  280.         {
  281.             return SymbolType.FormCompoundType((new string(m_bFormat) + "[]").ToCharArray(), m_baseType, 0);
  282.         }
  283.        
  284.         public override Type MakeArrayType(int rank)
  285.         {
  286.             if (rank <= 0)
  287.                 throw new IndexOutOfRangeException();
  288.            
  289.             string szrank = "";
  290.             if (rank == 1) {
  291.                 szrank = "*";
  292.             }
  293.             else {
  294.                 for (int i = 1; i < rank; i++)
  295.                     szrank += ",";
  296.             }
  297.            
  298.             string s = String.Format(CultureInfo.InvariantCulture, "[{0}]", szrank);
  299.             // [,,]
  300.             SymbolType st = SymbolType.FormCompoundType((new string(m_bFormat) + s).ToCharArray(), m_baseType, 0) as SymbolType;
  301.             return st;
  302.         }
  303.        
  304.         public override int GetArrayRank()
  305.         {
  306.             if (!IsArray)
  307.                 throw new NotSupportedException(Environment.GetResourceString("NotSupported_SubclassOverride"));
  308.            
  309.             return m_cRank;
  310.         }
  311.        
  312.         internal override int MetadataTokenInternal {
  313.             get {
  314.                 throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  315.             }
  316.         }
  317.        
  318.         public override Guid GUID {
  319.             get {
  320.                 throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  321.             }
  322.         }
  323.        
  324.         public override object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters)
  325.         {
  326.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  327.         }
  328.        
  329.         public override Module Module {
  330.             get {
  331.                 Type baseType;
  332.                
  333.                 for (baseType = m_baseType; baseType is SymbolType; baseType = ((SymbolType)baseType).m_baseType)
  334.                     ;
  335.                
  336.                 return baseType.Module;
  337.             }
  338.         }
  339.         public override Assembly Assembly {
  340.             get {
  341.                 Type baseType;
  342.                
  343.                 for (baseType = m_baseType; baseType is SymbolType; baseType = ((SymbolType)baseType).m_baseType)
  344.                     ;
  345.                
  346.                 return baseType.Assembly;
  347.             }
  348.         }
  349.        
  350.         public override RuntimeTypeHandle TypeHandle {
  351.             get {
  352.                 throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  353.             }
  354.         }
  355.        
  356.         public override string Name {
  357.             get {
  358.                 Type baseType;
  359.                 string sFormat = new string(m_bFormat);
  360.                
  361.                 for (baseType = m_baseType; baseType is SymbolType; baseType = ((SymbolType)baseType).m_baseType)
  362.                     sFormat = new string(((SymbolType)baseType).m_bFormat) + sFormat;
  363.                
  364.                 return baseType.Name + sFormat;
  365.             }
  366.         }
  367.        
  368.         public override string FullName {
  369.             get { return TypeNameBuilder.ToString(this, TypeNameBuilder.Format.FullName); }
  370.         }
  371.        
  372.         public override string AssemblyQualifiedName {
  373.             get { return TypeNameBuilder.ToString(this, TypeNameBuilder.Format.AssemblyQualifiedName); }
  374.         }
  375.        
  376.         public override string ToString()
  377.         {
  378.             return TypeNameBuilder.ToString(this, TypeNameBuilder.Format.ToString);
  379.         }
  380.        
  381.         public override string Namespace {
  382.             get { return m_baseType.Namespace; }
  383.         }
  384.        
  385.         public override Type BaseType {
  386.            
  387.             get { return typeof(System.Array); }
  388.         }
  389.        
  390.         protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
  391.         {
  392.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  393.         }
  394.        
  395.         [System.Runtime.InteropServices.ComVisible(true)]
  396.         public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr)
  397.         {
  398.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  399.         }
  400.        
  401.         protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
  402.         {
  403.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  404.         }
  405.        
  406.         public override MethodInfo[] GetMethods(BindingFlags bindingAttr)
  407.         {
  408.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  409.         }
  410.        
  411.         public override FieldInfo GetField(string name, BindingFlags bindingAttr)
  412.         {
  413.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  414.         }
  415.        
  416.         public override FieldInfo[] GetFields(BindingFlags bindingAttr)
  417.         {
  418.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  419.         }
  420.        
  421.         public override Type GetInterface(string name, bool ignoreCase)
  422.         {
  423.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  424.         }
  425.        
  426.         public override Type[] GetInterfaces()
  427.         {
  428.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  429.         }
  430.        
  431.         public override EventInfo GetEvent(string name, BindingFlags bindingAttr)
  432.         {
  433.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  434.         }
  435.        
  436.         public override EventInfo[] GetEvents()
  437.         {
  438.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  439.         }
  440.        
  441.         protected override PropertyInfo GetPropertyImpl(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
  442.         {
  443.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  444.         }
  445.        
  446.         public override PropertyInfo[] GetProperties(BindingFlags bindingAttr)
  447.         {
  448.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  449.         }
  450.        
  451.         public override Type[] GetNestedTypes(BindingFlags bindingAttr)
  452.         {
  453.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  454.         }
  455.        
  456.         public override Type GetNestedType(string name, BindingFlags bindingAttr)
  457.         {
  458.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  459.         }
  460.        
  461.         public override MemberInfo[] GetMember(string name, MemberTypes type, BindingFlags bindingAttr)
  462.         {
  463.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  464.         }
  465.        
  466.         public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
  467.         {
  468.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  469.         }
  470.        
  471.         [System.Runtime.InteropServices.ComVisible(true)]
  472.         public override InterfaceMapping GetInterfaceMap(Type interfaceType)
  473.         {
  474.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  475.         }
  476.        
  477.         public override EventInfo[] GetEvents(BindingFlags bindingAttr)
  478.         {
  479.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  480.         }
  481.        
  482.         protected override TypeAttributes GetAttributeFlagsImpl()
  483.         {
  484.             // Return the attribute flags of the base type?
  485.             Type baseType;
  486.             for (baseType = m_baseType; baseType is SymbolType; baseType = ((SymbolType)baseType).m_baseType)
  487.                 ;
  488.             return baseType.Attributes;
  489.         }
  490.        
  491.         protected override bool IsArrayImpl()
  492.         {
  493.             return m_typeKind == TypeKind.IsArray;
  494.         }
  495.        
  496.         protected override bool IsPointerImpl()
  497.         {
  498.             return m_typeKind == TypeKind.IsPointer;
  499.         }
  500.        
  501.         protected override bool IsByRefImpl()
  502.         {
  503.             return m_typeKind == TypeKind.IsByRef;
  504.         }
  505.        
  506.         protected override bool IsPrimitiveImpl()
  507.         {
  508.             return false;
  509.         }
  510.        
  511.         protected override bool IsValueTypeImpl()
  512.         {
  513.             return false;
  514.         }
  515.        
  516.         protected override bool IsCOMObjectImpl()
  517.         {
  518.             return false;
  519.         }
  520.        
  521.         public override Type GetElementType()
  522.         {
  523.             return m_baseType;
  524.         }
  525.        
  526.         protected override bool HasElementTypeImpl()
  527.         {
  528.             return m_baseType != null;
  529.         }
  530.        
  531.         public override Type UnderlyingSystemType {
  532.            
  533.             get { return this; }
  534.         }
  535.        
  536.         public override object[] GetCustomAttributes(bool inherit)
  537.         {
  538.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  539.         }
  540.        
  541.         public override object[] GetCustomAttributes(Type attributeType, bool inherit)
  542.         {
  543.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  544.         }
  545.        
  546.         public override bool IsDefined(Type attributeType, bool inherit)
  547.         {
  548.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_NonReflectedType"));
  549.         }
  550.         #endregion
  551.     }
  552. }

Developer Fusion