Fixed memory management issues introduced by revision 157507.

A local std::string was being filled in and then the function would return "s.c_str()".
A local StreamString (which contains a std::string) was being filled in, and essentially also returning the c string from the std::string, though it was in a the StreamString class.

The fix was to not do this by passing a stream object into StringList::Join() and fix the "arch_helper()" function to do what it should: cache the result in a global.

llvm-svn: 157519
This commit is contained in:
Greg Clayton 2012-05-26 17:21:14 +00:00
parent 3c05cd3ea8
commit d70b14ea9d
3 changed files with 18 additions and 18 deletions

View File

@ -51,8 +51,8 @@ public:
const char *
GetStringAtIndex (size_t idx) const;
const char *
Join (const char *seperator);
void
Join (const char *separator, Stream &strm);
void
Clear ();

View File

@ -95,23 +95,20 @@ StringList::GetStringAtIndex (size_t idx) const
return NULL;
}
const char *
StringList::Join (const char *separator)
void
StringList::Join (const char *separator, Stream &strm)
{
uint32_t size = GetSize();
if (size == 0)
return "";
if (size == 1)
return GetStringAtIndex(0);
std::string buf;
return;
for (uint32_t i = 0; i < size; ++i)
{
if (i > 0)
buf.append(separator);
buf.append(GetStringAtIndex(i));
strm.PutCString(separator);
strm.PutCString(GetStringAtIndex(i));
}
return buf.c_str();;
}
void

View File

@ -849,12 +849,15 @@ CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType
static
const char *arch_helper()
{
StringList archs;
ArchSpec::AutoComplete(NULL, archs);
StreamString ss;
ss.Printf("These are the supported architecture names:\n");
ss.Printf("%s\n", archs.Join("\n"));
return ss.GetData();
static StreamString g_archs_help;
if (g_archs_help.GetData() == NULL)
{
StringList archs;
ArchSpec::AutoComplete(NULL, archs);
g_archs_help.Printf("These are the supported architecture names:\n");
archs.Join("%s\n", g_archs_help);
}
return g_archs_help.GetData();
}
CommandObject::ArgumentTableEntry