summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2007-04-19 00:14:14 +0000
committerTom Tromey <tromey@redhat.com>2007-04-19 00:14:14 +0000
commitbdb79238ac61cbdbd7b1ee9aef2f617740eb56a4 (patch)
tree4dbc5c507dbf47954ed6cfd0d560b3c65a47726d /tools
parent86871adbfb12697f5dd76c41ff509c57df713606 (diff)
downloadclasspath-bdb79238ac61cbdbd7b1ee9aef2f617740eb56a4.tar.gz
* tools/gnu/classpath/tools/javah/MethodHelper.java (print):
Changed arguments. Directly print method name. * tools/gnu/classpath/tools/javah/ClassWrapper.java (methodNameMap): New field. (makeVtable): Initialize it. (printMethods): Compute name for bridge targets.
Diffstat (limited to 'tools')
-rw-r--r--tools/gnu/classpath/tools/javah/ClassWrapper.java39
-rw-r--r--tools/gnu/classpath/tools/javah/MethodHelper.java14
2 files changed, 37 insertions, 16 deletions
diff --git a/tools/gnu/classpath/tools/javah/ClassWrapper.java b/tools/gnu/classpath/tools/javah/ClassWrapper.java
index e238065c2..2172628a6 100644
--- a/tools/gnu/classpath/tools/javah/ClassWrapper.java
+++ b/tools/gnu/classpath/tools/javah/ClassWrapper.java
@@ -1,5 +1,5 @@
/* ClassWrapper.java - wrap ASM class objects
- Copyright (C) 2006 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2007 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -43,6 +43,7 @@ import java.io.IOException;
import java.io.PrintStream;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -68,6 +69,11 @@ public class ClassWrapper
// A set of all the method names in this class.
HashSet methodNames = new HashSet();
+ // This maps a method name + descriptor, e.g. "method()V", to the
+ // name chosen for the method. This is used when computing the
+ // names of bridge method targets.
+ HashMap methodNameMap = new HashMap();
+
public ClassWrapper(Main classpath)
{
this.classpath = classpath;
@@ -187,18 +193,24 @@ public class ClassWrapper
superClass.makeVtable();
vtable = new ArrayList(superClass.vtable);
bridgeTargets = new HashSet(superClass.bridgeTargets);
+ methodNameMap = new HashMap(superClass.methodNameMap);
}
else
{
// Object.
vtable = new ArrayList();
bridgeTargets = new HashSet();
+ methodNameMap = new HashMap();
}
addLocalMethods();
addInterfaces(this);
- // Make a set of all the targets of bridge methods.
- // We rename bridge methods to avoid problems with C++.
+ // Make a set of all the targets of bridge methods. We rename
+ // bridge target methods to avoid problems with C++. You might
+ // think we could rename the bridge methods themselves, but bridge
+ // methods by definition override a method from the superclass --
+ // and we have to consider the superclass' header as an
+ // unchangeable entity.
Iterator i = methods.iterator();
while (i.hasNext())
{
@@ -232,8 +244,25 @@ public class ClassWrapper
while (i.hasNext())
{
MethodNode m = (MethodNode) i.next();
- boolean isTarget = bridgeTargets.contains(m.name + m.desc);
- MethodHelper.print(out, m, this, isTarget);
+ 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;
+ }
+ }
+ else
+ nameToUse = Keywords.getCxxName(m.name);
+ methodNameMap.put(sum, nameToUse);
+ MethodHelper.print(out, m, this, nameToUse);
}
}
diff --git a/tools/gnu/classpath/tools/javah/MethodHelper.java b/tools/gnu/classpath/tools/javah/MethodHelper.java
index 6657f115a..4359523ba 100644
--- a/tools/gnu/classpath/tools/javah/MethodHelper.java
+++ b/tools/gnu/classpath/tools/javah/MethodHelper.java
@@ -1,5 +1,5 @@
/* MethodHelper.java - helper class for manipulating methods
- Copyright (C) 2006 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2007 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -76,7 +76,7 @@ public class MethodHelper
}
public static void print(CniPrintStream out, MethodNode meth,
- ClassWrapper declarer, boolean isBridgeTarget)
+ ClassWrapper declarer, String realMethodName)
{
if ("<clinit>".equals(meth.name))
return;
@@ -97,15 +97,7 @@ public class MethodHelper
{
out.print(Type.getReturnType(meth.desc));
out.print(" ");
- if (isBridgeTarget)
- {
- out.print("target$");
- out.print(meth.name);
- }
- else
- {
- out.print(Keywords.getCxxName(meth.name));
- }
+ out.print(realMethodName);
}
else
{