RFR (L) : 8014013 : CallInfo structure no longer accurately reports the result of a LinkResolver operation

David Holmes david.holmes at oracle.com
Thu Aug 15 23:25:39 PDT 2013


On 16/08/2013 4:12 PM, John Rose wrote:
> On Aug 15, 2013, at 7:38 PM, Christian Thalinger
> <christian.thalinger at oracle.com <mailto:christian.thalinger at oracle.com>>
> wrote:
>
>> src/share/vm/runtime/fieldDescriptor.cpp:
>>
>> +   if (_cp.is <http://cp.is/>_null() || field_holder() != ik) {
>> +     _cp = constantPoolHandle(Thread::current(), ik->constants());
>> +     assert(field_holder() == ik, "must be already initialized to
>> this class");
>> +   }
>>
>> This assert cannot hold.
>
> The fd::initialize call resets a fd previously pointing at a different
> field to a new field.
> This requires a shift in the field_holder.
> The call to initialize is fieldStreams.hpp, where a fd embedded in the
> stream object gets reused for successive fields.
> So I think this assert measures something meaningful.

But the second part of the if condition is "field_holder() != ik" - so 
how does the call to constantPoolHandle force field_holder() to a value 
that isn't even passed to it ???

David
-----

> Perhaps the method should be named "reinitialize" or "reset" to
> emphasize the multiple use.
>
> — John


More information about the hotspot-compiler-dev mailing list