[cp-patches] FYI: Fix naming of bridge targets in gjavah
Andrew John Hughes
gnu_andrew at member.fsf.org
Tue Sep 2 21:59:57 UTC 2008
For CNI headers, gjavah generates the name of bridge methods
by appending the name of the class and a "$" to the method name.
These are stored in methodNameMap, which is created as the union
of the entries for the class and all superclasses.
However, the current implementation doesn't populate methodNameMap
in printVtable so the methodNameMap received from the superclass
by the child class is always empty, and thus bridge methods from
the parent classes are only generated during printing against the
current class and are named wrongly.
This patch corrects this behaviour.
ChangeLog:
2008-09-02 Andrew John Hughes <gnu_andrew at member.fsf.org>
* tools/gnu/classpath/tools/javah/ClassWrapper.java:
(makeVtable()): Populate methodNameMap.
(printMethods(CniPrintStream)): Always use pre-populated
methodNameMap for bridge targets.
--
Andrew :)
Support Free Java!
Contribute to GNU Classpath and the OpenJDK
http://www.gnu.org/software/classpath
http://openjdk.java.net
PGP Key: 94EFD9D8 (http://subkeys.pgp.net)
Fingerprint = F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8
-------------- next part --------------
Index: tools/gnu/classpath/tools/javah/ClassWrapper.java
===================================================================
RCS file: /sources/classpath/classpath/tools/gnu/classpath/tools/javah/ClassWrapper.java,v
retrieving revision 1.3
diff -u -u -r1.3 ClassWrapper.java
--- tools/gnu/classpath/tools/javah/ClassWrapper.java 19 Apr 2007 00:14:15 -0000 1.3
+++ tools/gnu/classpath/tools/javah/ClassWrapper.java 2 Sep 2008 21:46:57 -0000
@@ -217,7 +217,18 @@
MethodNode m = (MethodNode) i.next();
String desc = MethodHelper.getBridgeTarget(m);
if (desc != null)
- bridgeTargets.add(m.name + desc);
+ {
+ String sum = m.name + desc;
+ boolean newTarget = bridgeTargets.add(sum);
+ if (newTarget)
+ {
+ // Bridge target that is new in this class.
+ String cname = this.name;
+ int index = cname.lastIndexOf('/');
+ cname = cname.substring(index + 1);
+ methodNameMap.put(sum, cname + "$" + m.name);
+ }
+ }
}
}
@@ -247,18 +258,7 @@
String nameToUse;
String sum = m.name + m.desc;
if (bridgeTargets.contains(sum))
- {
- if (methodNameMap.containsKey(sum))
- nameToUse = (String) methodNameMap.get(sum);
- else
- {
- // Bridge target that is new in this class.
- String cname = this.name;
- int index = cname.lastIndexOf('/');
- cname = cname.substring(index + 1);
- nameToUse = cname + "$" + m.name;
- }
- }
+ nameToUse = (String) methodNameMap.get(sum);
else
nameToUse = Keywords.getCxxName(m.name);
methodNameMap.put(sum, nameToUse);
More information about the Classpath-patches
mailing list