Mercurial > hg > graal-jvmci-8
comparison src/share/vm/prims/methodHandles.cpp @ 10345:b7fa10a3a69a
8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
Summary: The fix of perf regression is to use method_idnum() for direct indexing into NMT
Reviewed-by: twisti, kvn, coleenp, dholmes
Contributed-by: serguei.spitsyn@oracle.com
author | sspitsyn |
---|---|
date | Thu, 23 May 2013 23:04:33 -0700 |
parents | e484fe2abebd |
children | 6ff467cdb105 c1bd7b5bdc70 |
comparison
equal
deleted
inserted
replaced
10344:699d9df07e59 | 10345:b7fa10a3a69a |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
230 // root to help keep alive the Method*. | 230 // root to help keep alive the Method*. |
231 // If relevant, the vtable or itable value is stored as vmindex. | 231 // If relevant, the vtable or itable value is stored as vmindex. |
232 // This is done eagerly, since it is readily available without | 232 // This is done eagerly, since it is readily available without |
233 // constructing any new objects. | 233 // constructing any new objects. |
234 // TO DO: maybe intern mname_oop | 234 // TO DO: maybe intern mname_oop |
235 m->method_holder()->add_member_name(mname); | 235 m->method_holder()->add_member_name(m->method_idnum(), mname); |
236 | |
236 return mname(); | 237 return mname(); |
237 } | 238 } |
238 | 239 |
239 Handle MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, TRAPS) { | 240 Handle MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, TRAPS) { |
240 Handle empty; | 241 Handle empty; |
299 // The base clazz and field offset (vmindex) must be eagerly stored, | 300 // The base clazz and field offset (vmindex) must be eagerly stored, |
300 // because they unambiguously identify the field. | 301 // because they unambiguously identify the field. |
301 // Although the fieldDescriptor::_index would also identify the field, | 302 // Although the fieldDescriptor::_index would also identify the field, |
302 // we do not use it, because it is harder to decode. | 303 // we do not use it, because it is harder to decode. |
303 // TO DO: maybe intern mname_oop | 304 // TO DO: maybe intern mname_oop |
304 InstanceKlass::cast(field_holder())->add_member_name(mname); | |
305 return mname(); | 305 return mname(); |
306 } | 306 } |
307 | 307 |
308 Handle MethodHandles::init_field_MemberName(Handle mname, FieldAccessInfo& info, TRAPS) { | 308 Handle MethodHandles::init_field_MemberName(Handle mname, FieldAccessInfo& info, TRAPS) { |
309 return Handle(); | 309 return Handle(); |
941 | 941 |
942 //------------------------------------------------------------------------------ | 942 //------------------------------------------------------------------------------ |
943 // MemberNameTable | 943 // MemberNameTable |
944 // | 944 // |
945 | 945 |
946 MemberNameTable::MemberNameTable() : GrowableArray<jweak>(10, true) { | 946 MemberNameTable::MemberNameTable(int methods_cnt) |
947 : GrowableArray<jweak>(methods_cnt, true) { | |
947 assert_locked_or_safepoint(MemberNameTable_lock); | 948 assert_locked_or_safepoint(MemberNameTable_lock); |
948 } | 949 } |
949 | 950 |
950 MemberNameTable::~MemberNameTable() { | 951 MemberNameTable::~MemberNameTable() { |
951 assert_locked_or_safepoint(MemberNameTable_lock); | 952 assert_locked_or_safepoint(MemberNameTable_lock); |
955 jweak ref = this->at(idx); | 956 jweak ref = this->at(idx); |
956 JNIHandles::destroy_weak_global(ref); | 957 JNIHandles::destroy_weak_global(ref); |
957 } | 958 } |
958 } | 959 } |
959 | 960 |
960 // Return entry index if found, return -1 otherwise. | 961 void MemberNameTable::add_member_name(int index, jweak mem_name_wref) { |
961 int MemberNameTable::find_member_name(oop mem_name) { | |
962 assert_locked_or_safepoint(MemberNameTable_lock); | 962 assert_locked_or_safepoint(MemberNameTable_lock); |
963 int len = this->length(); | 963 this->at_put_grow(index, mem_name_wref); |
964 | 964 } |
965 for (int idx = 0; idx < len; idx++) { | 965 |
966 jweak ref = this->at(idx); | 966 // Return a member name oop or NULL. |
967 oop entry = JNIHandles::resolve(ref); | 967 oop MemberNameTable::get_member_name(int index) { |
968 if (entry == mem_name) { | |
969 return idx; | |
970 } | |
971 } | |
972 return -1; | |
973 } | |
974 | |
975 void MemberNameTable::add_member_name(jweak mem_name_wref) { | |
976 assert_locked_or_safepoint(MemberNameTable_lock); | 968 assert_locked_or_safepoint(MemberNameTable_lock); |
977 oop mem_name = JNIHandles::resolve(mem_name_wref); | 969 |
978 | 970 jweak ref = this->at(index); |
979 // Each member name may appear just once: add only if not found | 971 oop mem_name = JNIHandles::resolve(ref); |
980 if (find_member_name(mem_name) == -1) { | 972 return mem_name; |
981 this->append(mem_name_wref); | |
982 } | |
983 } | 973 } |
984 | 974 |
985 #if INCLUDE_JVMTI | 975 #if INCLUDE_JVMTI |
986 oop MemberNameTable::find_member_name_by_method(Method* old_method) { | 976 oop MemberNameTable::find_member_name_by_method(Method* old_method) { |
987 assert_locked_or_safepoint(MemberNameTable_lock); | 977 assert_locked_or_safepoint(MemberNameTable_lock); |