1 | // Licensed to the .NET Foundation under one or more agreements. |
---|---|
2 | // The .NET Foundation licenses this file to you under the MIT license. |
3 | // See the LICENSE file in the project root for more information. |
4 | // |
5 | |
6 | // |
7 | |
8 | #include "common.h" |
9 | #include "reflectclasswriter.h" |
10 | |
11 | // Forward declaration. |
12 | STDAPI GetMetaDataInternalInterfaceFromPublic( |
13 | IUnknown *pv, // [IN] Given interface. |
14 | REFIID riid, // [IN] desired interface |
15 | void **ppv); // [OUT] returned interface |
16 | |
17 | //****************************************************** |
18 | //* |
19 | //* constructor for RefClassWriter |
20 | //* |
21 | //****************************************************** |
22 | HRESULT RefClassWriter::Init(ICeeGen *pCeeGen, IUnknown *pUnk, LPCWSTR szName) |
23 | { |
24 | CONTRACT(HRESULT) { |
25 | NOTHROW; |
26 | GC_NOTRIGGER; |
27 | // we know that the com implementation is ours so we use mode-any to simplify |
28 | // having to switch mode |
29 | MODE_ANY; |
30 | INJECT_FAULT(CONTRACT_RETURN(E_OUTOFMEMORY)); |
31 | |
32 | PRECONDITION(CheckPointer(pCeeGen)); |
33 | PRECONDITION(CheckPointer(pUnk)); |
34 | |
35 | POSTCONDITION(SUCCEEDED(RETVAL) ? CheckPointer(m_emitter) : TRUE); |
36 | POSTCONDITION(SUCCEEDED(RETVAL) ? CheckPointer(m_importer) : TRUE); |
37 | POSTCONDITION(SUCCEEDED(RETVAL) ? CheckPointer(m_pEmitHelper) : TRUE); |
38 | POSTCONDITION(SUCCEEDED(RETVAL) ? CheckPointer(m_internalimport) : TRUE); |
39 | } |
40 | CONTRACT_END; |
41 | |
42 | // Initialize the Import and Emitter interfaces |
43 | m_emitter = NULL; |
44 | m_importer = NULL; |
45 | m_internalimport = NULL; |
46 | m_pCeeFileGen = NULL; |
47 | m_ceeFile = NULL; |
48 | m_ulResourceSize = 0; |
49 | m_tkFile = mdFileNil; |
50 | |
51 | m_pCeeGen = pCeeGen; |
52 | pCeeGen->AddRef(); |
53 | |
54 | // Get the interfaces |
55 | HRESULT hr = pUnk->QueryInterface(IID_IMetaDataEmit2, (void**)&m_emitter); |
56 | if (FAILED(hr)) |
57 | RETURN(hr); |
58 | |
59 | hr = pUnk->QueryInterface(IID_IMetaDataImport, (void**)&m_importer); |
60 | if (FAILED(hr)) |
61 | RETURN(hr); |
62 | |
63 | hr = pUnk->QueryInterface(IID_IMetaDataEmitHelper, (void**)&m_pEmitHelper); |
64 | if (FAILED(hr)) |
65 | RETURN(hr); |
66 | |
67 | hr = GetMetaDataInternalInterfaceFromPublic(pUnk, IID_IMDInternalImport, (void**)&m_internalimport); |
68 | if (FAILED(hr)) |
69 | RETURN(hr); |
70 | |
71 | // <TODO> We will need to set this at some point.</TODO> |
72 | hr = m_emitter->SetModuleProps(szName); |
73 | if (FAILED(hr)) |
74 | RETURN(hr); |
75 | |
76 | RETURN(S_OK); |
77 | } |
78 | |
79 | |
80 | //****************************************************** |
81 | //* |
82 | //* destructor for RefClassWriter |
83 | //* |
84 | //****************************************************** |
85 | RefClassWriter::~RefClassWriter() |
86 | { |
87 | CONTRACTL { |
88 | NOTHROW; |
89 | GC_TRIGGERS; |
90 | // we know that the com implementation is ours so we use mode-any to simplify |
91 | // having to switch mode |
92 | MODE_ANY; |
93 | FORBID_FAULT; |
94 | } |
95 | CONTRACTL_END; |
96 | |
97 | if (m_emitter) { |
98 | m_emitter->Release(); |
99 | } |
100 | |
101 | if (m_importer) { |
102 | m_importer->Release(); |
103 | } |
104 | |
105 | if (m_pEmitHelper) { |
106 | m_pEmitHelper->Release(); |
107 | } |
108 | |
109 | if (m_internalimport) { |
110 | m_internalimport->Release(); |
111 | } |
112 | |
113 | if (m_pCeeGen) { |
114 | m_pCeeGen->Release(); |
115 | m_pCeeGen = NULL; |
116 | } |
117 | |
118 | if (m_pOnDiskEmitter) { |
119 | m_pOnDiskEmitter->Release(); |
120 | m_pOnDiskEmitter = NULL; |
121 | } |
122 | } |
123 |