Hi Mandy,

Thanks for taking another look.

On 6/3/20 2:07 PM, Mandy Chung wrote:


On 6/3/20 12:34 PM, Calvin Cheung wrote:

I saw David has commented on this. So I'll leave the assert as before and I've added another assert (see line 1691):

1687   // The following ensures that the caller's nest host is the same as the lambda proxy's
1688   // nest host recorded at dump time.
1689   assert(nest_host->has_nest_member(caller_ik, THREAD) ||
1690          nest_host == caller_ik, "caller_ik failed nest member check");


I don't think this assert is needed.  caller_ik can be a hidden class and so this assert is not correct then.
I've removed it.

Is there any issue to archive lambda proxy class whose caller is a hidden class?  Is there any assumption in the CDS implementation that the caller class is always a normal class?

I've added a check in JVM_RegisterLambdaProxyClassForArchiving. If the caller class is hidden or vm anonymous, it will return.

I also added 2 test cases to test the above. If the caller class is a hidden class, the test makes sure the corresponding lambda proxy class is not being archived. Currently, it doesn't seem possible to have a vm anonymous class to be the caller class of a lambda proxy class. I've added a test anyway so if things change later, we'll notice it.


1691   assert(nest_host == shared_nest_host, "mismatched nest host");


This is good.


In SystemDictionary::load_shared_lambda_proxy_class, it checks the flag:

1422   if (initialize) {
1423     loaded_ik->initialize(CHECK_NULL);
1424   }



I think JVM_LookupLambdaProxyClassFromArchive is a more appropriate place to link and initialize the class before return.   I expect load_shared_lambda_proxy_class does loading only and linking and initialization should be separate from loading.
Instead of putting the post loading code in the JVM_LookupLambdaProxyClassFromArchive function which would require changing some of the functions from private to public, I've renamed SystemDictionaryShared::load_shared_lambda_proxy_class to SystemDictionaryShared::prepare_shared_lambda_proxy class and moved the code there.

On a related note, in the existing jvm_lookup_define_class in jvm.cpp:

  if (init) {
    ik->initialize(CHECK_NULL);
  } else {
    ik->link_class(CHECK_NULL);
  }

I don't think the else is necessary as the ik->link_class(CHECK_NULL) has been done within the SystemDictionary::parse_stream.


Harold and Lois can chime in here.  I think ik->link_class may be for unsafe anonymous class to prepare for constant pool patching.

Currently, the strong vs weak hidden class isn't recorded in the archive.

:

-----

For now, I've added an assert in JVM_RegisterLambdaProxyClassForArchiving to make sure the hidden class is strong so that when things changed later, we'll notice it.


An assert is good.


3752   if (invokedName == NULL || invokedType == NULL || methodType == NULL ||
3753       implMethodMember == NULL || instantiatedMethodType == NULL) {
3754     return NULL;
3755   }


Should this throw NPE instead?
I've made the change.

Updated webrevs:

inc: http://cr.openjdk.java.net/~ccheung/jdk15/8198698/webrev_delta.02/

full: http://cr.openjdk.java.net/~ccheung/jdk15/8198698/webrev.02/

thanks,

Calvin

Reply via email to