Beispiel #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++;
	}

}
Beispiel #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();
}
Beispiel #3
0
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;
}
Beispiel #4
0
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();
}
Beispiel #5
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();
}