From 59619073a89cc6add5eda979ac234ed8e2d0266e Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 29 Dec 2011 11:09:51 +0100 Subject: [PATCH] jscript: Added bytecode dumper implementation. --- dlls/jscript/compile.c | 55 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c index 05d1cccfd11..62dadea6e82 100644 --- a/dlls/jscript/compile.c +++ b/dlls/jscript/compile.c @@ -25,6 +25,7 @@ #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(jscript); +WINE_DECLARE_DEBUG_CHANNEL(jscript_disas); typedef struct _statement_ctx_t { unsigned stack_use; @@ -61,6 +62,46 @@ OP_LIST #undef X }; +static void dump_instr_arg(instr_arg_type_t type, instr_arg_t *arg) +{ + switch(type) { + case ARG_STR: + TRACE_(jscript_disas)("\t%s", debugstr_w(arg->str)); + break; + case ARG_BSTR: + TRACE_(jscript_disas)("\t%s", debugstr_wn(arg->bstr, SysStringLen(arg->bstr))); + break; + case ARG_INT: + TRACE_(jscript_disas)("\t%d", arg->uint); + break; + case ARG_UINT: + case ARG_ADDR: + TRACE_(jscript_disas)("\t%u", arg->uint); + break; + case ARG_DBL: + TRACE_(jscript_disas)("\t%lf", *arg->dbl); + break; + case ARG_STAT: + case ARG_FUNC: + case ARG_NONE: + break; + default: + assert(0); + } +} + +static void dump_code(compiler_ctx_t *ctx, unsigned off) +{ + instr_t *instr; + + for(instr = ctx->code->instrs+off; instr < ctx->code->instrs+ctx->code_off; instr++) { + TRACE_(jscript_disas)("%d:\t%s", (int)(instr-ctx->code->instrs), instr_info[instr->op].op_str); + dump_instr_arg(instr_info[instr->op].arg1_type, &instr->arg1); + dump_instr_arg(instr_info[instr->op].arg2_type, &instr->arg2); + TRACE_(jscript_disas)("\n"); + } +} + static HRESULT compile_expression(compiler_ctx_t*,expression_t*); static HRESULT compile_statement(compiler_ctx_t*,statement_ctx_t*,statement_t*); @@ -1639,6 +1680,7 @@ HRESULT compile_subscript(parser_ctx_t *parser, expression_t *expr, unsigned *re HRESULT compile_subscript_stat(parser_ctx_t *parser, statement_t *stat, unsigned *ret_off) { + unsigned off; HRESULT hres; TRACE("\n"); @@ -1647,7 +1689,7 @@ HRESULT compile_subscript_stat(parser_ctx_t *parser, statement_t *stat, unsigned if(FAILED(hres)) return hres; - *ret_off = parser->compiler->code_off; + off = parser->compiler->code_off; if(stat->next) hres = compile_block_statement(parser->compiler, stat); else @@ -1655,7 +1697,14 @@ HRESULT compile_subscript_stat(parser_ctx_t *parser, statement_t *stat, unsigned if(FAILED(hres)) return hres; - resolve_labels(parser->compiler, *ret_off); + resolve_labels(parser->compiler, off); - return push_instr(parser->compiler, OP_ret) == -1 ? E_OUTOFMEMORY : S_OK; + if(push_instr(parser->compiler, OP_ret) == -1) + return E_OUTOFMEMORY; + + if(TRACE_ON(jscript_disas)) + dump_code(parser->compiler, off); + + *ret_off = off; + return S_OK; }