private Variable(ElementType type)
     : base(type)
 {
     lock (s_idLock)
     {
         Id = s_id;
     }
 }
 public Variable(ElementType type, VariableType vtype, int index)
     : this(type)
 {
     Index = index;
     VarType = vtype;
 }
        private static ElementType ReadType(InspectableAssembly ia, byte[] blob, ref int index)
        {
            var ret = new ElementType((EElementType)blob[index++]);
            // class or struct
            if (ret.Type == EElementType.Class || ret.Type == EElementType.ValueType || ret.Type == EElementType.CMod_Required || ret.Type == EElementType.CMod_Optional)
            {
                //next is metadata token?
                var tokenRaw = UncompressInt(blob, ref index);
                int token = (tokenRaw & ~0x03) >> 2;
                switch(tokenRaw & 0x03)
                {
                    case 0: //typedef 
                        token |= 0x02000000;
                        break;
                    case 1: //typeref
                        token |= 0x01000000;
                        break;
                    case 2: //typespec
                        token |= 0x20000000;
                        break;
                }

                var handle = MetadataTokens.Handle(token);
                switch (handle.Kind)
                {
                    case HandleKind.TypeDefinition:
                        ret.Target = ia.GetClassImmediate(token);
                        break;
                    default:
                        throw new Exception("Go f**k yourself handle");
                }
            }
            else if(ret.Type == EElementType.SzArray || ret.Type == EElementType.Reference)
            {
                ElementType next;
                do
                {
                    next = ReadType(ia, blob, ref index);
                    if (next.Type.IsCustomMod())
                        Console.WriteLine("?? SzArray custom mod ??");
                } while (next.Type.IsCustomMod());

                ret.Secondary = next;
            }
            else if(ret.Type == EElementType.MVar)
            {
                ret.Number = UncompressInt(blob, ref index);
            }

            return ret;
        }
 public void Add(ElementType type)
 {
     m_internal.Add(type);
 }
 public Constant(ElementType type, object val)
     : base(type)
 {
     Value = val;
 }
 public IndirectValue(ElementType type)
 {
     Type = type;
 }
 public Element(ElementType type)
 {
     Type = type;
 }