]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
In gcc/objc/:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Nov 2010 02:17:24 +0000 (02:17 +0000)
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Nov 2010 02:17:24 +0000 (02:17 +0000)
2010-11-29  Nicola Pero  <nicola.pero@meta-innovation.com>

* objc-act.c (objc_demangle): Return immediately if the string is
too short.  Detect names that do not need demangling, and return
them unchanged.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167231 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/objc/ChangeLog
gcc/objc/objc-act.c

index 1ebff02f1cac7867fb5d1401aa3406d7870015f2..ca2833c88007b3c45684befaf84caebc7b945be5 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-29  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc-act.c (objc_demangle): Return immediately if the string is
+       too short.  Detect names that do not need demangling, and return
+       them unchanged.
+
 2010-11-27  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        Implemented optional properties.
index 70056d394306ee47990a1452b4fb6f82944f237c..09f4e6f2d1a9cfa770a0822a2f7fea8a65472b58 100644 (file)
@@ -12399,6 +12399,22 @@ objc_demangle (const char *mangled)
 {
   char *demangled, *cp;
 
+  /* First of all, if the name is too short it can't be an Objective-C
+     mangled method name.  */
+  if (mangled[0] == '\0' || mangled[1] == '\0' || mangled[2] == '\0')
+    return NULL;
+
+  /* If the name looks like an already demangled one, return it
+     unchanged.  This should only happen on Darwin, where method names
+     are mangled differently into a pretty-print form (such as
+     '+[NSObject class]', see darwin.h).  In that case, demangling is
+     a no-op, but we need to return the demangled name if it was an
+     ObjC one, and return NULL if not.  We should be safe as no C/C++
+     function can start with "-[" or "+[".  */
+  if ((mangled[0] == '-' || mangled[0] == '+')
+      && (mangled[1] == '['))
+    return mangled;
+
   if (mangled[0] == '_' &&
       (mangled[1] == 'i' || mangled[1] == 'c') &&
       mangled[2] == '_')