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);