summaryrefslogtreecommitdiff
path: root/src/ilasm/class.hpp
blob: f281c77f5ad2be0f7b05c7fdbf36911666561255 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
//
// class.hpp
//

#ifndef _CLASS_HPP
#define _CLASS_HPP

class PermissionDecl;
class PermissionSetDecl;

extern unsigned int g_uCodePage;
extern WCHAR    wzUniBuf[];

class Class
{
public:
    Class * m_pEncloser;
    LPCUTF8 m_szFQN;
    DWORD   m_dwFQN;
    unsigned m_Hash;
    mdTypeDef m_cl;
    mdTypeRef m_crExtends;
    mdTypeRef *m_crImplements;
    TyParDescr* m_TyPars;
    DWORD   m_NumTyPars;
    DWORD   m_Attr;
    DWORD   m_dwNumInterfaces;
    DWORD	m_dwNumFieldsWithOffset;
    PermissionDecl* m_pPermissions;
    PermissionSetDecl* m_pPermissionSets;
    ULONG	m_ulSize;
    ULONG	m_ulPack;
    BOOL	m_bIsMaster;
    BOOL    m_fNew;
    BOOL    m_fNewMembers;

    MethodList			m_MethodList;
    //MethodSortedList    m_MethodSList;
    FieldDList          m_FieldDList;	
    EventDList          m_EventDList;
    PropDList           m_PropDList;
    CustomDescrList     m_CustDList;

    Class(LPCUTF8 pszFQN)
    {
        m_pEncloser = NULL;
        m_cl = mdTypeDefNil;
        m_crExtends = mdTypeRefNil;
        m_NumTyPars = 0;
        m_TyPars = NULL;
        m_dwNumInterfaces = 0;
        m_dwNumFieldsWithOffset = 0;
        m_crImplements = NULL;
        m_szFQN = pszFQN;
        m_dwFQN = pszFQN ? (DWORD)strlen(pszFQN) : 0;
        m_Hash = pszFQN ? hash((const BYTE*)pszFQN, m_dwFQN, 10) : 0;

        m_Attr = tdPublic;

        m_bIsMaster  = TRUE;
        m_fNew = TRUE;

        m_pPermissions = NULL;
        m_pPermissionSets = NULL;

        m_ulPack = 0;
        m_ulSize = 0xFFFFFFFF;
    }
    
    ~Class()
    {
        delete [] m_szFQN;
        delete [] m_crImplements;
        delete [] m_TyPars;
    }

    int FindTyPar(LPCWSTR wz)
    {
        int i,retval=-1;
        for(i=0; i < (int)m_NumTyPars; i++)
        {
            if(!wcscmp(wz,m_TyPars[i].Name()))
            {
                retval = i;
                break;
            }
        }
        return retval;
    };
    int FindTyPar(LPCUTF8 sz)
    {
        if(sz)
        {
            wzUniBuf[0] = 0;
            WszMultiByteToWideChar(g_uCodePage,0,sz,-1,wzUniBuf,dwUniBuf);
            return FindTyPar(wzUniBuf);
        }
        else return -1;
    };
    int ComparedTo(Class* T) 
    { 
        if (m_Hash == T->m_Hash) 
        {
            // Properly handle hash conflict
            return (m_szFQN == T->m_szFQN) ? 0 : strcmp(m_szFQN, T->m_szFQN);
        } else
        {
            return (m_Hash > T->m_Hash) ? 1 : -1;
        }
    }
};


#endif /* _CLASS_HPP */