I have a problem that is nailing me in the back. I followed Dentoid's example on using the STL string for AS. When I pass strings from the host application to script functions, everything seems to work ok. But when I start making calls between script functions using string params/return values, then all hell breaks out.
This code block shows the utility script functions (called by other script functions):
string get_string(Data* pObj, string tag)
{
string temp;
pObj->GetAttributeBase(tag, temp);
return temp;
}
void sendto(Data* pTarget, string text)
{ pTarget->EnqueueOutput(text); }
This block shows two versions of the same function that are called by the host application:
// This version works fine
void look_monster(Data* pPlayer, Data* pMonster)
{
string m_name, m_desc, p_name;
pPlayer->GetAttributeBase("name", p_name);
pMonster->GetAttributeBase("name", m_name);
pMonster->GetAttributeBase("desc", m_desc);
sendto(pPlayer->GetParent(), "\x1B[0;37m" + p_name + " looks at " + m_name + ".\r\n", pPlayer);
sendto(pPlayer, "\x1B[1;36m" + p_name + "\r\n\x1B[0;37m" + m_desc + "\r\n");
}
// This version crashes
void look_monster(Data* pPlayer, Data* pMonster)
{
string m_name = get_string(pMonster, "name");
string m_desc = get_string(pMonster, "desc");
string p_name = get_string(pPlayer, "name");
sendto(pPlayer, m_name); // Prints ok
sendto(pPlayer, m_desc); // Prints ok
sendto(pPlayer, p_name); // Prints garbage
// This crashes
// sendto(pPlayer->GetParent(), "\x1B[0;37m" + p_name + " looks at " + m_name + ".\r\n", pPlayer);
// sendto(pPlayer, "\x1B[1;36m" + p_name + "\r\n\x1B[0;37m" + m_desc + "\r\n");
}
This is how I am setting up the string in AS.
string string_factory(asUINT length, const char *s) { return string(s); }
void string_ctor(string *pthis) { new(pthis)string(); }
void string_dtor(string *pthis) { pthis->~string(); }
//string& string_assign_string(string ©, string *pthis) { return *new(pthis)string(copy); }
string& string_assign_string(string ©, string *pthis) { return *pthis = copy; }
bool string_equal(const string &l, const string &r) { return l == r; }
bool string_not_equal(const string &l, const string &r) { return l != r; }
string string_add_string(const string &l, const string &r) { return l + r; }
pEngine->RegisterObjectType("string", sizeof (string), asOBJ_IS_COMPLEX);
pEngine->RegisterStringFactory("string", asFUNCTION(string_factory), asCALL_CDECL/* | asCALL_RETURNBYREF*/);
pEngine->RegisterTypeBehaviour("string", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(string_ctor), asCALL_CDECL_OBJLAST);
pEngine->RegisterTypeBehaviour("string", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(string_dtor), asCALL_CDECL_OBJLAST);
pEngine->RegisterTypeBehaviour("string", asBEHAVE_ASSIGNMENT, "string& f(string&)", asFUNCTION(string_assign_string), asCALL_CDECL_OBJLAST);
pEngine->RegisterTypeBehaviour(0, asBEHAVE_EQUAL, "bool f(const string&, const string&)", asFUNCTION(string_equal), asCALL_CDECL);
pEngine->RegisterTypeBehaviour(0, asBEHAVE_NOTEQUAL, "bool f(const string&, const string&)", asFUNCTION(string_not_equal), asCALL_CDECL);
pEngine->RegisterTypeBehaviour(0, asBEHAVE_ADD, "string f(const string&, const string&)", asFUNCTION(string_add_string), asCALL_CDECL);
I've been staring at this code for too long now and am not any closer to an answer. Any one have an idea?