Review Request: JDK-8173978: Lookup.in should allow teleporting from a lookup class in a named module without dropping all access

Peter Levart peter.levart at gmail.com
Fri Jul 5 15:24:57 UTC 2019


Hi Mandy,

On 7/2/19 7:20 PM, Mandy Chung wrote:
> Webrev updated:
> http://cr.openjdk.java.net/~mchung/jdk14/8173978/webrev.01/

I just skimmed across code and I think there's a little optimization 
possible in VerifyAccess:

  224             // cross-module access
  225             // 1. refc is in different module from lookupModule, or
  226             // 2. refc is in lookupModule and a different module 
from prevLookupModule
  227             Module prevLookupModule = prevLookupClass != null ? 
prevLookupClass.getModule()
  228                                                               : 
lookupModule;
  229             assert refModule != lookupModule || refModule != 
prevLookupModule;
  230             if (isModuleAccessible(refc, lookupModule, 
prevLookupModule))
  231                 return true;

...instead of seting prevLookupModule to lookupModule in case 
prevLookupClass is null (common case) causing double canRead and 
isExported checks against the same module in isModuleAccessible() (for 
positive outcome - the case where we want the check to be quick):

  250     public static boolean isModuleAccessible(Class<?> refc,  
Module m1, Module m2) {
  251         Module refModule = refc.getModule();
  252         assert refModule != m1 || refModule != m2;
  253         int mods = getClassModifiers(refc);
  254         if (isPublic(mods)) {
  255             if (m1.canRead(refModule) && m2.canRead(refModule)) {
  256                 String pn = refc.getPackageName();
  257
  258                 // refc is exported package to at least both m1 and m2
  259                 if (refModule.isExported(pn, m1) && 
refModule.isExported(pn, m2))
  260                     return true;
  261             }
  262         }
  263         return false;
  264     }


...you could set prevLookupModule to null if prevLookupClass is null:

             Module prevLookupModule = prevLookupClass != null
                                                               ? 
prevLookupClass.getModule()
                                                               : null;

...and then check against null in isModuleAccessible():

     public static boolean isModuleAccessible(Class<?> refc, Module m1, 
Module m2) {
         Module refModule = refc.getModule();
         assert refModule != m1 || refModule != m2;
         int mods = getClassModifiers(refc);
         if (isPublic(mods)) {
             if (m1.canRead(refModule) && (m2 == null || 
m2.canRead(refModule))) {
                 String pn = refc.getPackageName();

                 // refc is exported package to at least both m1 and m2
                 if (refModule.isExported(pn, m1) && (m2 == null || 
refModule.isExported(pn, m2)))
                     return true;
             }
         }
         return false;
     }


I think this would be faster since canRead and isExported are not trivial...

Regards, Peter



More information about the core-libs-dev mailing list