From: nicola Date: Mon, 29 Nov 2010 02:17:24 +0000 (+0000) Subject: In gcc/objc/: X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9aa91c6c0fb917a6fb87b95770599bd856cc2123;p=thirdparty%2Fgcc.git In gcc/objc/: 2010-11-29 Nicola Pero * 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 --- diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index 1ebff02f1cac..ca2833c88007 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-29 Nicola Pero + + * 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 Implemented optional properties. diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 70056d394306..09f4e6f2d1a9 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -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] == '_')