#include <stdio.h>
#include "mintops.h"
-#define OPDEF(a,b,c,d) b,
-const char * const mono_interp_opname [] = {
+// This, instead of an array of pointers, to optimize away a pointer and a relocation per string.
+struct MonoInterpOpnameCharacters {
+#define OPDEF(a, b, c, d) char a [sizeof (b)];
#include "mintops.def"
};
#undef OPDEF
-#define OPDEF(a,b,c,d) c,
+extern const MonoInterpOpnameCharacters mono_interp_opname_characters = {
+#define OPDEF(a, b, c, d) b,
+#include "mintops.def"
+};
+#undef OPDEF
+
+extern const guint16 mono_interp_opname_offsets [] = {
+#define OPDEF(a, b, c, d) offsetof (MonoInterpOpnameCharacters, a),
+#include "mintops.def"
+#undef OPDEF
+};
+
+#define OPDEF(a, b, c, d) c,
unsigned char const mono_interp_oplen [] = {
#include "mintops.def"
};
#undef OPDEF
-#define OPDEF(a,b,c,d) d,
+#define OPDEF(a, b, c, d) d,
MintOpArgType const mono_interp_opargtype [] = {
#include "mintops.def"
};
guint32 token;
int target;
- g_string_append_printf (str, "IL_%04x: %-10s", (int)(ip - base), mono_interp_opname [*ip]);
+ g_string_append_printf (str, "IL_%04x: %-10s", (int)(ip - base), mono_interp_opname (*ip));
switch (mono_interp_opargtype [*ip]) {
case MintOpNoArgs:
break;
return g_string_free (str, FALSE);
}
+const char*
+mono_interp_opname (int op)
+{
+ return ((const char*)&mono_interp_opname_characters) + mono_interp_opname_offsets [op];
+}
#define MINT_SWITCH_LEN(n) (3 + (n) * 2)
-extern const char * const mono_interp_opname[];
extern unsigned char const mono_interp_oplen[];
extern MintOpArgType const mono_interp_opargtype[];
extern char* mono_interp_dis_mintop(const unsigned short *base, const guint16 *ip);
extern const guint16* mono_interp_dis_mintop_len (const guint16 *ip);
-#endif
+// This, instead of an array of pointers, to optimize away a pointer and a relocation per string.
+extern const guint16 mono_interp_opname_offsets [ ];
+typedef struct MonoInterpOpnameCharacters MonoInterpOpnameCharacters;
+extern const MonoInterpOpnameCharacters mono_interp_opname_characters;
+
+const char*
+mono_interp_opname (int op);
+#endif
if (type1 != type2) {
g_warning("%s.%s: %04x arith type mismatch %s %d %d",
m_class_get_name (td->method->klass), td->method->name,
- td->ip - td->il_code, mono_interp_opname[mint_op], type1, type2);
+ td->ip - td->il_code, mono_interp_opname (mint_op), type1, type2);
}
op = mint_op + type1 - STACK_TYPE_I4;
CHECK_STACK(td, 2);