d-demangle.c (dlang_identifier): Check encoded length of identifier to verify strncmp matches entire string.

libiberty/ChangeLog:

2015-05-16  Iain Buclaw  <ibuclaw@gdcproject.org>

	* d-demangle.c (dlang_identifier): Check encoded length of identifier
	to verify strncmp matches entire string.
	* testsuite/d-demangle-expected: Fix wrong test for postblit symbol.

From-SVN: r223243
This commit is contained in:
Iain Buclaw 2015-05-16 16:49:46 +00:00 committed by Iain Buclaw
parent fa66ced4bf
commit 5cc158e9a9
3 changed files with 82 additions and 59 deletions

View File

@ -1,3 +1,9 @@
2015-05-16 Iain Buclaw <ibuclaw@gdcproject.org>
* d-demangle.c (dlang_identifier): Check encoded length of identifier
to verify strncmp matches entire string.
* testsuite/d-demangle-expected: Fix wrong test for postblit symbol.
2015-05-16 Iain Buclaw <ibuclaw@gdcproject.org>
* d-demangle.c (dlang_type_modifiers): New function.

View File

@ -672,65 +672,82 @@ dlang_identifier (string *decl, const char *mangled)
return NULL;
}
if (strncmp (mangled, "__ctor", i) == 0)
switch (i)
{
/* Constructor symbol for a class/struct. */
string_append (decl, "this");
mangled += i;
return mangled;
}
else if (strncmp (mangled, "__dtor", i) == 0)
{
/* Destructor symbol for a class/struct. */
string_append (decl, "~this");
mangled += i;
return mangled;
}
else if (strncmp (mangled, "__postblit", i) == 0)
{
/* Postblit symbol for a struct. */
string_append (decl, "this(this)");
mangled += i;
return mangled;
}
else if (strncmp (mangled, "__initZ", i+1) == 0)
{
/* The static initialiser for a given symbol. */
string_append (decl, "init$");
mangled += i + 1;
return mangled;
}
else if (strncmp (mangled, "__ClassZ", i+1) == 0)
{
/* The classinfo symbol for a given class. */
string_prepend (decl, "ClassInfo for ");
string_setlength (decl, string_length (decl) - 1);
mangled += i + 1;
return mangled;
}
else if (strncmp (mangled, "__vtblZ", i+1) == 0)
{
/* The vtable symbol for a given class. */
string_prepend (decl, "vtable for ");
string_setlength (decl, string_length (decl) - 1);
mangled += i + 1;
return mangled;
}
else if (strncmp (mangled, "__InterfaceZ", i+1) == 0)
{
/* The interface symbol for a given class. */
string_prepend (decl, "Interface for ");
string_setlength (decl, string_length (decl) - 1);
mangled += i + 1;
return mangled;
}
else if (strncmp (mangled, "__ModuleInfoZ", i+1) == 0)
{
/* The ModuleInfo symbol for a given module. */
string_prepend (decl, "ModuleInfo for ");
string_setlength (decl, string_length (decl) - 1);
mangled += i + 1;
return mangled;
case 6:
if (strncmp (mangled, "__ctor", i) == 0)
{
/* Constructor symbol for a class/struct. */
string_append (decl, "this");
mangled += i;
return mangled;
}
else if (strncmp (mangled, "__dtor", i) == 0)
{
/* Destructor symbol for a class/struct. */
string_append (decl, "~this");
mangled += i;
return mangled;
}
else if (strncmp (mangled, "__initZ", i+1) == 0)
{
/* The static initialiser for a given symbol. */
string_append (decl, "init$");
mangled += i;
return mangled;
}
else if (strncmp (mangled, "__vtblZ", i+1) == 0)
{
/* The vtable symbol for a given class. */
string_prepend (decl, "vtable for ");
string_setlength (decl, string_length (decl) - 1);
mangled += i;
return mangled;
}
break;
case 7:
if (strncmp (mangled, "__ClassZ", i+1) == 0)
{
/* The classinfo symbol for a given class. */
string_prepend (decl, "ClassInfo for ");
string_setlength (decl, string_length (decl) - 1);
mangled += i;
return mangled;
}
break;
case 10:
if (strncmp (mangled, "__postblitMFZ", i+3) == 0)
{
/* Postblit symbol for a struct. */
string_append (decl, "this(this)");
mangled += i + 3;
return mangled;
}
break;
case 11:
if (strncmp (mangled, "__InterfaceZ", i+1) == 0)
{
/* The interface symbol for a given class. */
string_prepend (decl, "Interface for ");
string_setlength (decl, string_length (decl) - 1);
mangled += i;
return mangled;
}
break;
case 12:
if (strncmp (mangled, "__ModuleInfoZ", i+1) == 0)
{
/* The ModuleInfo symbol for a given module. */
string_prepend (decl, "ModuleInfo for ");
string_setlength (decl, string_length (decl) - 1);
mangled += i;
return mangled;
}
break;
}
string_appendn (decl, mangled, i);

View File

@ -502,7 +502,7 @@ _D8demangle4test6__dtorMFZv
demangle.test.~this()
#
--format=dlang
_D8demangle4test6__postblitMFZv
_D8demangle4test10__postblitMFZv
demangle.test.this(this)
#
--format=dlang