* Regenerated headers with new gjavah.
libjava/classpath
	* 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.

From-SVN: r123965
This commit is contained in:
Tom Tromey
2007-04-19 00:24:09 +00:00
committed by Tom Tromey
parent 5604bf10dd
commit 06a4a50762
92 changed files with 220 additions and 186 deletions

View File

@@ -1,3 +1,12 @@
2007-04-18 Tom Tromey <tromey@redhat.com>
* 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.
2007-04-17 Andrew Haley <aph@redhat.com>
* gnu/java/rmi/server/UnicastConnectionManager.java

View File

@@ -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);
}
}

View File

@@ -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
{