3 internal sealed
class __ExceptionInfo
5 internal const int None = 0;
7 internal const int Filter = 1;
9 internal const int Finally = 2;
11 internal const int Fault = 4;
13 internal const int PreserveStack = 4;
15 internal const int State_Try = 0;
17 internal const int State_Filter = 1;
19 internal const int State_Catch = 2;
21 internal const int State_Finally = 3;
23 internal const int State_Fault = 4;
25 internal const int State_Done = 5;
27 internal int m_startAddr;
29 internal int[] m_filterAddr;
31 internal int[] m_catchAddr;
33 internal int[] m_catchEndAddr;
35 internal int[] m_type;
37 internal Type[] m_catchClass;
39 internal Label m_endLabel;
41 internal Label m_finallyEndLabel;
43 internal int m_endAddr;
45 internal int m_endFinally;
47 internal int m_currentCatch;
49 private int m_currentState;
51 private __ExceptionInfo()
56 m_catchEndAddr =
null;
64 internal __ExceptionInfo(
int startAddr,
Label endLabel)
66 m_startAddr = startAddr;
68 m_filterAddr =
new int[4];
69 m_catchAddr =
new int[4];
70 m_catchEndAddr =
new int[4];
71 m_catchClass =
new Type[4];
73 m_endLabel = endLabel;
79 private static Type[] EnlargeArray(
Type[] incoming)
81 Type[] array =
new Type[incoming.Length * 2];
82 Array.
Copy(incoming, array, incoming.Length);
86 private void MarkHelper(
int catchorfilterAddr,
int catchEndAddr,
Type catchClass,
int type)
88 if (m_currentCatch >= m_catchAddr.Length)
90 m_filterAddr =
ILGenerator.EnlargeArray(m_filterAddr);
91 m_catchAddr =
ILGenerator.EnlargeArray(m_catchAddr);
92 m_catchEndAddr =
ILGenerator.EnlargeArray(m_catchEndAddr);
93 m_catchClass = EnlargeArray(m_catchClass);
98 m_type[m_currentCatch] = type;
99 m_filterAddr[m_currentCatch] = catchorfilterAddr;
100 m_catchAddr[m_currentCatch] = -1;
101 if (m_currentCatch > 0)
103 m_catchEndAddr[m_currentCatch - 1] = catchorfilterAddr;
108 m_catchClass[m_currentCatch] = catchClass;
109 if (m_type[m_currentCatch] != 1)
111 m_type[m_currentCatch] = type;
113 m_catchAddr[m_currentCatch] = catchorfilterAddr;
114 if (m_currentCatch > 0 && m_type[m_currentCatch] != 1)
116 m_catchEndAddr[m_currentCatch - 1] = catchEndAddr;
118 m_catchEndAddr[m_currentCatch] = -1;
123 m_endAddr = catchorfilterAddr;
127 internal void MarkFilterAddr(
int filterAddr)
130 MarkHelper(filterAddr, filterAddr,
null, 1);
133 internal void MarkFaultAddr(
int faultAddr)
136 MarkHelper(faultAddr, faultAddr,
null, 4);
139 internal void MarkCatchAddr(
int catchAddr,
Type catchException)
142 MarkHelper(catchAddr, catchAddr, catchException, 0);
145 internal void MarkFinallyAddr(
int finallyAddr,
int endCatchAddr)
147 if (m_endFinally != -1)
152 m_endFinally = finallyAddr;
153 MarkHelper(finallyAddr, endCatchAddr,
null, 2);
156 internal void Done(
int endAddr)
158 m_catchEndAddr[m_currentCatch - 1] = endAddr;
162 internal int GetStartAddress()
167 internal int GetEndAddress()
172 internal int GetFinallyEndAddress()
177 internal Label GetEndLabel()
182 internal int[] GetFilterAddresses()
187 internal int[] GetCatchAddresses()
192 internal int[] GetCatchEndAddresses()
194 return m_catchEndAddr;
197 internal Type[] GetCatchClass()
202 internal int GetNumberOfCatches()
204 return m_currentCatch;
207 internal int[] GetExceptionTypes()
212 internal void SetFinallyEndLabel(
Label lbl)
214 m_finallyEndLabel = lbl;
217 internal Label GetFinallyEndLabel()
219 return m_finallyEndLabel;
222 internal bool IsInner(__ExceptionInfo exc)
224 int num = exc.m_currentCatch - 1;
225 int num2 = m_currentCatch - 1;
226 if (exc.m_catchEndAddr[num] < m_catchEndAddr[num2])
230 if (exc.m_catchEndAddr[num] == m_catchEndAddr[num2] && exc.GetEndAddress() > GetEndAddress())
237 internal int GetCurrentState()
239 return m_currentState;
No initialization action.
Generates Microsoft intermediate language (MSIL) instructions.
Provides information about, and means to manipulate, the current environment and platform....
Provides methods for creating, manipulating, searching, and sorting arrays, thereby serving as the ba...
Represents type declarations: class types, interface types, array types, value types,...
Represents a label in the instruction stream. Label is used in conjunction with the T:System....
The exception that is thrown when one of the arguments provided to a method is not valid.
static void Copy(Array sourceArray, Array destinationArray, int length)
Copies a range of elements from an T:System.Array starting at the first element and pastes them into ...