d-demangle.c (dlang_identifier): Check encoded length of identifier to verify strncmp...
authorIain Buclaw <ibuclaw@gdcproject.org>
Sat, 16 May 2015 16:49:46 +0000 (16:49 +0000)
committerIain Buclaw <ibuclaw@gcc.gnu.org>
Sat, 16 May 2015 16:49:46 +0000 (16:49 +0000)
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

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

index 3eac5226392fec18bb6021922de1a00d09ae6767..37425c8df81ffcac80e1896df3df86d29204735e 100644 (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.
index 98e81606b586c3e8b3f34613782b60d947e38529..011e62bc6620d2a4f662763bff15f59209a6250f 100644 (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);
index 80445066e7253eda40858b337998a1d6ad51a75e..b0b9ca0b49d6370accbe8ba756a215bb0dd9f6ea 100644 (file)
@@ -502,7 +502,7 @@ _D8demangle4test6__dtorMFZv
 demangle.test.~this()
 #
 --format=dlang
-_D8demangle4test6__postblitMFZv
+_D8demangle4test10__postblitMFZv
 demangle.test.this(this)
 #
 --format=dlang