ref: 759acbd4ddaa706d2f457616d4e5ea32ea4127f6
parent: 40a12fba0dd5bef0dfcdf3067ea021d3a221faf4
author: Tor Andersson <[email protected]>
date: Mon Jan 20 11:18:49 EST 2014
Add enum-to-string functions for syntax tree and opcodes.
--- a/jscompile.h
+++ b/jscompile.h
@@ -113,7 +113,7 @@
};
js_Function *jsC_compile(js_State *J, js_Ast *prog);
-
+const char *jsC_opcodestring(int opcode);
void jsC_dumpfunction(js_State *J, js_Function *fun);
#endif
--- a/jsdump.c
+++ b/jsdump.c
@@ -5,6 +5,8 @@
#include <assert.h>
+#define nelem(a) (sizeof (a) / sizeof (a)[0])
+
static const char *astname[] = {
"list", "fundec", "ident", "number", "string", "regexp", "undef",
"null", "true", "false", "this", "fun", "array", "object", "prop_val",
@@ -24,6 +26,20 @@
static const char *opname[] = {
#include "opnames.h"
};
+
+const char *jsP_aststring(js_AstType type)
+{
+ if (type < 0 || type > nelem(astname))
+ return "<unknown>";
+ return astname[type];
+}
+
+const char *jsC_opcodestring(int type)
+{
+ if (type < 0 || type > nelem(opname))
+ return "<unknown>";
+ return opname[type];
+}
static inline void pc(int c)
{
--- a/jsparse.h
+++ b/jsparse.h
@@ -128,6 +128,7 @@
void jsP_optimize(js_State *J, js_Ast *prog);
void jsP_freeparse(js_State *J);
+const char *jsP_aststring(js_AstType type);
void jsP_dumpsyntax(js_State *J, js_Ast *prog);
void jsP_dumplist(js_State *J, js_Ast *prog);
--- a/jsrun.c
+++ b/jsrun.c
@@ -808,7 +808,7 @@
return;
default:
- js_error(J, "illegal instruction: %d (pc=%d)", opcode, (int)(pc - F->code - 1));
+ js_error(J, "illegal instruction: %s (pc=%d)", jsC_opcodestring(opcode), (int)(pc - F->code - 1));
}
}
}