This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[mono.git] / mono / metadata / opcodes.c
1 /*
2  * opcodes.c: CIL instruction information
3  *
4  * Author:
5  *   Paolo Molaro (lupus@ximian.com)
6  *
7  * (C) 2002 Ximian, Inc.
8  */
9 #include <mono/metadata/opcodes.h>
10 #include <stddef.h> /* for NULL */
11
12 #define MONO_PREFIX1_OFFSET MONO_CEE_ARGLIST
13 #define MONO_CUSTOM_PREFIX_OFFSET MONO_CEE_MONO_FUNC1
14
15 #define OPDEF(a,b,c,d,e,f,g,h,i,j) \
16         { Mono ## e, MONO_FLOW_ ## j, MONO_ ## a },
17
18 const MonoOpcode
19 mono_opcodes [MONO_CEE_LAST + 1] = {
20 #include "mono/cil/opcode.def"
21         {0}
22 };
23
24 #undef OPDEF
25
26 #define OPDEF(a,b,c,d,e,f,g,h,i,j) b,
27
28 const char* const
29 mono_opcode_names [MONO_CEE_LAST + 1] = {
30 #include "mono/cil/opcode.def"
31         NULL
32 };
33
34 MonoOpcodeEnum
35 mono_opcode_value (const guint8 **ip, const guint8 *end)
36 {
37         MonoOpcodeEnum res;
38         const guint8 *p = *ip;
39
40         if (p >= end)
41                 return -1;
42         if (*p == 0xfe) {
43                 ++p;
44                 if (p >= end)
45                         return -1;
46                 res = *p + MONO_PREFIX1_OFFSET;
47         } else if (*p == MONO_CUSTOM_PREFIX) {
48                 ++p;
49                 if (p >= end)
50                         return -1;
51                 res = *p + MONO_CUSTOM_PREFIX_OFFSET;
52         } else {
53                 res = *p;
54         }
55         *ip = p;
56         return res;
57 }
58