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(); }
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(); }