d-demangle.c (dlang_parse_string): Represent embedded whitespace or non-printable characters as hex or escape...

libiberty/ChangeLog:

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

	* d-demangle.c (dlang_parse_string): Represent embedded whitespace or
	non-printable characters as hex or escape sequences.
	* testsuite/d-demangle-expected: Add test for templates with tabs and
	newlines embedded into the signature.

From-SVN: r223240
This commit is contained in:
Iain Buclaw 2015-05-16 16:49:13 +00:00 committed by Iain Buclaw
parent 886faf50c7
commit eb058b7de6
3 changed files with 44 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2015-05-16 Iain Buclaw <ibuclaw@gdcproject.org>
* d-demangle.c (dlang_parse_string): Represent embedded whitespace or
non-printable characters as hex or escape sequences.
* testsuite/d-demangle-expected: Add test for templates with tabs and
newlines embedded into the signature.
2015-05-08 Joel Brobecker <brobecker@adacore.com>
* mkstemps.c: #include <time.h> if HAVE_TIME_H is defined

View File

@ -1,5 +1,5 @@
/* Demangler for the D programming language
Copyright 2014 Free Software Foundation, Inc.
Copyright 2014, 2015 Free Software Foundation, Inc.
Written by Iain Buclaw (ibuclaw@gdcproject.org)
This file is part of the libiberty library.
@ -931,7 +931,38 @@ dlang_parse_string (string *decl, const char *mangled)
char a = ascii2hex (mangled[0]);
char b = ascii2hex (mangled[1]);
char val = (a << 4) | b;
string_appendn (decl, &val, 1);
/* Sanitize white and non-printable characters. */
switch (val)
{
case ' ':
string_append (decl, " ");
break;
case '\t':
string_append (decl, "\\t");
break;
case '\n':
string_append (decl, "\\n");
break;
case '\r':
string_append (decl, "\\r");
break;
case '\f':
string_append (decl, "\\f");
break;
case '\v':
string_append (decl, "\\v");
break;
default:
if (ISPRINT (val))
string_appendn (decl, &val, 1);
else
{
string_append (decl, "\\x");
string_appendn (decl, mangled, 2);
}
}
}
else
return NULL;

View File

@ -934,3 +934,7 @@ serenity.persister.Sqlite.SqlitePersister!(serenity.persister.Sqlite.__unittest6
--format=dlang
_D4test4mainFZv5localMFZi
test.main().local()
#
--format=dlang
_D3std6socket12InternetHost221__T13getHostNoSyncVAyaa96_0a09202020206175746f2078203d2068746f6e6c28706172616d293b0a09202020206175746f206865203d20676574686f73746279616464722826782c20342c206361737428696e74294164647265737346616d696c792e494e4554293b0a09TkZ13getHostNoSyncMFkZb
std.socket.InternetHost.getHostNoSync!("\n\t auto x = htonl(param);\n\t auto he = gethostbyaddr(&x, 4, cast(int)AddressFamily.INET);\n\t", uint).getHostNoSync(uint)