d-demangle.c (dlang_parse_string): Represent embedded whitespace or non-printable...
authorIain Buclaw <ibuclaw@gdcproject.org>
Sat, 16 May 2015 16:49:13 +0000 (16:49 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Sat, 16 May 2015 16:49:13 +0000 (16:49 +0000)
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

libiberty/ChangeLog
libiberty/d-demangle.c
libiberty/testsuite/d-demangle-expected

index 30da962795a68c3a6d87cdfdf6627275a7088acf..3d86a0edd3a9dcc94ec1ebd9e7d0126c9a34bb6c 100644 (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
index bb481c0998e851b6c3fe6ad7610e00c92a0ea658..10585214a9f69694defa16aa624857cf831e6b31 100644 (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;
index 2aeacb8389fdfebe6365d69cc89edf53eeb4621c..b023f6d5d79ddd252bb56d15d94de9de3fafefea 100644 (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)