Request for review: 8000797: NPG: is_pseudo_string_at() doesn't work

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Thu Feb 21 11:16:25 PST 2013


On 2/20/13 11:59 AM, Coleen Phillimore wrote:
> On 2/20/2013 2:51 PM, John Rose wrote:
>> On Feb 20, 2013, at 10:20 AM, Coleen Phillimore 
>> <coleen.phillimore at oracle.com <mailto:coleen.phillimore at oracle.com>> 
>> wrote:
>>
>>> Summary: Add JVM_CONSTANT_PseudoString in place of 
>>> JVM_CONSTANT_Object and use this tag to distinguish patched pseudo 
>>> strings. The original string is retained if it was present.
>>
>> This is reasonable; it is a good cleanup.  If you can propose a name 
>> better than "PseudoString" I'm all ears.
>
> If the string is really meaningless, maybe it can be deleted and we 
> don't need this JVM_CONSTANT_PseudoString.  The only reason I kept 
> "String" in the name is because I thought the string would have some 
> meaning to be preserved.
>
>>
>> Consider getting rid of set_has_pseudo_string.  That flag was present 
>> (IIRC) only to tell the GC that there might be non-perm oops in the 
>> constant pool.  Do we still need that?
>
> I'd be happy to.  I noticed it wasn't being used.   Neither is 
> _has_invokedynamic for that matter.   _has_preresolution does do 
> something.
>>
>>> I'm not sure how class file reconstitution for pseudo-strings is 
>>> going to work, but I thought it was prudent to leave the Symbol* in 
>>> the slot for the patched string.
>>
>> If you really wanted to reconstitute a class file for an anonymous 
>> class, and if that class has oop patching (pseudo-strings), you would 
>> need either to (a) reconstitute the patches array handed to 
>> Unsafe.defineAnonymousClass, or (b) accept whatever odd strings were 
>> there first, as an approximation.  The "odd strings" are totally 
>> insignificant, and are typically something like 
>> "CONSTANT_PLACEHOLDER_42" (see 
>> InvokerBytecodeGenerator::constantPlaceholder).
>>
>
> Maybe there isn't a way or API to reconstitute an anonymous class.   I 
> don't know if there is.  I'm not sure how to reconstitute a normal 
> class in the first place.   Maybe Serguei can comment.   If this class 
> cannot be reconsitituted, I'll change this to remove the string in the 
> patched case and won't need JVM_CONSTANT_PseudoString (and the 
> constant for Object can be removed too).

Reconstitution of the ConstantPool is needed for both the JVMTI 
GetConstantPool() and RetransformClasses().
Finally, it goes to the ConstantPool::copy_cpool_bytes().

This is the place that has to be fixed:

ConstantPool.cpp:
int ConstantPool::copy_cpool_bytes(int cpool_size,
       . . .
       case JVM_CONSTANT_String: {
         *bytes = JVM_CONSTANT_String;
         Symbol* sym = unresolved_string_at(idx);
         idx1 = tbl->symbol_to_value(sym);
         assert(idx1 != 0, "Have not found a hashtable entry");
         Bytes::put_Java_u2((address) (bytes+1), idx1);
         DBG(char *str = sym->as_utf8());
         DBG(printf("JVM_CONSTANT_String: idx=#%03hd, %s", idx1, str));
         break;
       }

I think, the John's suggestion for odd strings should work here.
Something like:
   if (sym == NULL) {
     str = "CONSTANT_PLACEHOLDER_42";
   }

I will file a bug on this.


Thanks,
Serguei

>
> Thanks!
> Coleen
>
>> — John
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/attachments/20130221/b0da3b53/attachment-0001.html 


More information about the hotspot-runtime-dev mailing list