agent/src/share/classes/sun/jvm/hotspot/jdi/ReferenceTypeImpl.java

Print this page
rev 5684 : 4990369: visibleMethods() and methodsByName() return wrong visible methods
Reviewed-by:

*** 22,49 **** * */ package sun.jvm.hotspot.jdi; ! import java.io.*; ! ! import com.sun.jdi.*; import sun.jvm.hotspot.memory.SystemDictionary; import sun.jvm.hotspot.oops.Instance; import sun.jvm.hotspot.oops.InstanceKlass; - import sun.jvm.hotspot.oops.ArrayKlass; import sun.jvm.hotspot.oops.JVMDIClassStatus; import sun.jvm.hotspot.oops.Klass; - import sun.jvm.hotspot.oops.ObjArray; import sun.jvm.hotspot.oops.Oop; import sun.jvm.hotspot.oops.Symbol; - import sun.jvm.hotspot.oops.DefaultHeapVisitor; import sun.jvm.hotspot.utilities.Assert; ! import java.util.*; ! import java.lang.ref.SoftReference; public abstract class ReferenceTypeImpl extends TypeImpl implements ReferenceType { protected Klass saKlass; // This can be an InstanceKlass or an ArrayKlass protected Symbol typeNameSymbol; // This is used in vm.classesByName to speedup search --- 22,70 ---- * */ package sun.jvm.hotspot.jdi; ! import java.io.ByteArrayOutputStream; ! import java.io.IOException; ! import java.lang.ref.SoftReference; ! import java.util.ArrayList; ! import java.util.Collection; ! import java.util.Collections; ! import java.util.HashMap; ! import java.util.HashSet; ! import java.util.Iterator; ! import java.util.List; ! import java.util.Map; ! import java.util.Set; import sun.jvm.hotspot.memory.SystemDictionary; + import sun.jvm.hotspot.oops.ArrayKlass; + import sun.jvm.hotspot.oops.DefaultHeapVisitor; import sun.jvm.hotspot.oops.Instance; import sun.jvm.hotspot.oops.InstanceKlass; import sun.jvm.hotspot.oops.JVMDIClassStatus; import sun.jvm.hotspot.oops.Klass; import sun.jvm.hotspot.oops.Oop; import sun.jvm.hotspot.oops.Symbol; import sun.jvm.hotspot.utilities.Assert; ! import com.sun.jdi.AbsentInformationException; ! import com.sun.jdi.ArrayType; ! import com.sun.jdi.ClassLoaderReference; ! import com.sun.jdi.ClassNotLoadedException; ! import com.sun.jdi.ClassNotPreparedException; ! import com.sun.jdi.ClassObjectReference; ! import com.sun.jdi.Field; ! import com.sun.jdi.InterfaceType; ! import com.sun.jdi.Method; ! import com.sun.jdi.ObjectReference; ! import com.sun.jdi.PrimitiveType; ! import com.sun.jdi.ReferenceType; ! import com.sun.jdi.Type; ! import com.sun.jdi.Value; ! import com.sun.jdi.VirtualMachine; public abstract class ReferenceTypeImpl extends TypeImpl implements ReferenceType { protected Klass saKlass; // This can be an InstanceKlass or an ArrayKlass protected Symbol typeNameSymbol; // This is used in vm.classesByName to speedup search
*** 419,449 **** Method method = (Method)iter.next(); methodMap.put(method.name().concat(method.signature()), method); } } ! abstract void addVisibleMethods(Map methodMap); public final List visibleMethods() throws ClassNotPreparedException { checkPrepared(); /* * Build a collection of all visible methods. The hash * map allows us to do this efficiently by keying on the * concatenation of name and signature. */ //System.out.println("jj: RTI: Calling addVisibleMethods for:" + this); ! Map map = new HashMap(); ! addVisibleMethods(map); /* * ... but the hash map destroys order. Methods should be * returned in a sensible order, as they are in allMethods(). * So, start over with allMethods() and use the hash map * to filter that ordered collection. */ //System.out.println("jj: RTI: Calling allMethods for:" + this); ! List list = new ArrayList(allMethods()); //System.out.println("jj: allMethods = " + jjstr(list)); //System.out.println("jj: map = " + map.toString()); //System.out.println("jj: map = " + jjstr(map.values())); list.retainAll(map.values()); //System.out.println("jj: map = " + jjstr(list)); --- 440,471 ---- Method method = (Method)iter.next(); methodMap.put(method.name().concat(method.signature()), method); } } ! abstract void addVisibleMethods(Map<String, Method> methodMap, Set<InterfaceType> seenInterfaces); ! public final List visibleMethods() throws ClassNotPreparedException { checkPrepared(); /* * Build a collection of all visible methods. The hash * map allows us to do this efficiently by keying on the * concatenation of name and signature. */ //System.out.println("jj: RTI: Calling addVisibleMethods for:" + this); ! Map<String, Method> map = new HashMap<String, Method>(); ! addVisibleMethods(map, new HashSet<InterfaceType>()); /* * ... but the hash map destroys order. Methods should be * returned in a sensible order, as they are in allMethods(). * So, start over with allMethods() and use the hash map * to filter that ordered collection. */ //System.out.println("jj: RTI: Calling allMethods for:" + this); ! List<Method> list = new ArrayList<Method>(allMethods()); //System.out.println("jj: allMethods = " + jjstr(list)); //System.out.println("jj: map = " + map.toString()); //System.out.println("jj: map = " + jjstr(map.values())); list.retainAll(map.values()); //System.out.println("jj: map = " + jjstr(list));