hotspot/src/share/vm/prims/methodHandles.cpp
changeset 17828 17131ab4b3b5
parent 17388 8193ee82efbe
child 18508 3b95160639d8
equal deleted inserted replaced
17827:de9b8cf69309 17828:17131ab4b3b5
     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);