Пример #1
0
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++;
	}

}
Пример #2
0
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();
}
Пример #3
0
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();
}