std::wstring Writer::operator ()(const Term &term, const Dictionary &dictionary, SymbolType *symbolType) const { if (symbolType) { *symbolType = term.type(); } std::wstring result = dictionary(term.symbol()); if (result.empty()) { switch (term.type()) { case NONE_SYMBOL: return symbolic.noneSymbol; break; case VARIABLE: return variableName(term.symbol().id); break; case CONSTANT: return constantName(term.symbol().id); break; case OPERATION: result = operationName(term.symbol().id); break; default: throw(1); break; } } if (term.type()!=OPERATION) { return result; } result += symbolic.leftTermBracket; if (term.arity()) { result += operator ()(term.args()[0], dictionary); for (size_t i = 1; i < term.arity(); ++i) { result += symbolic.operationSeparatorSymbol; result += operator ()(term.args()[i], dictionary); } } result += symbolic.rightTermBracket; return result; }
void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator& begin, Vector<Instruction>::const_iterator& it) const { int location = it - begin; switch (exec->machine()->getOpcodeID(it->u.opcode)) { case op_load: { int r0 = (++it)->u.operand; int k0 = (++it)->u.operand; printf("[%4d] load\t\t %s, %s\t\t\n", location, registerName(r0).c_str(), constantName(exec, k0, jsValues[k0]).c_str()); break; } case op_new_object: { int r0 = (++it)->u.operand; printf("[%4d] new_object\t %s\n", location, registerName(r0).c_str()); break; } case op_new_array: { int dst = (++it)->u.operand; int argv = (++it)->u.operand; int argc = (++it)->u.operand; printf("[%4d] new_array\t %s, %s, %d\n", location, registerName(dst).c_str(), registerName(argv).c_str(), argc); break; } case op_new_regexp: { int r0 = (++it)->u.operand; int re0 = (++it)->u.operand; printf("[%4d] new_regexp\t %s, %s\n", location, registerName(r0).c_str(), regexpName(re0, regexps[re0].get()).c_str()); break; } case op_mov: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; printf("[%4d] mov\t\t %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str()); break; } case op_not: { printUnaryOp(location, it, "not"); break; } case op_eq: { printBinaryOp(location, it, "eq"); break; } case op_neq: { printBinaryOp(location, it, "neq"); break; } case op_stricteq: { printBinaryOp(location, it, "stricteq"); break; } case op_nstricteq: { printBinaryOp(location, it, "nstricteq"); break; } case op_less: { printBinaryOp(location, it, "less"); break; } case op_lesseq: { printBinaryOp(location, it, "lesseq"); break; } case op_pre_inc: { int r0 = (++it)->u.operand; printf("[%4d] pre_inc\t\t %s\n", location, registerName(r0).c_str()); break; } case op_pre_dec: { int r0 = (++it)->u.operand; printf("[%4d] pre_dec\t\t %s\n", location, registerName(r0).c_str()); break; } case op_post_inc: { printUnaryOp(location, it, "post_inc"); break; } case op_post_dec: { printUnaryOp(location, it, "post_dec"); break; } case op_to_jsnumber: { printUnaryOp(location, it, "to_jsnumber"); break; } case op_negate: { printUnaryOp(location, it, "negate"); break; } case op_add: { printBinaryOp(location, it, "add"); break; } case op_mul: { printBinaryOp(location, it, "mul"); break; } case op_div: { printBinaryOp(location, it, "div"); break; } case op_mod: { printBinaryOp(location, it, "mod"); break; } case op_sub: { printBinaryOp(location, it, "sub"); break; } case op_lshift: { printBinaryOp(location, it, "lshift"); break; } case op_rshift: { printBinaryOp(location, it, "rshift"); break; } case op_urshift: { printBinaryOp(location, it, "urshift"); break; } case op_bitand: { printBinaryOp(location, it, "bitand"); break; } case op_bitxor: { printBinaryOp(location, it, "bitxor"); break; } case op_bitor: { printBinaryOp(location, it, "bitor"); break; } case op_bitnot: { printUnaryOp(location, it, "bitnot"); break; } case op_instanceof: { printBinaryOp(location, it, "instanceof"); break; } case op_typeof: { printUnaryOp(location, it, "typeof"); break; } case op_in: { printBinaryOp(location, it, "in"); break; } case op_resolve: { int r0 = (++it)->u.operand; int id0 = (++it)->u.operand; printf("[%4d] resolve\t\t %s, %s\n", location, registerName(r0).c_str(), idName(id0, identifiers[id0]).c_str()); break; } case op_resolve_skip: { int r0 = (++it)->u.operand; int id0 = (++it)->u.operand; int skipLevels = (++it)->u.operand; printf("[%4d] resolve_skip\t %s, %s, %d\n", location, registerName(r0).c_str(), idName(id0, identifiers[id0]).c_str(), skipLevels); break; } case op_get_scoped_var: { int r0 = (++it)->u.operand; int index = (++it)->u.operand; int skipLevels = (++it)->u.operand; printf("[%4d] get_scoped_var\t\t %s, %d, %d\n", location, registerName(r0).c_str(), index, skipLevels); break; } case op_put_scoped_var: { int index = (++it)->u.operand; int skipLevels = (++it)->u.operand; int r0 = (++it)->u.operand; printf("[%4d] put_scoped_var\t\t %d, %d, %s\n", location, index, skipLevels, registerName(r0).c_str()); break; } case op_resolve_base: { int r0 = (++it)->u.operand; int id0 = (++it)->u.operand; printf("[%4d] resolve_base\t %s, %s\n", location, registerName(r0).c_str(), idName(id0, identifiers[id0]).c_str()); break; } case op_resolve_with_base: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int id0 = (++it)->u.operand; printf("[%4d] resolve_with_base %s, %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str(), idName(id0, identifiers[id0]).c_str()); break; } case op_resolve_func: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int id0 = (++it)->u.operand; printf("[%4d] resolve_func\t %s, %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str(), idName(id0, identifiers[id0]).c_str()); break; } case op_get_by_id: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int id0 = (++it)->u.operand; printf("[%4d] get_by_id\t %s, %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str(), idName(id0, identifiers[id0]).c_str()); break; } case op_put_by_id: { int r0 = (++it)->u.operand; int id0 = (++it)->u.operand; int r1 = (++it)->u.operand; printf("[%4d] put_by_id\t %s, %s, %s\n", location, registerName(r0).c_str(), idName(id0, identifiers[id0]).c_str(), registerName(r1).c_str()); break; } case op_put_getter: { int r0 = (++it)->u.operand; int id0 = (++it)->u.operand; int r1 = (++it)->u.operand; printf("[%4d] put_getter\t %s, %s, %s\n", location, registerName(r0).c_str(), idName(id0, identifiers[id0]).c_str(), registerName(r1).c_str()); break; } case op_put_setter: { int r0 = (++it)->u.operand; int id0 = (++it)->u.operand; int r1 = (++it)->u.operand; printf("[%4d] put_setter\t %s, %s, %s\n", location, registerName(r0).c_str(), idName(id0, identifiers[id0]).c_str(), registerName(r1).c_str()); break; } case op_del_by_id: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int id0 = (++it)->u.operand; printf("[%4d] del_by_id\t %s, %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str(), idName(id0, identifiers[id0]).c_str()); break; } case op_get_by_val: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int r2 = (++it)->u.operand; printf("[%4d] get_by_val\t %s, %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str(), registerName(r2).c_str()); break; } case op_put_by_val: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int r2 = (++it)->u.operand; printf("[%4d] put_by_val\t %s, %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str(), registerName(r2).c_str()); break; } case op_del_by_val: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int r2 = (++it)->u.operand; printf("[%4d] del_by_val\t %s, %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str(), registerName(r2).c_str()); break; } case op_put_by_index: { int r0 = (++it)->u.operand; unsigned n0 = (++it)->u.operand; int r1 = (++it)->u.operand; printf("[%4d] put_by_index\t %s, %u, %s\n", location, registerName(r0).c_str(), n0, registerName(r1).c_str()); break; } case op_jmp: { int offset = (++it)->u.operand; printf("[%4d] jmp\t\t %d(->%d)\n", location, offset, jumpTarget(begin, it, offset)); break; } case op_loop: { int offset = (++it)->u.operand; printf("[%4d] loop\t\t %d(->%d)\n", location, offset, jumpTarget(begin, it, offset)); break; } case op_jtrue: { printConditionalJump(begin, it, location, "jtrue"); break; } case op_loop_if_true: { printConditionalJump(begin, it, location, "loop_if_true"); break; } case op_jfalse: { printConditionalJump(begin, it, location, "jfalse"); break; } case op_jless: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int offset = (++it)->u.operand; printf("[%4d] jless\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, jumpTarget(begin, it, offset)); break; } case op_jnless: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int offset = (++it)->u.operand; printf("[%4d] jnless\t\t %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, jumpTarget(begin, it, offset)); break; } case op_loop_if_less: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int offset = (++it)->u.operand; printf("[%4d] loop_if_less %s, %s, %d(->%d)\n", location, registerName(r0).c_str(), registerName(r1).c_str(), offset, jumpTarget(begin, it, offset)); break; } case op_new_func: { int r0 = (++it)->u.operand; int f0 = (++it)->u.operand; printf("[%4d] new_func\t\t %s, f%d\n", location, registerName(r0).c_str(), f0); break; } case op_new_func_exp: { int r0 = (++it)->u.operand; int f0 = (++it)->u.operand; printf("[%4d] new_func_exp\t %s, f%d\n", location, registerName(r0).c_str(), f0); break; } case op_call: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int r2 = (++it)->u.operand; int tempCount = (++it)->u.operand; int argCount = (++it)->u.operand; printf("[%4d] call\t\t %s, %s, %s, %d, %d\n", location, registerName(r0).c_str(), registerName(r1).c_str(), registerName(r2).c_str(), tempCount, argCount); break; } case op_call_eval: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int r2 = (++it)->u.operand; int tempCount = (++it)->u.operand; int argCount = (++it)->u.operand; printf("[%4d] call_eval\t\t %s, %s, %s, %d, %d\n", location, registerName(r0).c_str(), registerName(r1).c_str(), registerName(r2).c_str(), tempCount, argCount); break; } case op_ret: { int r0 = (++it)->u.operand; printf("[%4d] ret\t\t %s\n", location, registerName(r0).c_str()); break; } case op_construct: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; int tempCount = (++it)->u.operand; int argCount = (++it)->u.operand; printf("[%4d] construct\t %s, %s, %d, %d\n", location, registerName(r0).c_str(), registerName(r1).c_str(), tempCount, argCount); break; } case op_get_pnames: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; printf("[%4d] get_pnames\t %s, %s\n", location, registerName(r0).c_str(), registerName(r1).c_str()); break; } case op_next_pname: { int dest = (++it)->u.operand; int iter = (++it)->u.operand; int offset = (++it)->u.operand; printf("[%4d] next_pname\t %s, %s, %d(->%d)\n", location, registerName(dest).c_str(), registerName(iter).c_str(), offset, jumpTarget(begin, it, offset)); break; } case op_push_scope: { int r0 = (++it)->u.operand; printf("[%4d] push_scope\t %s\n", location, registerName(r0).c_str()); break; } case op_pop_scope: { printf("[%4d] pop_scope\n", location); break; } case op_jmp_scopes: { int scopeDelta = (++it)->u.operand; int offset = (++it)->u.operand; printf("[%4d] jmp_scopes\t^%d, %d(->%d)\n", location, scopeDelta, offset, jumpTarget(begin, it, offset)); break; } case op_catch: { int r0 = (++it)->u.operand; printf("[%4d] catch\t\t %s\n", location, registerName(r0).c_str()); break; } case op_throw: { int r0 = (++it)->u.operand; printf("[%4d] throw\t\t %s\n", location, registerName(r0).c_str()); break; } case op_new_error: { int r0 = (++it)->u.operand; int errorType = (++it)->u.operand; int k0 = (++it)->u.operand; printf("[%4d] new_error\t %s, %d, %s\n", location, registerName(r0).c_str(), errorType, constantName(exec, k0, jsValues[k0]).c_str()); break; } case op_jsr: { int retAddrDst = (++it)->u.operand; int offset = (++it)->u.operand; printf("[%4d] jsr\t\t %s, %d(->%d)\n", location, registerName(retAddrDst).c_str(), offset, jumpTarget(begin, it, offset)); break; } case op_sret: { int retAddrSrc = (++it)->u.operand; printf("[%4d] sret\t\t %s\n", location, registerName(retAddrSrc).c_str()); break; } case op_debug: { int debugHookID = (++it)->u.operand; int firstLine = (++it)->u.operand; int lastLine = (++it)->u.operand; printf("[%4d] debug\t\t %s, %d, %d\n", location, debugHookName(debugHookID), firstLine, lastLine); break; } case op_end: { int r0 = (++it)->u.operand; printf("[%4d] end\t\t %s\n", location, registerName(r0).c_str()); break; } default: { ASSERT_NOT_REACHED(); break; } } }