On 10/23/2014 02:54 AM, Mandy Chung wrote:

On 10/22/2014 4:58 PM, Claes Redestad wrote:


This test uses a special class loader that delegates to null class loader only. Since you have the verification in place, it'd be good to also call Package.getPackage and Package.getPackages to verify that the same "package2" instance is returned. As a sanity check, you could check "java.lang" package must be present.

I've added some sanity checks as suggested. Sadly, it seems that since the application classloader will define and load package2 first in this test, there'll always be a Package defined in the ClassLoader.pkgs that will mask the Package instance in Package.pkgs when retrieved via the public methods in Package.

Can you remove package2/Class2.class after you create the jar files?

Sorry for the confusion. I realized I did some of my test development on an unpatched JDK and got caught up in a subtle issue. Prior to the changes proposed, calling into Package.getSystemPackages() actually created new Package objects on each call(!!), breaking the assumption that only one Package object will ever be defined.

The proposed patch ensures we don't create new objects and that only one Package object can ever be created for a system package. This bug(?) was partially hidden by the fact that calling Package.getPackage() cached Package objects in the ClassLoader package maps, thus subsequent calls to Package.getPackages() would provide identical objects on subsequent calls. I've updated the test to verify Package identity (which it fails to do on an unpatched JDK).


If JDK-8061804 is resolved, we could change to check for identity in the Package.getPackages() case, which would improve the specificness of the test... For now, perhaps we could trick things in this test and put our dummy class into java.lang in our test here and ensure that the package retrieved is identical. Worth the hassle?

What I meant is to check if the returned Package contains "java.lang" package that always exists in the system packages. You don't need to put a dummy class in java.lang to get "java.lang" Package since it must be defined in the running VM. e.g. you can refactor line 169-176 to a findPackage method that returns Package matching the given package name such that in line 164 you can call findPackage("java.lang") that should return non-null.


http://cr.openjdk.java.net/~redestad/8060130/webrev.10

/Claes

Reply via email to