RFR (L) 8174749: Use hash table/oops for MemberName table

coleen.phillimore at oracle.com coleen.phillimore at oracle.com
Fri May 26 17:47:19 UTC 2017


Hi, I made the changes below, which turned out very nice.  It didn't 
take that long to retest.  See:

open webrev at http://cr.openjdk.java.net/~coleenp/8174749.04/webrev
open webrev at http://cr.openjdk.java.net/~coleenp/8174749.jdk.04/webrev

I don't know how to do delta webrevs, so just look at 
linkResolver.cpp/hpp and methodHandles.cpp

Thanks,
Coleen

On 5/26/17 9:37 AM, coleen.phillimore at oracle.com wrote:
>
> Hi John,
> Thank you for these comments and for your help with this bug fix/RFE.
>
> On 5/25/17 8:04 PM, John Rose wrote:
>> On May 17, 2017, at 9:01 AM, coleen.phillimore at oracle.com 
>> <mailto:coleen.phillimore at oracle.com> wrote:
>>>
>>> Summary: Add a Java type called ResolvedMethodName which is 
>>> immutable and can be stored in a hashtable, that is weakly collected 
>>> by gc
>>
>> I'm looking at the 8174749.03/webrev version of your changes.
>>
>> A few comments:
>>
>> In the JVMCI changes, this line appears to be incorrect on 32-bit 
>> machines:
>>
>> +                vmtargetField = (HotSpotResolvedJavaField) 
>> findFieldInClass(methodType, "vmtarget", resolveType(long.class));
>>
>> (It's a pre-existing condition, and I'm not sure if it is a problem.)
>
> I'll add a comment. I don't know if Graal supports 32 bits (I'd guess 
> no).
>>
>> In the new hash table file, the parameter names
>> seem like they could be made more consistent.
>>
>>   85 oop ResolvedMethodTable::basic_add(Method* method, oop vmtarget) {
>>
>>  114 oop ResolvedMethodTable::add_method(Handle mem_name_target) {
>>
>> I think vmtarget and mem_name_target are the same kind of thing.
>> Consider renaming them to "entry_to_add" or something more aligned
>> with the rest of the code.
>
> This code didn't get updated properly from all the renaming.  I've 
> changed to using "method" when the parameter is Method* and using 
> rmethod_name when the parameter is an oop representing 
> ResolvedMethodName.
>
>>
>> I don't think that MethodHandles::init_field_MemberName needs TRAPS.
>
> Yes, removed TRAPS and reverted the use of the default parameter.
>> Also, MethodHandles::init_method_MemberName could omit TRAPS if
>> it were passed the RMN pointer first.  Suggestion:  Remove TRAPS from
>> both *and* add a trapping function which does the info->RMN step.
>>
>>   static oop init_method_MemberName(Handle mname_h, CallInfo& info, 
>> oop resolved_method);
>>   static oop init_method_MemberName(Handle mname_h, CallInfo& info, 
>> TRAPS);
>>
>> Then the trapping overloading can pick up the RMN immediately from 
>> the info,
>> and call the non-trapping overloading.  The reason to do something 
>> indirect
>> like this is that the existing code for init_method_MemberName is (a) 
>> complex
>> and (b) non-trapping.  Promoting it all to trapping makes it harder 
>> to work with.
>>
>> In other words, non-TRAPS code is (IMO) easier to read and reason about,
>> so converting a big method to TRAPS for one line is something I'd 
>> like to
>> avoid.  At least, that's the way I thought about this particular code 
>> when
>> I first wrote it.
>>
>> Better:  Since init_m_MN is joined at the hip with CallInfo, consider 
>> adding the
>> trapping operation to CallInfo.  See patch below.  I think that 
>> preserves CI's
>> claim to be the Source of Truth for call sites, even in 
>> methodHandles.cpp.
>>
>
> This is quite a nice change!   I'll do this and rerun the tests over 
> the weekend and send out a new version next week.
>
>> Thank you very much for this fix.  I know it's been years since we 
>> started
>> talking about it.  I'm glad you let it bother you enough to fix it!
>
> We kept running into this, so it was time.
>
>>
>> I looked at everything else and didn't find anything out of place.
>
> Thank you!
> Coleen
>
>>
>> Reviewed.
>>
>> — John
>>
>> diff --git a/src/share/vm/interpreter/linkResolver.hpp 
>> b/src/share/vm/interpreter/linkResolver.hpp
>> --- a/src/share/vm/interpreter/linkResolver.hpp
>> +++ b/src/share/vm/interpreter/linkResolver.hpp
>> @@ -56,6 +56,7 @@
>>    int          _call_index;             // vtable or itable index of 
>> selected class method (if any)
>>    Handle       _resolved_appendix;      // extra argument in 
>> constant pool (if CPCE::has_appendix)
>>    Handle       _resolved_method_type;   // MethodType (for 
>> invokedynamic and invokehandle call sites)
>> +  Handle       _resolved_method_name;   // optional 
>> ResolvedMethodName object for java.lang.invoke
>>    void set_static(KlassHandle resolved_klass, const methodHandle& 
>> resolved_method, TRAPS);
>>    void set_interface(KlassHandle resolved_klass, KlassHandle 
>> selected_klass,
>> @@ -97,6 +98,7 @@
>>    methodHandle selected_method() const       { return 
>> _selected_method; }
>>    Handle       resolved_appendix() const       { return 
>> _resolved_appendix; }
>>    Handle       resolved_method_type() const      { return 
>> _resolved_method_type; }
>> +  Handle       resolved_method_name() const      { return 
>> _resolved_method_name; }
>>    BasicType    result_type() const       { return 
>> selected_method()->result_type(); }
>>    CallKind     call_kind() const       { return _call_kind; }
>> @@ -117,6 +119,12 @@
>>      return _call_index;
>>    }
>> +  oop find_resolved_method_name(TRAPS) {
>> +    if (_resolved_method_name.is_null())
>> + 
>>  java_lang_invoke_ResolvedMethodName::find_resolved_method(_resolved_method, 
>> CHECK_NULL);
>> +    return _resolved_method_name;
>> +  }
>> +
>>    // debugging
>>  #ifdef ASSERT
>>    bool         has_vtable_index() const      { return _call_index >= 
>> 0 && _call_kind != CallInfo::itable_call; }
>> diff --git a/src/share/vm/interpreter/linkResolver.hpp 
>> b/src/share/vm/interpreter/linkResolver.hpp
>> --- a/src/share/vm/interpreter/linkResolver.hpp
>> +++ b/src/share/vm/interpreter/linkResolver.hpp
>> @@ -56,6 +56,7 @@
>>    int          _call_index;             // vtable or itable index of 
>> selected class method (if any)
>>    Handle       _resolved_appendix;      // extra argument in 
>> constant pool (if CPCE::has_appendix)
>>    Handle       _resolved_method_type;   // MethodType (for 
>> invokedynamic and invokehandle call sites)
>> +  Handle       _resolved_method_name;   // optional 
>> ResolvedMethodName object for java.lang.invoke
>>    void set_static(KlassHandle resolved_klass, const methodHandle& 
>> resolved_method, TRAPS);
>>    void set_interface(KlassHandle resolved_klass, KlassHandle 
>> selected_klass,
>> @@ -97,6 +98,7 @@
>>    methodHandle selected_method() const       { return 
>> _selected_method; }
>>    Handle       resolved_appendix() const       { return 
>> _resolved_appendix; }
>>    Handle       resolved_method_type() const      { return 
>> _resolved_method_type; }
>> +  Handle       resolved_method_name() const      { return 
>> _resolved_method_name; }
>>    BasicType    result_type() const       { return 
>> selected_method()->result_type(); }
>>    CallKind     call_kind() const       { return _call_kind; }
>> @@ -117,6 +119,12 @@
>>      return _call_index;
>>    }
>> +  oop find_resolved_method_name(TRAPS) {
>> +    if (_resolved_method_name.is_null())
>> + 
>>  java_lang_invoke_ResolvedMethodName::find_resolved_method(_resolved_method, 
>> CHECK_NULL);
>> +    return _resolved_method_name;
>> +  }
>> +
>>    // debugging
>>  #ifdef ASSERT
>>    bool         has_vtable_index() const      { return _call_index >= 
>> 0 && _call_kind != CallInfo::itable_call; }
>>
>>
>>
>



More information about the hotspot-dev mailing list