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