Hi Mandy,

On 10/17/2016 10:52 PM, Mandy Chung wrote:
On Oct 16, 2016, at 11:18 AM, Peter Levart <peter.lev...@gmail.com> wrote:


I think specifying both is more verbose on one hand, but OTOH it allows one to 
visually inspect all the cases and think of each and every one in isolation to 
see if it is valid in a particular caller/member/target arrangement. The test 
infrastructure verifies that the test case covers all the MemberFactory(s) so 
one must only verify each individual allowed / denied MemberFactory.
I understand the intention there.  But when each test case enumerates 20 
constants, it’s getting harder to review what’s going on and catch any issue.

It now enumerates only 12 constants and I think it's quite the opposite. Take the following for example. If only the allowed members were listed:

         ok &= new Test()
.current("b.PublicSub").member("a.PublicSuper").target("b.PublicSub")
.allowed(PROTECTED_INSTANCE_F_M, PUBLIC_INSTANCE_F_M, PROTECTED_STATIC_F_M,
                      PUBLIC_STATIC_F_M, PUBLIC_C)
             .perform();

...you would review the members that are allowed and then you should ask yourself: "Which are the ones that are denied? All the rest. What are they?", or: "Could there be any other that should be allowed? Which one?"

It's much easier if they are explicitly listed:

         ok &= new Test()
.current("b.PublicSub").member("a.PublicSuper").target("b.PublicSub")
.allowed(PROTECTED_INSTANCE_F_M, PUBLIC_INSTANCE_F_M, PROTECTED_STATIC_F_M,
                      PUBLIC_STATIC_F_M, PUBLIC_C)
.denied (PRIVATE_INSTANCE_F_M, PACKAGE_INSTANCE_F_M, PRIVATE_STATIC_F_M,
                      PACKAGE_STATIC_F_M, PRIVATE_C, PACKAGE_C,
                      PROTECTED_C)
             .perform();


And besides, you don't really have to review them all. The fact that running the test on unpatched JDK 9 finds just two differences:

- access to protected static method from subclass in another package
- access to protected static field from subclass in another package

...is a reassurance that the patch does exactly what it should. No less, no more.

    Builder::allowAll and Builder::denyAll would be useful.  allowAccessMember 
of a specific modifier can imply both field and method.
This is a good idea. Here's a modified test (no changes to patched files, just 
tests):

http://cr.openjdk.java.net/~plevart/jdk9-dev/6378384_Reflection.ensureAccess/webrev.03/
I like these grouping and it does help.  One more nit: would be good to replace 
the class name strings with constant variables.  I don’t need a new webrev.

Then I would have to have a mapping from class name -> constant name for the generator. Besides, constant names would not be any prettier than class name string literals. At least now it is obvious to anyone what package a particular class belongs to:

    "a.Package" vs. A_PACKAGE ?

Note that I can't use a.Package.class literal(s) here (thought I would like to) as they don't compile if they refer to a package-private class from another package.

I would like to keep those things unchanged, If you don't mind.

thanks
Mandy

Regards, Peter

Reply via email to