This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch for demangling Java identifiers which are C++ keywords

When the current Java compiler mangles a name which happens to be a
C++ keyword, it adds a '$' after the identifier.  However, that '$' is
not counted in the identifier length in the mangled name.  So the
demangler needs to handle it specially.  This patch permits the
demangler to demangle this sort of name.

As a side note, my guess is that adding the '$' is intended to make it
possible for Java routines to be implemented in C++.  The C++ code
would simply append a '$' to the keyword, in order to be able to use
it in C++.  Unfortunately, this won't work, because the C++ mangler
will count the '$' in the identifier length, unlike the Java mangler.
So if my guess about the intention is correct, then this is actually a
bug in the Java mangler.  If the Java mangler is fixed to count the
'$' in the identifier length, then the patch below will only be needed
for older code.  It will do no harm for newer code, except that in
extremely unusual situations it will demangle a symbol name which is
not actually a mangled name.

I am about to check in this patch.


2003-12-20  Ian Lance Taylor  <>

	* cp-demangle.c (d_identifier): In Java mode, skip an optional '$'
	after the identifier.
	* testsuite/demangle-expected: Add test case.

Index: cp-demangle.c
RCS file: /cvs/gcc/gcc/libiberty/cp-demangle.c,v
retrieving revision 1.61
diff -u -p -r1.61 cp-demangle.c
--- cp-demangle.c	19 Dec 2003 21:14:34 -0000	1.61
+++ cp-demangle.c	20 Dec 2003 15:46:07 -0000
@@ -1341,6 +1341,13 @@ d_identifier (di, len)
   name = d_str (di);
   d_advance (di, len);
+  /* A Java mangled name may have a trailing '$' if it is a C++
+     keyword.  This '$' is not included in the length count.  We just
+     ignore the '$'.  */
+  if ((di->options & DMGL_JAVA) != 0
+      && d_peek_char (di) == '$')
+    d_advance (di, 1);
   /* Look for something which looks like a gcc encoding of an
      anonymous namespace, and replace it with a more user friendly
      name.  */
Index: testsuite/demangle-expected
RCS file: /cvs/gcc/gcc/libiberty/testsuite/demangle-expected,v
retrieving revision 1.25
diff -u -p -r1.25 demangle-expected
--- testsuite/demangle-expected	19 Dec 2003 21:14:35 -0000	1.25
+++ testsuite/demangle-expected	20 Dec 2003 15:46:07 -0000
@@ -2591,6 +2591,10 @@ Prim.i(int, boolean, byte, double, float

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]