X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fopcodes.c;h=e534d33b42239c659f083813f3a06176d3682af8;hb=d28989fddd8c7a54bd166ae98ddace9a2f98d9c4;hp=cbf00514f8d613035a9925fef6f348d1f030f939;hpb=f58fc38d66b7cd6705e706f76731e0f65fe80c5f;p=mono.git diff --git a/mono/metadata/opcodes.c b/mono/metadata/opcodes.c index cbf00514f8d..e534d33b422 100644 --- a/mono/metadata/opcodes.c +++ b/mono/metadata/opcodes.c @@ -4,13 +4,15 @@ * 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 #include /* for NULL */ +#include #define MONO_PREFIX1_OFFSET MONO_CEE_ARGLIST -#define MONO_CUSTOM_PREFIX_OFFSET MONO_CEE_MONO_FUNC1 +#define MONO_CUSTOM_PREFIX_OFFSET MONO_CEE_MONO_ICALL #define OPDEF(a,b,c,d,e,f,g,h,i,j) \ { Mono ## e, MONO_FLOW_ ## j, MONO_ ## a }, @@ -23,29 +25,68 @@ 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 { +#define OPDEF(a,b,c,d,e,f,g,h,i,j) char MSGSTRFIELD(__LINE__) [sizeof (b)]; +#include "mono/cil/opcode.def" +#undef OPDEF +} opstr = { #define OPDEF(a,b,c,d,e,f,g,h,i,j) b, +#include "mono/cil/opcode.def" +#undef OPDEF +}; +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 +}; -const char* const +const char* +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) +mono_opcode_value (const mono_byte **ip, const mono_byte *end) { MonoOpcodeEnum res; + const mono_byte *p = *ip; - if (**ip == 0xfe) { - ++*ip; - res = **ip + MONO_PREFIX1_OFFSET; - } else if (**ip == MONO_CUSTOM_PREFIX) { - ++*ip; - res = **ip + MONO_CUSTOM_PREFIX_OFFSET; + if (p >= end) + return -1; + if (*p == 0xfe) { + ++p; + if (p >= end) + return -1; + res = *p + MONO_PREFIX1_OFFSET; + } else if (*p == MONO_CUSTOM_PREFIX) { + ++p; + if (p >= end) + return -1; + res = *p + MONO_CUSTOM_PREFIX_OFFSET; } else { - res = **ip; + res = *p; } - + *ip = p; return res; }