+/*
+A try block hole is used to represent a non-contiguous part of
+of a segment of native code protected by a given .try block.
+Usually, a try block is defined as a contiguous segment of code.
+But in some cases it's needed to have some parts of it to not be protected.
+For example, given "try {} finally {}", the code in the .try block to call
+the finally part looks like:
+
+try {
+ ...
+ call finally_block
+ adjust stack
+ jump outside try block
+ ...
+} finally {
+ ...
+}
+
+The instructions between the call and the jump should not be under the try block since they happen
+after the finally block executes, which means if an async exceptions happens at that point we would
+execute the finally clause twice. So, to avoid this, we introduce a hole in the try block to signal
+that those instructions are not protected.
+*/
+typedef struct
+{
+ guint32 offset;
+ guint16 clause;
+ guint16 length;
+} MonoTryBlockHoleJitInfo;
+
+typedef struct
+{
+ guint16 num_holes;
+ MonoTryBlockHoleJitInfo holes [MONO_ZERO_LEN_ARRAY];
+} MonoTryBlockHoleTableJitInfo;
+
+typedef struct
+{
+ guint32 stack_size;
+} MonoArchEHJitInfo;
+
+typedef struct {
+ gboolean cas_inited:1;
+ gboolean cas_class_assert:1;
+ gboolean cas_class_deny:1;
+ gboolean cas_class_permitonly:1;
+ gboolean cas_method_assert:1;
+ gboolean cas_method_deny:1;
+ gboolean cas_method_permitonly:1;
+} MonoMethodCasInfo;
+