void interpreter::get_running_call_stack_frame_info(int frame, const char * & stackinfo, const char * & func, const char * & file, int & line) const { stackinfo = ""; func = ""; file = ""; line = 0; if (!m_fb) { return; } m_fk->rn.cur_runinginfo.clear(); int deps = 0; int ip = m_ip; int bp = m_bp; const func_binary * fb = m_fb; while (!BP_END(bp)) { if (deps >= frame) { func = fb ? FUNC_BINARY_NAME(*fb) : ""; file = fb ? FUNC_BINARY_FILENAME(*fb) : ""; line = fb ? GET_CMD_LINENO(*fb, ip) : 0; m_fk->rn.cur_runinginfo += "#"; m_fk->rn.cur_runinginfo += fkitoa(deps); m_fk->rn.cur_runinginfo += " "; m_fk->rn.cur_runinginfo += func; m_fk->rn.cur_runinginfo += " at "; m_fk->rn.cur_runinginfo += file; m_fk->rn.cur_runinginfo += ":"; m_fk->rn.cur_runinginfo += fkitoa(line); m_fk->rn.cur_runinginfo += "\n"; stackinfo = m_fk->rn.cur_runinginfo.c_str(); return; } BP_GET_FB(bp, fb); BP_GET_IP(bp, ip); int callbp = 0; BP_GET_BP(bp, callbp); bp = callbp; if (BP_END(bp)) { break; } deps++; } }
const char * interpreter::get_running_call_stack() const { m_fk->rn.curcallstack.clear(); int deps = 0; for (int i = ARRAY_SIZE(m_stack_list) - 1; i >= 0; i--) { m_fk->rn.curcallstack += "#"; m_fk->rn.curcallstack += fkitoa(deps); m_fk->rn.curcallstack += " "; stack & s = ARRAY_GET(m_stack_list, i); m_fk->rn.curcallstack += s.m_fb->m_name; m_fk->rn.curcallstack += " at "; m_fk->rn.curcallstack += s.m_fb->m_filename; m_fk->rn.curcallstack += ":"; m_fk->rn.curcallstack += fkitoa(GET_CMD_LINENO((*s.m_fb), s.m_pos)); m_fk->rn.curcallstack += "\n"; for (int j = 0; j < s.m_fb->m_maxstack && j < (int)ARRAY_MAX_SIZE(s.m_stack_variant_list); j++) { m_fk->rn.curcallstack += " ["; m_fk->rn.curcallstack += fkitoa(j); m_fk->rn.curcallstack += "]\t"; m_fk->rn.curcallstack += vartostring(&ARRAY_GET(s.m_stack_variant_list, j)); m_fk->rn.curcallstack += "\n"; } deps++; } return m_fk->rn.curcallstack.c_str(); }
String & funcmap::dump() { String & ret = m_dump; ret.clear(); ret += "conflict\n"; const int conflict_len = 10; int conflict[conflict_len]; m_shh.get_conflict(conflict, conflict_len); for (int i = 0; i < conflict_len; i++) { ret += "["; ret += fkitoa(i); ret += "]\t"; ret += fkitoa(conflict[i]); ret += "\n"; } ret += "\nconflict map\n"; const int conflict_map_len = 1024; int len = conflict_map_len; int conflict_map[conflict_map_len]; m_shh.get_conflict_map(conflict_map, len); for (int i = 0; i < (int)len; i++) { ret += "["; ret += fkitoa(i); ret += "]\t"; ret += fkitoa(conflict_map[i]); ret += "\n"; } return ret; }
const char * profile::dump() { std::vector<sortele> sortelevec; for (const stringhashmap::ele * p = m_shh.first(); p != 0; p = m_shh.next()) { const profilefuncele & ele = *p->t; sortelevec.push_back(std::make_pair(p->k, ele)); } std::sort(sortelevec.begin(), sortelevec.end(), profilefuncelesort()); m_dumpstr.clear(); m_dumpstr += "Call Func:\n"; for (int i = 0; i < (int)sortelevec.size(); i++) { const sortele & se = sortelevec[i]; const profilefuncele & ele = se.second; char buff[1024]; tsnprintf(buff, sizeof(buff)-1, "\tFunc[%s]\tCalls[%d]\tTotalTime(ms)[%u]\tPerCallTime(ms)[%u]\n", se.first.c_str(), ele.callnum, ele.calltime, ele.callnum ? ele.calltime / ele.callnum : 0); m_dumpstr += buff; } m_dumpstr += "Code Num:\n"; for (int i = 0; i < OPCODE_MAX; i++) { m_dumpstr += "\t"; m_dumpstr += OpCodeStr(i); for (int j = 0; j < (int)(20 - strlen(OpCodeStr(i))); j++) { m_dumpstr += " "; } m_dumpstr += fkitoa(m_codetype[i]); m_dumpstr += "\n"; } return m_dumpstr.c_str(); }
const char * interpreter::get_running_call_stack() const { if (!m_fb) { return ""; } m_fk->rn.cur_runinginfo.clear(); int deps = 0; int ip = m_ip; int bp = m_bp; const func_binary * fb = m_fb; while (!BP_END(bp)) { m_fk->rn.cur_runinginfo += "#"; m_fk->rn.cur_runinginfo += fkitoa(deps); m_fk->rn.cur_runinginfo += " "; m_fk->rn.cur_runinginfo += fb ? FUNC_BINARY_NAME(*fb) : ""; m_fk->rn.cur_runinginfo += " at "; m_fk->rn.cur_runinginfo += fb ? FUNC_BINARY_FILENAME(*fb) : ""; m_fk->rn.cur_runinginfo += ":"; m_fk->rn.cur_runinginfo += fb ? fkitoa(GET_CMD_LINENO(*fb, ip)) : 0; m_fk->rn.cur_runinginfo += "\n"; for (int j = 0; fb && j < FUNC_BINARY_MAX_STACK(*fb); j++) { m_fk->rn.cur_runinginfo += " "; String variant_name; for (int i = 0; i < fb->m_debug_stack_variant_info_num; i++) { const stack_variant_info & info = fb->m_debug_stack_variant_info[i]; if (info.pos == j) { variant_name += info.name; variant_name += "(line:"; variant_name += fkitoa(info.line); variant_name += ") "; } } if (variant_name.empty()) { variant_name = "(anonymous)"; } m_fk->rn.cur_runinginfo += variant_name; m_fk->rn.cur_runinginfo += "\t["; m_fk->rn.cur_runinginfo += fkitoa(j); m_fk->rn.cur_runinginfo += "]\t"; variant * v = 0; GET_STACK(bp, v, j); m_fk->rn.cur_runinginfo += vartostring(v); m_fk->rn.cur_runinginfo += "\n"; } BP_GET_FB(bp, fb); BP_GET_IP(bp, ip); int callbp = 0; BP_GET_BP(bp, callbp); bp = callbp; if (BP_END(bp)) { break; } deps++; } return m_fk->rn.cur_runinginfo.c_str(); }