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

Coleen Phillimore coleen.phillimore at oracle.com
Tue Oct 14 13:45:14 UTC 2014


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