RFR(M): 8057043: Type annotations not retained during class redefine / retransform

Andreas Eriksson andreas.eriksson at oracle.com
Wed Oct 15 11:20:56 UTC 2014


Great, thanks!

/Andreas

On 2014-10-14 15:45, Coleen Phillimore wrote:
>
> Andreas,  This is ok about the case numbers then.  I agree it's not 
> worth creating new enum type for them since they are all commented. 
> (sorry for top-posting but this is my only comment).
>
> You have my code review.  Thank you for adding this.
>
> Coleen
>
> On 10/13/14, 6:03 AM, Andreas Eriksson wrote:
>> Hi Coleen, thanks for looking at this!
>> See answers inline.
>>
>> On 2014-10-10 16:48, Coleen Phillimore wrote:
>>>
>>> Andreas,
>>> This is excellent work!  It looks really good.  Some comments.
>>>
>>> http://cr.openjdk.java.net/~aeriksso/8057043/webrev.00/src/share/vm/prims/jvmtiRedefineClasses.cpp.udiff.html 
>>>
>>>
>>> +  u1 target_type = type_annotations_typeArray->at(byte_i_ref);
>>> +  byte_i_ref += 1;
>>> +  RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("target_type=0x%.2x", 
>>> target_type));
>>> +  RC_TRACE_WITH_THREAD(0x02000000, THREAD, ("location=%s", 
>>> location_mesg));
>>> +
>>> +  // Skip over target_info
>>> +  switch (target_type) {
>>> +    case 0x00:
>>> +    // kind: type parameter declaration of generic class or interface
>>> +    // location: ClassFile
>>> +    case 0x01:
>>> +    // kind: type parameter declaration of generic method or 
>>> constructor
>>> +    // location: method_info
>>>
>>> Are there any #defines that make these numbers into some symbolic 
>>> values?
>>>
>>> These comments are good in case there aren't.
>>>
>>
>> Unfortunately, there are no #defines for these numbers that I could 
>> find.
>> I don't think creating symbolic names is worth it either, since the 
>> only unique way they are referred to in the VM spec is this verbose 
>> 'kind' field that I have included in the comments.
>> Location combined with target_info is unique for 0x00 to 0x17, but 
>> not for 0x40 and up. One could maybe create a define by combining 
>> location name, target_info name and parts of the kind text, but I'm 
>> not sure this would increase readability. I think having these 
>> comments is better.
>>
>>> + case 0x17:
>>> +    // kind: type in throws clause of method or constructor
>>> +    // location: method_info
>>>
>>>
>>> I can't find anything wrong.  I don't really understand the test 
>>> that well so hopefully someone that knows type annotations can look 
>>> at it also.   Maybe include lang tools and Joel and Eric?
>>>
>>
>> Joel has been looking at this review, and he gave me some feedback on 
>> the test offline. I'll rewrite parts of it and send out a new review 
>> when I'm done.
>>
>> Thanks,
>> Andreas
>>
>>> This code is needed because we don't replace the InstanceKlass when 
>>> redefining classes and rewrite the constant pool.  If we were able 
>>> to replace the InstanceKlass instead, we wouldn't need to do all 
>>> this work. We're evaluating this at the moment, but have no real 
>>> progress, so thank you for fixing this!
>>>
>>> Thanks,
>>> Coleen
>>>
>>> On 10/9/14, 9:21 AM, Andreas Eriksson wrote:
>>>> Hi all,
>>>>
>>>> Please review this patch to RedefineClasses to allow type 
>>>> annotations to be preserved.
>>>>
>>>> Summary:
>>>> During redefine / retransform class the constant pool indexes can 
>>>> change.
>>>> Since annotations have indexes into the constant pool these indexes 
>>>> need to be rewritten.
>>>> This is already done for regular annotations, but not for type 
>>>> annotations.
>>>> This patch adds code to add this rewriting for the type annotations 
>>>> as well.
>>>> The patch also contains minor changes to ClassFileReconstituter, to 
>>>> make sure that type annotations are preserved during a redefine / 
>>>> retransform class operation.
>>>> It also has a test that uses asm to change constant pool indexes 
>>>> through a retransform, and then verifies that type annotations are 
>>>> preserved.
>>>>
>>>> Detail:
>>>> A type annotation struct consists of some target information and a 
>>>> type path, followed by a regular annotation struct.
>>>> Constant pool indexes are only present in the regular annotation 
>>>> struct.
>>>> The added code skips over the type annotation specific parts, then 
>>>> calls previously existing code to rewrite constant pool indexes in 
>>>> the regular annotation struct.
>>>> Please see the Java SE 8 Ed. VM Spec. section 4.7.20 for more info 
>>>> about the type annotation struct.
>>>>
>>>> JPRT with the new test passes without failures on all platforms.
>>>>
>>>> Webrev:
>>>> http://cr.openjdk.java.net/~aeriksso/8057043/webrev.00/
>>>>
>>>> Bug:
>>>> https://bugs.openjdk.java.net/browse/JDK-8057043
>>>>
>>>> Regards
>>>> Andreas
>>>
>>
>



More information about the hotspot-dev mailing list