Merge pull request #2305 from ludovic-henry/fix-threadpool-36414
[mono.git] / mono / metadata / opcodes.c
index c7328c15c50b6babe8f4660bd9451e24829eaca4..6cfbe5cbcce2fe85df1a6912fbcb024ad8401d8e 100644 (file)
@@ -4,10 +4,12 @@
  * Author:
  *   Paolo Molaro (lupus@ximian.com)
  *
- * (C) 2002 Ximian, Inc.
+ * Copyright 2002-2003 Ximian, Inc (http://www.ximian.com)
+ * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
  */
 #include <mono/metadata/opcodes.h>
 #include <stddef.h> /* for NULL */
+#include <config.h>
 
 #define MONO_PREFIX1_OFFSET MONO_CEE_ARGLIST
 #define MONO_CUSTOM_PREFIX_OFFSET MONO_CEE_MONO_ICALL
@@ -23,6 +25,7 @@ mono_opcodes [MONO_CEE_LAST + 1] = {
 
 #undef OPDEF
 
+#ifdef HAVE_ARRAY_ELEM_INIT
 #define MSGSTRFIELD(line) MSGSTRFIELD1(line)
 #define MSGSTRFIELD1(line) str##line
 static const struct msgstr_t {
@@ -34,7 +37,7 @@ static const struct msgstr_t {
 #include "mono/cil/opcode.def"
 #undef OPDEF
 };
-static const int opidx [] = {
+static const int16_t opidx [] = {
 #define OPDEF(a,b,c,d,e,f,g,h,i,j) [MONO_ ## a] = offsetof (struct msgstr_t, MSGSTRFIELD(__LINE__)),
 #include "mono/cil/opcode.def"
 #undef OPDEF
@@ -46,26 +49,42 @@ mono_opcode_name (int opcode)
        return (const char*)&opstr + opidx [opcode];
 }
 
+#else
+#define OPDEF(a,b,c,d,e,f,g,h,i,j) b,
+static const char* const
+mono_opcode_names [MONO_CEE_LAST + 1] = {
+#include "mono/cil/opcode.def"
+       NULL
+};
+
+const char*
+mono_opcode_name (int opcode)
+{
+       return mono_opcode_names [opcode];
+}
+
+#endif
+
 MonoOpcodeEnum
-mono_opcode_value (const guint8 **ip, const guint8 *end)
+mono_opcode_value (const mono_byte **ip, const mono_byte *end)
 {
        MonoOpcodeEnum res;
-       const guint8 *p = *ip;
+       const mono_byte *p = *ip;
 
        if (p >= end)
-               return -1;
+               return (MonoOpcodeEnum)-1;
        if (*p == 0xfe) {
                ++p;
                if (p >= end)
-                       return -1;
-               res = *p + MONO_PREFIX1_OFFSET;
+                       return (MonoOpcodeEnum)-1;
+               res = (MonoOpcodeEnum)(*p + MONO_PREFIX1_OFFSET);
        } else if (*p == MONO_CUSTOM_PREFIX) {
                ++p;
                if (p >= end)
-                       return -1;
-               res = *p + MONO_CUSTOM_PREFIX_OFFSET;
+                       return (MonoOpcodeEnum)-1;
+               res = (MonoOpcodeEnum)(*p + MONO_CUSTOM_PREFIX_OFFSET);
        } else {
-               res = *p;
+               res = (MonoOpcodeEnum)*p;
        }
        *ip = p;
        return res;