mirror of
https://github.com/ccxvii/mujs.git
synced 2026-09-21 06:33:35 +08:00
Split debug printing of bytecode etc into "pp" tool.
This commit is contained in:
@@ -63,16 +63,17 @@ shell: $(OUT)/mujs $(OUT)/mujs-pp
|
||||
static: $(OUT)/libmujs.a
|
||||
shared: $(OUT)/libmujs.$(SO_EXT)
|
||||
|
||||
astnames.h: jsparse.h
|
||||
grep -E '(AST|EXP|STM)_' jsparse.h | sed 's/^[^A-Z]*\(AST_\)*/"/;s/,.*/",/' | tr A-Z a-z > $@
|
||||
astnames.h: jsi.h
|
||||
grep -E '\<(AST|EXP|STM)_' jsi.h | sed 's/^[^A-Z]*\(AST_\)*/"/;s/,.*/",/' | tr A-Z a-z > $@
|
||||
|
||||
opnames.h: jsi.h
|
||||
grep -E '\<OP_' jsi.h | sed 's/^[^A-Z]*OP_/"/;s/,.*/",/' | tr A-Z a-z > $@
|
||||
|
||||
opnames.h: jscompile.h
|
||||
grep -E 'OP_' jscompile.h | sed 's/^[^A-Z]*OP_/"/;s/,.*/",/' | tr A-Z a-z > $@
|
||||
|
||||
one.c: $(SRCS)
|
||||
ls $(SRCS) | awk '{print "#include \""$$1"\""}' > $@
|
||||
|
||||
jsdump.c: astnames.h opnames.h
|
||||
pp.c: astnames.h opnames.h
|
||||
|
||||
$(OUT)/%.o: %.c $(HDRS)
|
||||
@ mkdir -p $(@D)
|
||||
|
||||
+1
-1
@@ -775,7 +775,7 @@ static void cexp(JF, js_Ast *exp)
|
||||
break;
|
||||
|
||||
default:
|
||||
jsC_error(J, exp, "unknown expression: (%s)", jsP_aststring(exp->type));
|
||||
jsC_error(J, exp, "unknown expression type");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -483,10 +483,6 @@ void jsV_resizearray(js_State *J, js_Object *obj, int newlen);
|
||||
void jsV_unflattenarray(js_State *J, js_Object *obj);
|
||||
void jsV_growarray(js_State *J, js_Object *obj);
|
||||
|
||||
/* jsdump.c */
|
||||
void js_dumpobject(js_State *J, js_Object *obj);
|
||||
void js_dumpvalue(js_State *J, js_Value v);
|
||||
|
||||
/* Lexer */
|
||||
|
||||
enum
|
||||
@@ -706,10 +702,6 @@ js_Ast *jsP_parsefunction(js_State *J, const char *filename, const char *params,
|
||||
js_Ast *jsP_parse(js_State *J, const char *filename, const char *source);
|
||||
void jsP_freeparse(js_State *J);
|
||||
|
||||
const char *jsP_aststring(enum js_AstType type);
|
||||
void jsP_dumpsyntax(js_State *J, js_Ast *prog, int minify);
|
||||
void jsP_dumplist(js_State *J, js_Ast *prog);
|
||||
|
||||
/* Compiler */
|
||||
|
||||
enum js_OpCode
|
||||
@@ -846,8 +838,6 @@ struct js_Function
|
||||
|
||||
js_Function *jsC_compilefunction(js_State *J, js_Ast *prog);
|
||||
js_Function *jsC_compilescript(js_State *J, js_Ast *prog, int default_strict);
|
||||
const char *jsC_opcodestring(enum js_OpCode opcode);
|
||||
void jsC_dumpfunction(js_State *J, js_Function *fun);
|
||||
|
||||
/* Builtins */
|
||||
|
||||
|
||||
@@ -1455,28 +1455,49 @@ void js_throw(js_State *J)
|
||||
|
||||
/* Main interpreter loop */
|
||||
|
||||
static void jsR_dumpstack(js_State *J)
|
||||
static void js_dumpvalue(js_State *J, js_Value v)
|
||||
{
|
||||
int i;
|
||||
printf("stack {\n");
|
||||
for (i = 0; i < TOP; ++i) {
|
||||
putchar(i == BOT ? '>' : ' ');
|
||||
printf("%4d: ", i);
|
||||
js_dumpvalue(J, STACK[i]);
|
||||
putchar('\n');
|
||||
switch (v.type) {
|
||||
case JS_TUNDEFINED: printf("undefined"); break;
|
||||
case JS_TNULL: printf("null"); break;
|
||||
case JS_TBOOLEAN: printf(v.u.boolean ? "true" : "false"); break;
|
||||
case JS_TNUMBER: printf("%.9g", v.u.number); break;
|
||||
case JS_TSHRSTR: printf("'%s'", v.u.shrstr); break;
|
||||
case JS_TLITSTR: printf("'%s'", v.u.litstr); break;
|
||||
case JS_TMEMSTR: printf("'%s'", v.u.memstr->p); break;
|
||||
case JS_TOBJECT:
|
||||
if (v.u.object == J->G) {
|
||||
printf("[Global]");
|
||||
break;
|
||||
}
|
||||
switch (v.u.object->type) {
|
||||
case JS_COBJECT: printf("[Object %p]", (void*)v.u.object); break;
|
||||
case JS_CARRAY: printf("[Array %p]", (void*)v.u.object); break;
|
||||
case JS_CFUNCTION:
|
||||
printf("[Function %p, %s, %s:%d]",
|
||||
(void*)v.u.object,
|
||||
v.u.object->u.f.function->name,
|
||||
v.u.object->u.f.function->filename,
|
||||
v.u.object->u.f.function->line);
|
||||
break;
|
||||
case JS_CSCRIPT: printf("[Script %s]", v.u.object->u.f.function->filename); break;
|
||||
case JS_CCFUNCTION: printf("[CFunction %s]", v.u.object->u.c.name); break;
|
||||
case JS_CBOOLEAN: printf("[Boolean %d]", v.u.object->u.boolean); break;
|
||||
case JS_CNUMBER: printf("[Number %g]", v.u.object->u.number); break;
|
||||
case JS_CSTRING: printf("[String'%s']", v.u.object->u.s.string); break;
|
||||
case JS_CERROR: printf("[Error]"); break;
|
||||
case JS_CARGUMENTS: printf("[Arguments %p]", (void*)v.u.object); break;
|
||||
case JS_CITERATOR: printf("[Iterator %p]", (void*)v.u.object); break;
|
||||
case JS_CUSERDATA:
|
||||
printf("[Userdata %s %p]", v.u.object->u.user.tag, v.u.object->u.user.data);
|
||||
break;
|
||||
default: printf("[Object %p]", (void*)v.u.object); break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
printf("}\n");
|
||||
}
|
||||
|
||||
static void jsR_dumpenvironment(js_State *J, js_Environment *E, int d)
|
||||
{
|
||||
printf("scope %d ", d);
|
||||
js_dumpobject(J, E->variables);
|
||||
if (E->outer)
|
||||
jsR_dumpenvironment(J, E->outer, d+1);
|
||||
}
|
||||
|
||||
void js_stacktrace(js_State *J)
|
||||
static void js_stacktrace(js_State *J)
|
||||
{
|
||||
int n;
|
||||
printf("stack trace:\n");
|
||||
@@ -1494,15 +1515,22 @@ void js_stacktrace(js_State *J)
|
||||
}
|
||||
}
|
||||
|
||||
static void js_dumpstack(js_State *J)
|
||||
{
|
||||
int i;
|
||||
printf("stack {\n");
|
||||
for (i = 0; i < TOP; ++i) {
|
||||
putchar(i == BOT ? '>' : ' ');
|
||||
printf("%4d: ", i);
|
||||
js_dumpvalue(J, STACK[i]);
|
||||
putchar('\n');
|
||||
}
|
||||
printf("}\n");
|
||||
}
|
||||
|
||||
void js_trap(js_State *J, int pc)
|
||||
{
|
||||
if (pc > 0) {
|
||||
js_Function *F = STACK[BOT-1].u.object->u.f.function;
|
||||
printf("trap at %d in function ", pc);
|
||||
jsC_dumpfunction(J, F);
|
||||
}
|
||||
jsR_dumpstack(J);
|
||||
jsR_dumpenvironment(J, J->E, 0);
|
||||
js_dumpstack(J);
|
||||
js_stacktrace(J);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include "jscompile.c"
|
||||
#include "jsdate.c"
|
||||
#include "jsdtoa.c"
|
||||
#include "jsdump.c"
|
||||
#include "jserror.c"
|
||||
#include "jsfunction.c"
|
||||
#include "jsgc.c"
|
||||
|
||||
Reference in New Issue
Block a user