2007-12-01 00:00:00 +00:00
/*
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
* Copyright ( c ) 1997 , 2012 , Oracle and / or its affiliates . All rights reserved .
2007-12-01 00:00:00 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
*
* This code is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 only , as
* published by the Free Software Foundation .
*
* This code is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* version 2 for more details ( a copy is included in the LICENSE file that
* accompanied this code ) .
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work ; if not , write to the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA .
*
2010-05-27 19:08:38 -07:00
* Please contact Oracle , 500 Oracle Parkway , Redwood Shores , CA 94065 USA
* or visit www . oracle . com if you need additional information or have any
* questions .
2007-12-01 00:00:00 +00:00
*
*/
2010-11-23 13:22:55 -08:00
# include "precompiled.hpp"
# include "classfile/systemDictionary.hpp"
# include "classfile/vmSymbols.hpp"
# include "compiler/compileBroker.hpp"
# include "gc_interface/collectedHeap.inline.hpp"
# include "interpreter/bytecode.hpp"
# include "interpreter/interpreterRuntime.hpp"
# include "interpreter/linkResolver.hpp"
# include "memory/resourceArea.hpp"
# include "memory/universe.inline.hpp"
# include "oops/instanceKlass.hpp"
# include "oops/objArrayOop.hpp"
# include "prims/methodHandles.hpp"
# include "prims/nativeLookup.hpp"
# include "runtime/compilationPolicy.hpp"
# include "runtime/fieldDescriptor.hpp"
# include "runtime/frame.inline.hpp"
# include "runtime/handles.inline.hpp"
# include "runtime/reflection.hpp"
# include "runtime/signature.hpp"
# include "runtime/vmThread.hpp"
# ifdef TARGET_OS_FAMILY_linux
# include "thread_linux.inline.hpp"
# endif
# ifdef TARGET_OS_FAMILY_solaris
# include "thread_solaris.inline.hpp"
# endif
# ifdef TARGET_OS_FAMILY_windows
# include "thread_windows.inline.hpp"
# endif
2011-09-25 16:03:29 -07:00
# ifdef TARGET_OS_FAMILY_bsd
# include "thread_bsd.inline.hpp"
# endif
2007-12-01 00:00:00 +00:00
//------------------------------------------------------------------------------------------------------------------------
// Implementation of FieldAccessInfo
2011-01-27 16:11:27 -08:00
void FieldAccessInfo : : set ( KlassHandle klass , Symbol * name , int field_index , int field_offset ,
2007-12-01 00:00:00 +00:00
BasicType field_type , AccessFlags access_flags ) {
_klass = klass ;
_name = name ;
_field_index = field_index ;
_field_offset = field_offset ;
_field_type = field_type ;
_access_flags = access_flags ;
}
//------------------------------------------------------------------------------------------------------------------------
// Implementation of CallInfo
void CallInfo : : set_static ( KlassHandle resolved_klass , methodHandle resolved_method , TRAPS ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
int vtable_index = Method : : nonvirtual_vtable_index ;
2007-12-01 00:00:00 +00:00
set_common ( resolved_klass , resolved_klass , resolved_method , resolved_method , vtable_index , CHECK ) ;
}
void CallInfo : : set_interface ( KlassHandle resolved_klass , KlassHandle selected_klass , methodHandle resolved_method , methodHandle selected_method , TRAPS ) {
// This is only called for interface methods. If the resolved_method
// comes from java/lang/Object, it can be the subject of a virtual call, so
// we should pick the vtable index from the resolved method.
// Other than that case, there is no valid vtable index to specify.
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
int vtable_index = Method : : invalid_vtable_index ;
2010-01-06 14:22:39 -08:00
if ( resolved_method - > method_holder ( ) = = SystemDictionary : : Object_klass ( ) ) {
2007-12-01 00:00:00 +00:00
assert ( resolved_method - > vtable_index ( ) = = selected_method - > vtable_index ( ) , " sanity check " ) ;
vtable_index = resolved_method - > vtable_index ( ) ;
}
set_common ( resolved_klass , selected_klass , resolved_method , selected_method , vtable_index , CHECK ) ;
}
void CallInfo : : set_virtual ( KlassHandle resolved_klass , KlassHandle selected_klass , methodHandle resolved_method , methodHandle selected_method , int vtable_index , TRAPS ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
assert ( vtable_index > = 0 | | vtable_index = = Method : : nonvirtual_vtable_index , " valid index " ) ;
2007-12-01 00:00:00 +00:00
set_common ( resolved_klass , selected_klass , resolved_method , selected_method , vtable_index , CHECK ) ;
2012-07-24 10:51:00 -07:00
assert ( ! resolved_method - > is_compiled_lambda_form ( ) , " these must be handled via an invokehandle call " ) ;
2007-12-01 00:00:00 +00:00
}
2012-07-24 10:51:00 -07:00
void CallInfo : : set_handle ( methodHandle resolved_method , Handle resolved_appendix , TRAPS ) {
if ( resolved_method . is_null ( ) ) {
THROW_MSG ( vmSymbols : : java_lang_InternalError ( ) , " resolved method is null " ) ;
}
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
KlassHandle resolved_klass = SystemDictionary : : MethodHandle_klass ( ) ;
2012-07-24 10:51:00 -07:00
assert ( resolved_method - > intrinsic_id ( ) = = vmIntrinsics : : _invokeBasic | |
resolved_method - > is_compiled_lambda_form ( ) ,
" linkMethod must return one of these " ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
int vtable_index = Method : : nonvirtual_vtable_index ;
2010-07-15 18:40:45 -07:00
assert ( resolved_method - > vtable_index ( ) = = vtable_index , " " ) ;
2012-07-24 10:51:00 -07:00
set_common ( resolved_klass , resolved_klass , resolved_method , resolved_method , vtable_index , CHECK ) ;
_resolved_appendix = resolved_appendix ;
2010-07-15 18:40:45 -07:00
}
2007-12-01 00:00:00 +00:00
void CallInfo : : set_common ( KlassHandle resolved_klass , KlassHandle selected_klass , methodHandle resolved_method , methodHandle selected_method , int vtable_index , TRAPS ) {
assert ( resolved_method - > signature ( ) = = selected_method - > signature ( ) , " signatures must correspond " ) ;
_resolved_klass = resolved_klass ;
_selected_klass = selected_klass ;
_resolved_method = resolved_method ;
_selected_method = selected_method ;
_vtable_index = vtable_index ;
2012-07-24 10:51:00 -07:00
_resolved_appendix = Handle ( ) ;
2010-09-03 17:51:07 -07:00
if ( CompilationPolicy : : must_be_compiled ( selected_method ) ) {
2010-01-04 18:38:08 +01:00
// This path is unusual, mostly used by the '-Xcomp' stress test mode.
2010-09-03 17:51:07 -07:00
// Note: with several active threads, the must_be_compiled may be true
// while can_be_compiled is false; remove assert
// assert(CompilationPolicy::can_be_compiled(selected_method), "cannot compile");
2007-12-01 00:00:00 +00:00
if ( THREAD - > is_Compiler_thread ( ) ) {
// don't force compilation, resolve was on behalf of compiler
return ;
}
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
if ( InstanceKlass : : cast ( selected_method - > method_holder ( ) ) - > is_not_initialized ( ) ) {
2010-01-04 18:38:08 +01:00
// 'is_not_initialized' means not only '!is_initialized', but also that
// initialization has not been started yet ('!being_initialized')
// Do not force compilation of methods in uninitialized classes.
// Note that doing this would throw an assert later,
// in CompileBroker::compile_method.
// We sometimes use the link resolver to do reflective lookups
// even before classes are initialized.
return ;
}
2007-12-01 00:00:00 +00:00
CompileBroker : : compile_method ( selected_method , InvocationEntryBci ,
2011-07-20 18:04:17 -07:00
CompilationPolicy : : policy ( ) - > initial_compile_level ( ) ,
2010-09-03 17:51:07 -07:00
methodHandle ( ) , 0 , " must_be_compiled " , CHECK ) ;
2007-12-01 00:00:00 +00:00
}
}
//------------------------------------------------------------------------------------------------------------------------
// Klass resolution
void LinkResolver : : check_klass_accessability ( KlassHandle ref_klass , KlassHandle sel_klass , TRAPS ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
if ( ! Reflection : : verify_class_access ( ref_klass ( ) ,
sel_klass ( ) ,
2007-12-01 00:00:00 +00:00
true ) ) {
ResourceMark rm ( THREAD ) ;
Exceptions : : fthrow (
THREAD_AND_LOCATION ,
2011-01-27 16:11:27 -08:00
vmSymbols : : java_lang_IllegalAccessError ( ) ,
2007-12-01 00:00:00 +00:00
" tried to access class %s from class %s " ,
sel_klass - > external_name ( ) ,
ref_klass - > external_name ( )
) ;
return ;
}
}
void LinkResolver : : resolve_klass ( KlassHandle & result , constantPoolHandle pool , int index , TRAPS ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Klass * result_oop = pool - > klass_ref_at ( index , CHECK ) ;
2007-12-01 00:00:00 +00:00
result = KlassHandle ( THREAD , result_oop ) ;
}
void LinkResolver : : resolve_klass_no_update ( KlassHandle & result , constantPoolHandle pool , int index , TRAPS ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Klass * result_oop =
ConstantPool : : klass_ref_at_if_loaded_check ( pool , index , CHECK ) ;
2007-12-01 00:00:00 +00:00
result = KlassHandle ( THREAD , result_oop ) ;
}
//------------------------------------------------------------------------------------------------------------------------
// Method resolution
//
// According to JVM spec. $5.4.3c & $5.4.3d
2011-01-27 16:11:27 -08:00
void LinkResolver : : lookup_method_in_klasses ( methodHandle & result , KlassHandle klass , Symbol * name , Symbol * signature , TRAPS ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method * result_oop = klass - > uncached_lookup_method ( name , signature ) ;
2011-03-31 02:31:57 -07:00
if ( EnableInvokeDynamic & & result_oop ! = NULL ) {
2012-07-24 10:51:00 -07:00
vmIntrinsics : : ID iid = result_oop - > intrinsic_id ( ) ;
if ( MethodHandles : : is_signature_polymorphic ( iid ) ) {
// Do not link directly to these. The VM must produce a synthetic one using lookup_polymorphic_method.
2010-05-01 02:42:18 -07:00
return ;
}
}
2007-12-01 00:00:00 +00:00
result = methodHandle ( THREAD , result_oop ) ;
}
// returns first instance method
2011-01-27 16:11:27 -08:00
void LinkResolver : : lookup_instance_method_in_klasses ( methodHandle & result , KlassHandle klass , Symbol * name , Symbol * signature , TRAPS ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method * result_oop = klass - > uncached_lookup_method ( name , signature ) ;
2007-12-01 00:00:00 +00:00
result = methodHandle ( THREAD , result_oop ) ;
while ( ! result . is_null ( ) & & result - > is_static ( ) ) {
klass = KlassHandle ( THREAD , Klass : : cast ( result - > method_holder ( ) ) - > super ( ) ) ;
2011-01-27 16:11:27 -08:00
result = methodHandle ( THREAD , klass - > uncached_lookup_method ( name , signature ) ) ;
2007-12-01 00:00:00 +00:00
}
}
2011-01-27 16:11:27 -08:00
int LinkResolver : : vtable_index_of_miranda_method ( KlassHandle klass , Symbol * name , Symbol * signature , TRAPS ) {
2007-12-01 00:00:00 +00:00
ResourceMark rm ( THREAD ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
klassVtable * vt = InstanceKlass : : cast ( klass ( ) ) - > vtable ( ) ;
2011-01-27 16:11:27 -08:00
return vt - > index_of_miranda ( name , signature ) ;
2007-12-01 00:00:00 +00:00
}
2011-01-27 16:11:27 -08:00
void LinkResolver : : lookup_method_in_interfaces ( methodHandle & result , KlassHandle klass , Symbol * name , Symbol * signature , TRAPS ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
InstanceKlass * ik = InstanceKlass : : cast ( klass ( ) ) ;
2011-01-27 16:11:27 -08:00
result = methodHandle ( THREAD , ik - > lookup_method_in_all_interfaces ( name , signature ) ) ;
2007-12-01 00:00:00 +00:00
}
2012-07-24 10:51:00 -07:00
void LinkResolver : : lookup_polymorphic_method ( methodHandle & result ,
KlassHandle klass , Symbol * name , Symbol * full_signature ,
KlassHandle current_klass ,
Handle * appendix_result_or_null ,
TRAPS ) {
vmIntrinsics : : ID iid = MethodHandles : : signature_polymorphic_name_id ( name ) ;
if ( TraceMethodHandles ) {
tty - > print_cr ( " lookup_polymorphic_method iid=%s %s.%s%s " ,
vmIntrinsics : : name_at ( iid ) , klass - > external_name ( ) ,
name - > as_C_string ( ) , full_signature - > as_C_string ( ) ) ;
}
2011-03-31 02:31:57 -07:00
if ( EnableInvokeDynamic & &
2010-05-01 02:42:18 -07:00
klass ( ) = = SystemDictionary : : MethodHandle_klass ( ) & &
2012-07-24 10:51:00 -07:00
iid ! = vmIntrinsics : : _none ) {
if ( MethodHandles : : is_signature_polymorphic_intrinsic ( iid ) ) {
// Most of these do not need an up-call to Java to resolve, so can be done anywhere.
// Do not erase last argument type (MemberName) if it is a static linkTo method.
bool keep_last_arg = MethodHandles : : is_signature_polymorphic_static ( iid ) ;
TempNewSymbol basic_signature =
MethodHandles : : lookup_basic_type_signature ( full_signature , keep_last_arg , CHECK ) ;
if ( TraceMethodHandles ) {
tty - > print_cr ( " lookup_polymorphic_method %s %s => basic %s " ,
name - > as_C_string ( ) ,
full_signature - > as_C_string ( ) ,
basic_signature - > as_C_string ( ) ) ;
}
result = SystemDictionary : : find_method_handle_intrinsic ( iid ,
basic_signature ,
CHECK ) ;
if ( result . not_null ( ) ) {
assert ( result - > is_method_handle_intrinsic ( ) , " MH.invokeBasic or MH.linkTo* intrinsic " ) ;
assert ( result - > intrinsic_id ( ) ! = vmIntrinsics : : _invokeGeneric , " wrong place to find this " ) ;
assert ( basic_signature = = result - > signature ( ) , " predict the result signature " ) ;
if ( TraceMethodHandles ) {
tty - > print ( " lookup_polymorphic_method => intrinsic " ) ;
result - > print_on ( tty ) ;
}
return ;
}
} else if ( iid = = vmIntrinsics : : _invokeGeneric
& & ! THREAD - > is_Compiler_thread ( )
& & appendix_result_or_null ! = NULL ) {
// This is a method with type-checking semantics.
// We will ask Java code to spin an adapter method for it.
if ( ! MethodHandles : : enabled ( ) ) {
// Make sure the Java part of the runtime has been booted up.
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Klass * natives = SystemDictionary : : MethodHandleNatives_klass ( ) ;
if ( natives = = NULL | | InstanceKlass : : cast ( natives ) - > is_not_initialized ( ) ) {
2012-07-24 10:51:00 -07:00
SystemDictionary : : resolve_or_fail ( vmSymbols : : java_lang_invoke_MethodHandleNatives ( ) ,
Handle ( ) ,
Handle ( ) ,
true ,
CHECK ) ;
}
}
Handle appendix ;
result = SystemDictionary : : find_method_handle_invoker ( name ,
full_signature ,
current_klass ,
& appendix ,
CHECK ) ;
if ( TraceMethodHandles ) {
tty - > print ( " lookup_polymorphic_method => (via Java) " ) ;
result - > print_on ( tty ) ;
tty - > print ( " lookup_polymorphic_method => appendix = " ) ;
if ( appendix . is_null ( ) ) tty - > print_cr ( " (none) " ) ;
else appendix - > print_on ( tty ) ;
}
if ( result . not_null ( ) ) {
# ifdef ASSERT
TempNewSymbol basic_signature =
MethodHandles : : lookup_basic_type_signature ( full_signature , CHECK ) ;
int actual_size_of_params = result - > size_of_parameters ( ) ;
int expected_size_of_params = ArgumentSizeComputer ( basic_signature ) . size ( ) ;
// +1 for MethodHandle.this, +1 for trailing MethodType
if ( ! MethodHandles : : is_signature_polymorphic_static ( iid ) ) expected_size_of_params + = 1 ;
if ( appendix . not_null ( ) ) expected_size_of_params + = 1 ;
if ( actual_size_of_params ! = expected_size_of_params ) {
tty - > print_cr ( " *** basic_signature=%s " , basic_signature - > as_C_string ( ) ) ;
tty - > print_cr ( " *** result for %s: " , vmIntrinsics : : name_at ( iid ) ) ;
result - > print ( ) ;
}
assert ( actual_size_of_params = = expected_size_of_params ,
err_msg ( " %d != %d " , actual_size_of_params , expected_size_of_params ) ) ;
# endif //ASSERT
assert ( appendix_result_or_null ! = NULL , " " ) ;
( * appendix_result_or_null ) = appendix ;
return ;
2010-07-15 18:40:45 -07:00
}
2009-04-08 10:56:49 -07:00
}
}
}
2007-12-01 00:00:00 +00:00
void LinkResolver : : check_method_accessability ( KlassHandle ref_klass ,
KlassHandle resolved_klass ,
KlassHandle sel_klass ,
methodHandle sel_method ,
TRAPS ) {
AccessFlags flags = sel_method - > access_flags ( ) ;
// Special case: arrays always override "clone". JVMS 2.15.
// If the resolved klass is an array class, and the declaring class
// is java.lang.Object and the method is "clone", set the flags
// to public.
//
// We'll check for the method name first, as that's most likely
// to be false (so we'll short-circuit out of these tests).
if ( sel_method - > name ( ) = = vmSymbols : : clone_name ( ) & &
2010-01-06 14:22:39 -08:00
sel_klass ( ) = = SystemDictionary : : Object_klass ( ) & &
2007-12-01 00:00:00 +00:00
resolved_klass - > oop_is_array ( ) ) {
// We need to change "protected" to "public".
assert ( flags . is_protected ( ) , " clone not protected? " ) ;
jint new_flags = flags . as_int ( ) ;
new_flags = new_flags & ( ~ JVM_ACC_PROTECTED ) ;
new_flags = new_flags | JVM_ACC_PUBLIC ;
flags . set_flags ( new_flags ) ;
}
2012-07-24 10:51:00 -07:00
// assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
2007-12-01 00:00:00 +00:00
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
if ( ! Reflection : : verify_field_access ( ref_klass ( ) ,
resolved_klass ( ) ,
sel_klass ( ) ,
2007-12-01 00:00:00 +00:00
flags ,
true ) ) {
ResourceMark rm ( THREAD ) ;
Exceptions : : fthrow (
THREAD_AND_LOCATION ,
2011-01-27 16:11:27 -08:00
vmSymbols : : java_lang_IllegalAccessError ( ) ,
2007-12-01 00:00:00 +00:00
" tried to access method %s.%s%s from class %s " ,
sel_klass - > external_name ( ) ,
sel_method - > name ( ) - > as_C_string ( ) ,
sel_method - > signature ( ) - > as_C_string ( ) ,
ref_klass - > external_name ( )
) ;
return ;
}
}
2012-07-24 10:51:00 -07:00
void LinkResolver : : resolve_method_statically ( methodHandle & resolved_method , KlassHandle & resolved_klass ,
Bytecodes : : Code code , constantPoolHandle pool , int index , TRAPS ) {
2007-12-01 00:00:00 +00:00
// resolve klass
2012-07-24 10:51:00 -07:00
if ( code = = Bytecodes : : _invokedynamic ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
resolved_klass = SystemDictionary : : MethodHandle_klass ( ) ;
2012-07-24 10:51:00 -07:00
Symbol * method_name = vmSymbols : : invoke_name ( ) ;
Symbol * method_signature = pool - > signature_ref_at ( index ) ;
KlassHandle current_klass ( THREAD , pool - > pool_holder ( ) ) ;
resolve_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , true , CHECK ) ;
return ;
}
2007-12-01 00:00:00 +00:00
resolve_klass ( resolved_klass , pool , index , CHECK ) ;
2011-01-27 16:11:27 -08:00
Symbol * method_name = pool - > name_ref_at ( index ) ;
Symbol * method_signature = pool - > signature_ref_at ( index ) ;
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ( THREAD , pool - > pool_holder ( ) ) ;
2011-06-23 17:14:06 -07:00
if ( pool - > has_preresolution ( )
| | ( resolved_klass ( ) = = SystemDictionary : : MethodHandle_klass ( ) & &
2012-07-24 10:51:00 -07:00
MethodHandles : : is_signature_polymorphic_name ( resolved_klass ( ) , method_name ) ) ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method * result_oop = ConstantPool : : method_at_if_loaded ( pool , index ) ;
2011-06-23 17:14:06 -07:00
if ( result_oop ! = NULL ) {
resolved_method = methodHandle ( THREAD , result_oop ) ;
return ;
}
}
2012-07-24 10:51:00 -07:00
if ( code = = Bytecodes : : _invokeinterface ) {
resolve_interface_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , true , CHECK ) ;
} else {
resolve_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , true , CHECK ) ;
}
2007-12-01 00:00:00 +00:00
}
void LinkResolver : : resolve_method ( methodHandle & resolved_method , KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * method_name , Symbol * method_signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass , bool check_access , TRAPS ) {
// 1. check if klass is not interface
if ( resolved_klass - > is_interface ( ) ) {
2011-05-05 07:51:05 -07:00
ResourceMark rm ( THREAD ) ;
2007-12-01 00:00:00 +00:00
char buf [ 200 ] ;
jio_snprintf ( buf , sizeof ( buf ) , " Found interface %s, but class was expected " , Klass : : cast ( resolved_klass ( ) ) - > external_name ( ) ) ;
THROW_MSG ( vmSymbols : : java_lang_IncompatibleClassChangeError ( ) , buf ) ;
}
2012-07-24 10:51:00 -07:00
Handle nested_exception ;
2007-12-01 00:00:00 +00:00
// 2. lookup method in resolved klass and its super klasses
lookup_method_in_klasses ( resolved_method , resolved_klass , method_name , method_signature , CHECK ) ;
if ( resolved_method . is_null ( ) ) { // not found in the class hierarchy
// 3. lookup method in all the interfaces implemented by the resolved klass
lookup_method_in_interfaces ( resolved_method , resolved_klass , method_name , method_signature , CHECK ) ;
2009-04-08 10:56:49 -07:00
if ( resolved_method . is_null ( ) ) {
2012-07-24 10:51:00 -07:00
// JSR 292: see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
lookup_polymorphic_method ( resolved_method , resolved_klass , method_name , method_signature ,
current_klass , ( Handle * ) NULL , THREAD ) ;
if ( HAS_PENDING_EXCEPTION ) {
nested_exception = Handle ( THREAD , PENDING_EXCEPTION ) ;
CLEAR_PENDING_EXCEPTION ;
}
2009-04-08 10:56:49 -07:00
}
2007-12-01 00:00:00 +00:00
if ( resolved_method . is_null ( ) ) {
// 4. method lookup failed
ResourceMark rm ( THREAD ) ;
2012-07-24 10:51:00 -07:00
THROW_MSG_CAUSE ( vmSymbols : : java_lang_NoSuchMethodError ( ) ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2012-07-24 10:51:00 -07:00
method_name ,
method_signature ) ,
nested_exception ) ;
2007-12-01 00:00:00 +00:00
}
}
// 5. check if method is concrete
if ( resolved_method - > is_abstract ( ) & & ! resolved_klass - > is_abstract ( ) ) {
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_AbstractMethodError ( ) ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2011-01-27 16:11:27 -08:00
method_name ,
method_signature ) ) ;
2007-12-01 00:00:00 +00:00
}
// 6. access checks, access checking may be turned off when calling from within the VM.
if ( check_access ) {
assert ( current_klass . not_null ( ) , " current_klass should not be null " ) ;
// check if method can be accessed by the referring class
check_method_accessability ( current_klass ,
resolved_klass ,
KlassHandle ( THREAD , resolved_method - > method_holder ( ) ) ,
resolved_method ,
CHECK ) ;
// check loader constraints
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Handle loader ( THREAD , InstanceKlass : : cast ( current_klass ( ) ) - > class_loader ( ) ) ;
Handle class_loader ( THREAD , InstanceKlass : : cast ( resolved_method - > method_holder ( ) ) - > class_loader ( ) ) ;
2007-12-01 00:00:00 +00:00
{
ResourceMark rm ( THREAD ) ;
char * failed_type_name =
SystemDictionary : : check_signature_loaders ( method_signature , loader ,
class_loader , true , CHECK ) ;
if ( failed_type_name ! = NULL ) {
const char * msg = " loader constraint violation: when resolving method "
" \" %s \" the class loader (instance of %s) of the current class, %s, "
" and the class loader (instance of %s) for resolved class, %s, have "
" different Class objects for the type %s used in the signature " ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
char * sig = Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) , method_name , method_signature ) ;
2007-12-01 00:00:00 +00:00
const char * loader1 = SystemDictionary : : loader_name ( loader ( ) ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
char * current = InstanceKlass : : cast ( current_klass ( ) ) - > name ( ) - > as_C_string ( ) ;
2007-12-01 00:00:00 +00:00
const char * loader2 = SystemDictionary : : loader_name ( class_loader ( ) ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
char * resolved = InstanceKlass : : cast ( resolved_klass ( ) ) - > name ( ) - > as_C_string ( ) ;
2007-12-01 00:00:00 +00:00
size_t buflen = strlen ( msg ) + strlen ( sig ) + strlen ( loader1 ) +
strlen ( current ) + strlen ( loader2 ) + strlen ( resolved ) +
strlen ( failed_type_name ) ;
char * buf = NEW_RESOURCE_ARRAY_IN_THREAD ( THREAD , char , buflen ) ;
jio_snprintf ( buf , buflen , msg , sig , loader1 , current , loader2 ,
resolved , failed_type_name ) ;
THROW_MSG ( vmSymbols : : java_lang_LinkageError ( ) , buf ) ;
}
}
}
}
void LinkResolver : : resolve_interface_method ( methodHandle & resolved_method ,
KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * method_name ,
Symbol * method_signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ,
bool check_access , TRAPS ) {
// check if klass is interface
if ( ! resolved_klass - > is_interface ( ) ) {
2011-05-05 07:51:05 -07:00
ResourceMark rm ( THREAD ) ;
2007-12-01 00:00:00 +00:00
char buf [ 200 ] ;
jio_snprintf ( buf , sizeof ( buf ) , " Found class %s, but interface was expected " , Klass : : cast ( resolved_klass ( ) ) - > external_name ( ) ) ;
THROW_MSG ( vmSymbols : : java_lang_IncompatibleClassChangeError ( ) , buf ) ;
}
// lookup method in this interface or its super, java.lang.Object
lookup_instance_method_in_klasses ( resolved_method , resolved_klass , method_name , method_signature , CHECK ) ;
if ( resolved_method . is_null ( ) ) {
// lookup method in all the super-interfaces
lookup_method_in_interfaces ( resolved_method , resolved_klass , method_name , method_signature , CHECK ) ;
if ( resolved_method . is_null ( ) ) {
// no method found
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_NoSuchMethodError ( ) ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2011-01-27 16:11:27 -08:00
method_name ,
method_signature ) ) ;
2007-12-01 00:00:00 +00:00
}
}
if ( check_access ) {
HandleMark hm ( THREAD ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Handle loader ( THREAD , InstanceKlass : : cast ( current_klass ( ) ) - > class_loader ( ) ) ;
Handle class_loader ( THREAD , InstanceKlass : : cast ( resolved_method - > method_holder ( ) ) - > class_loader ( ) ) ;
2007-12-01 00:00:00 +00:00
{
ResourceMark rm ( THREAD ) ;
char * failed_type_name =
SystemDictionary : : check_signature_loaders ( method_signature , loader ,
class_loader , true , CHECK ) ;
if ( failed_type_name ! = NULL ) {
const char * msg = " loader constraint violation: when resolving "
" interface method \" %s \" the class loader (instance of %s) of the "
" current class, %s, and the class loader (instance of %s) for "
" resolved class, %s, have different Class objects for the type %s "
" used in the signature " ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
char * sig = Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) , method_name , method_signature ) ;
2007-12-01 00:00:00 +00:00
const char * loader1 = SystemDictionary : : loader_name ( loader ( ) ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
char * current = InstanceKlass : : cast ( current_klass ( ) ) - > name ( ) - > as_C_string ( ) ;
2007-12-01 00:00:00 +00:00
const char * loader2 = SystemDictionary : : loader_name ( class_loader ( ) ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
char * resolved = InstanceKlass : : cast ( resolved_klass ( ) ) - > name ( ) - > as_C_string ( ) ;
2007-12-01 00:00:00 +00:00
size_t buflen = strlen ( msg ) + strlen ( sig ) + strlen ( loader1 ) +
strlen ( current ) + strlen ( loader2 ) + strlen ( resolved ) +
strlen ( failed_type_name ) ;
char * buf = NEW_RESOURCE_ARRAY_IN_THREAD ( THREAD , char , buflen ) ;
jio_snprintf ( buf , buflen , msg , sig , loader1 , current , loader2 ,
resolved , failed_type_name ) ;
THROW_MSG ( vmSymbols : : java_lang_LinkageError ( ) , buf ) ;
}
}
}
}
//------------------------------------------------------------------------------------------------------------------------
// Field resolution
void LinkResolver : : check_field_accessability ( KlassHandle ref_klass ,
KlassHandle resolved_klass ,
KlassHandle sel_klass ,
fieldDescriptor & fd ,
TRAPS ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
if ( ! Reflection : : verify_field_access ( ref_klass ( ) ,
resolved_klass ( ) ,
sel_klass ( ) ,
2007-12-01 00:00:00 +00:00
fd . access_flags ( ) ,
true ) ) {
ResourceMark rm ( THREAD ) ;
Exceptions : : fthrow (
THREAD_AND_LOCATION ,
2011-01-27 16:11:27 -08:00
vmSymbols : : java_lang_IllegalAccessError ( ) ,
2007-12-01 00:00:00 +00:00
" tried to access field %s.%s from class %s " ,
sel_klass - > external_name ( ) ,
fd . name ( ) - > as_C_string ( ) ,
ref_klass - > external_name ( )
) ;
return ;
}
}
void LinkResolver : : resolve_field ( FieldAccessInfo & result , constantPoolHandle pool , int index , Bytecodes : : Code byte , bool check_only , TRAPS ) {
resolve_field ( result , pool , index , byte , check_only , true , CHECK ) ;
}
void LinkResolver : : resolve_field ( FieldAccessInfo & result , constantPoolHandle pool , int index , Bytecodes : : Code byte , bool check_only , bool update_pool , TRAPS ) {
assert ( byte = = Bytecodes : : _getstatic | | byte = = Bytecodes : : _putstatic | |
byte = = Bytecodes : : _getfield | | byte = = Bytecodes : : _putfield , " bad bytecode " ) ;
bool is_static = ( byte = = Bytecodes : : _getstatic | | byte = = Bytecodes : : _putstatic ) ;
bool is_put = ( byte = = Bytecodes : : _putfield | | byte = = Bytecodes : : _putstatic ) ;
// resolve specified klass
KlassHandle resolved_klass ;
if ( update_pool ) {
resolve_klass ( resolved_klass , pool , index , CHECK ) ;
} else {
resolve_klass_no_update ( resolved_klass , pool , index , CHECK ) ;
}
// Load these early in case the resolve of the containing klass fails
2011-01-27 16:11:27 -08:00
Symbol * field = pool - > name_ref_at ( index ) ;
Symbol * sig = pool - > signature_ref_at ( index ) ;
2007-12-01 00:00:00 +00:00
// Check if there's a resolved klass containing the field
if ( resolved_klass . is_null ( ) ) {
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_NoSuchFieldError ( ) , field - > as_C_string ( ) ) ;
}
// Resolve instance field
fieldDescriptor fd ; // find_field initializes fd if found
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
KlassHandle sel_klass ( THREAD , InstanceKlass : : cast ( resolved_klass ( ) ) - > find_field ( field , sig , & fd ) ) ;
2007-12-01 00:00:00 +00:00
// check if field exists; i.e., if a klass containing the field def has been selected
if ( sel_klass . is_null ( ) ) {
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_NoSuchFieldError ( ) , field - > as_C_string ( ) ) ;
}
// check access
KlassHandle ref_klass ( THREAD , pool - > pool_holder ( ) ) ;
check_field_accessability ( ref_klass , resolved_klass , sel_klass , fd , CHECK ) ;
// check for errors
if ( is_static ! = fd . is_static ( ) ) {
2011-05-05 07:51:05 -07:00
ResourceMark rm ( THREAD ) ;
2007-12-01 00:00:00 +00:00
char msg [ 200 ] ;
jio_snprintf ( msg , sizeof ( msg ) , " Expected %s field %s.%s " , is_static ? " static " : " non-static " , Klass : : cast ( resolved_klass ( ) ) - > external_name ( ) , fd . name ( ) - > as_C_string ( ) ) ;
THROW_MSG ( vmSymbols : : java_lang_IncompatibleClassChangeError ( ) , msg ) ;
}
// Final fields can only be accessed from its own class.
if ( is_put & & fd . access_flags ( ) . is_final ( ) & & sel_klass ( ) ! = pool - > pool_holder ( ) ) {
THROW ( vmSymbols : : java_lang_IllegalAccessError ( ) ) ;
}
// initialize resolved_klass if necessary
// note 1: the klass which declared the field must be initialized (i.e, sel_klass)
// according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
//
// note 2: we don't want to force initialization if we are just checking
// if the field access is legal; e.g., during compilation
if ( is_static & & ! check_only ) {
sel_klass - > initialize ( CHECK ) ;
}
{
HandleMark hm ( THREAD ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Handle ref_loader ( THREAD , InstanceKlass : : cast ( ref_klass ( ) ) - > class_loader ( ) ) ;
Handle sel_loader ( THREAD , InstanceKlass : : cast ( sel_klass ( ) ) - > class_loader ( ) ) ;
2011-01-27 16:11:27 -08:00
Symbol * signature_ref = pool - > signature_ref_at ( index ) ;
2007-12-01 00:00:00 +00:00
{
ResourceMark rm ( THREAD ) ;
char * failed_type_name =
SystemDictionary : : check_signature_loaders ( signature_ref ,
ref_loader , sel_loader ,
false ,
CHECK ) ;
if ( failed_type_name ! = NULL ) {
const char * msg = " loader constraint violation: when resolving field "
" \" %s \" the class loader (instance of %s) of the referring class, "
" %s, and the class loader (instance of %s) for the field's resolved "
" type, %s, have different Class objects for that type " ;
2011-01-27 16:11:27 -08:00
char * field_name = field - > as_C_string ( ) ;
2007-12-01 00:00:00 +00:00
const char * loader1 = SystemDictionary : : loader_name ( ref_loader ( ) ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
char * sel = InstanceKlass : : cast ( sel_klass ( ) ) - > name ( ) - > as_C_string ( ) ;
2007-12-01 00:00:00 +00:00
const char * loader2 = SystemDictionary : : loader_name ( sel_loader ( ) ) ;
size_t buflen = strlen ( msg ) + strlen ( field_name ) + strlen ( loader1 ) +
strlen ( sel ) + strlen ( loader2 ) + strlen ( failed_type_name ) ;
char * buf = NEW_RESOURCE_ARRAY_IN_THREAD ( THREAD , char , buflen ) ;
jio_snprintf ( buf , buflen , msg , field_name , loader1 , sel , loader2 ,
failed_type_name ) ;
THROW_MSG ( vmSymbols : : java_lang_LinkageError ( ) , buf ) ;
}
}
}
// return information. note that the klass is set to the actual klass containing the
// field, otherwise access of static fields in superclasses will not work.
KlassHandle holder ( THREAD , fd . field_holder ( ) ) ;
2011-01-27 16:11:27 -08:00
Symbol * name = fd . name ( ) ;
2007-12-01 00:00:00 +00:00
result . set ( holder , name , fd . index ( ) , fd . offset ( ) , fd . field_type ( ) , fd . access_flags ( ) ) ;
}
//------------------------------------------------------------------------------------------------------------------------
// Invoke resolution
//
// Naming conventions:
//
// resolved_method the specified method (i.e., static receiver specified via constant pool index)
// sel_method the selected method (selected via run-time lookup; e.g., based on dynamic receiver class)
// resolved_klass the specified klass (i.e., specified via constant pool index)
// recv_klass the receiver klass
2011-01-27 16:11:27 -08:00
void LinkResolver : : resolve_static_call ( CallInfo & result , KlassHandle & resolved_klass , Symbol * method_name ,
Symbol * method_signature , KlassHandle current_klass ,
2007-12-01 00:00:00 +00:00
bool check_access , bool initialize_class , TRAPS ) {
methodHandle resolved_method ;
linktime_resolve_static_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , check_access , CHECK ) ;
resolved_klass = KlassHandle ( THREAD , Klass : : cast ( resolved_method - > method_holder ( ) ) ) ;
// Initialize klass (this should only happen if everything is ok)
if ( initialize_class & & resolved_klass - > should_be_initialized ( ) ) {
resolved_klass - > initialize ( CHECK ) ;
linktime_resolve_static_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , check_access , CHECK ) ;
}
// setup result
result . set_static ( resolved_klass , resolved_method , CHECK ) ;
}
// throws linktime exceptions
void LinkResolver : : linktime_resolve_static_method ( methodHandle & resolved_method , KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * method_name , Symbol * method_signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass , bool check_access , TRAPS ) {
resolve_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , check_access , CHECK ) ;
assert ( resolved_method - > name ( ) ! = vmSymbols : : class_initializer_name ( ) , " should have been checked in verifier " ) ;
// check if static
if ( ! resolved_method - > is_static ( ) ) {
2011-05-05 07:51:05 -07:00
ResourceMark rm ( THREAD ) ;
2007-12-01 00:00:00 +00:00
char buf [ 200 ] ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
jio_snprintf ( buf , sizeof ( buf ) , " Expected static method %s " , Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
resolved_method - > name ( ) ,
resolved_method - > signature ( ) ) ) ;
THROW_MSG ( vmSymbols : : java_lang_IncompatibleClassChangeError ( ) , buf ) ;
}
}
2011-01-27 16:11:27 -08:00
void LinkResolver : : resolve_special_call ( CallInfo & result , KlassHandle resolved_klass , Symbol * method_name ,
Symbol * method_signature , KlassHandle current_klass , bool check_access , TRAPS ) {
2007-12-01 00:00:00 +00:00
methodHandle resolved_method ;
linktime_resolve_special_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , check_access , CHECK ) ;
runtime_resolve_special_method ( result , resolved_method , resolved_klass , current_klass , check_access , CHECK ) ;
}
// throws linktime exceptions
void LinkResolver : : linktime_resolve_special_method ( methodHandle & resolved_method , KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * method_name , Symbol * method_signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass , bool check_access , TRAPS ) {
resolve_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , check_access , CHECK ) ;
// check if method name is <init>, that it is found in same klass as static type
if ( resolved_method - > name ( ) = = vmSymbols : : object_initializer_name ( ) & &
resolved_method - > method_holder ( ) ! = resolved_klass ( ) ) {
ResourceMark rm ( THREAD ) ;
Exceptions : : fthrow (
THREAD_AND_LOCATION ,
2011-01-27 16:11:27 -08:00
vmSymbols : : java_lang_NoSuchMethodError ( ) ,
2007-12-01 00:00:00 +00:00
" %s: method %s%s not found " ,
resolved_klass - > external_name ( ) ,
resolved_method - > name ( ) - > as_C_string ( ) ,
resolved_method - > signature ( ) - > as_C_string ( )
) ;
return ;
}
// check if not static
if ( resolved_method - > is_static ( ) ) {
2011-05-05 07:51:05 -07:00
ResourceMark rm ( THREAD ) ;
2007-12-01 00:00:00 +00:00
char buf [ 200 ] ;
jio_snprintf ( buf , sizeof ( buf ) ,
" Expecting non-static method %s " ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
resolved_method - > name ( ) ,
resolved_method - > signature ( ) ) ) ;
THROW_MSG ( vmSymbols : : java_lang_IncompatibleClassChangeError ( ) , buf ) ;
}
}
// throws runtime exceptions
void LinkResolver : : runtime_resolve_special_method ( CallInfo & result , methodHandle resolved_method , KlassHandle resolved_klass ,
KlassHandle current_klass , bool check_access , TRAPS ) {
// resolved method is selected method unless we have an old-style lookup
methodHandle sel_method ( THREAD , resolved_method ( ) ) ;
// check if this is an old-style super call and do a new lookup if so
{ KlassHandle method_klass = KlassHandle ( THREAD ,
resolved_method - > method_holder ( ) ) ;
if ( check_access & &
// a) check if ACC_SUPER flag is set for the current class
current_klass - > is_super ( ) & &
// b) check if the method class is a superclass of the current class (superclass relation is not reflexive!)
current_klass - > is_subtype_of ( method_klass ( ) ) & & current_klass ( ) ! = method_klass ( ) & &
// c) check if the method is not <init>
resolved_method - > name ( ) ! = vmSymbols : : object_initializer_name ( ) ) {
// Lookup super method
KlassHandle super_klass ( THREAD , current_klass - > super ( ) ) ;
lookup_instance_method_in_klasses ( sel_method , super_klass ,
2011-01-27 16:11:27 -08:00
resolved_method - > name ( ) ,
resolved_method - > signature ( ) , CHECK ) ;
2007-12-01 00:00:00 +00:00
// check if found
if ( sel_method . is_null ( ) ) {
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_AbstractMethodError ( ) ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
resolved_method - > name ( ) ,
resolved_method - > signature ( ) ) ) ;
}
}
}
// check if not static
if ( sel_method - > is_static ( ) ) {
2011-05-05 07:51:05 -07:00
ResourceMark rm ( THREAD ) ;
2007-12-01 00:00:00 +00:00
char buf [ 200 ] ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
jio_snprintf ( buf , sizeof ( buf ) , " Expecting non-static method %s " , Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
resolved_method - > name ( ) ,
resolved_method - > signature ( ) ) ) ;
THROW_MSG ( vmSymbols : : java_lang_IncompatibleClassChangeError ( ) , buf ) ;
}
// check if abstract
if ( sel_method - > is_abstract ( ) ) {
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_AbstractMethodError ( ) ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
sel_method - > name ( ) ,
sel_method - > signature ( ) ) ) ;
}
// setup result
result . set_static ( resolved_klass , sel_method , CHECK ) ;
}
void LinkResolver : : resolve_virtual_call ( CallInfo & result , Handle recv , KlassHandle receiver_klass , KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * method_name , Symbol * method_signature , KlassHandle current_klass ,
2007-12-01 00:00:00 +00:00
bool check_access , bool check_null_and_abstract , TRAPS ) {
methodHandle resolved_method ;
linktime_resolve_virtual_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , check_access , CHECK ) ;
runtime_resolve_virtual_method ( result , resolved_method , resolved_klass , recv , receiver_klass , check_null_and_abstract , CHECK ) ;
}
// throws linktime exceptions
void LinkResolver : : linktime_resolve_virtual_method ( methodHandle & resolved_method , KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * method_name , Symbol * method_signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass , bool check_access , TRAPS ) {
// normal method resolution
resolve_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , check_access , CHECK ) ;
assert ( resolved_method - > name ( ) ! = vmSymbols : : object_initializer_name ( ) , " should have been checked in verifier " ) ;
assert ( resolved_method - > name ( ) ! = vmSymbols : : class_initializer_name ( ) , " should have been checked in verifier " ) ;
// check if not static
if ( resolved_method - > is_static ( ) ) {
2011-05-05 07:51:05 -07:00
ResourceMark rm ( THREAD ) ;
2007-12-01 00:00:00 +00:00
char buf [ 200 ] ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
jio_snprintf ( buf , sizeof ( buf ) , " Expecting non-static method %s " , Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
resolved_method - > name ( ) ,
resolved_method - > signature ( ) ) ) ;
THROW_MSG ( vmSymbols : : java_lang_IncompatibleClassChangeError ( ) , buf ) ;
}
}
// throws runtime exceptions
void LinkResolver : : runtime_resolve_virtual_method ( CallInfo & result ,
methodHandle resolved_method ,
KlassHandle resolved_klass ,
Handle recv ,
KlassHandle recv_klass ,
bool check_null_and_abstract ,
TRAPS ) {
// setup default return values
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
int vtable_index = Method : : invalid_vtable_index ;
2007-12-01 00:00:00 +00:00
methodHandle selected_method ;
assert ( recv . is_null ( ) | | recv - > is_oop ( ) , " receiver is not an oop " ) ;
// runtime method resolution
if ( check_null_and_abstract & & recv . is_null ( ) ) { // check if receiver exists
THROW ( vmSymbols : : java_lang_NullPointerException ( ) ) ;
}
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
// Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
2007-12-01 00:00:00 +00:00
// has not been rewritten, and the vtable initialized.
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
assert ( InstanceKlass : : cast ( resolved_method - > method_holder ( ) ) - > is_linked ( ) , " must be linked " ) ;
2007-12-01 00:00:00 +00:00
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
// Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
2007-12-01 00:00:00 +00:00
// has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since
// a missing receiver might result in a bogus lookup.
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
assert ( InstanceKlass : : cast ( resolved_method - > method_holder ( ) ) - > is_linked ( ) , " must be linked " ) ;
2007-12-01 00:00:00 +00:00
// do lookup based on receiver klass using the vtable index
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
if ( resolved_method - > method_holder ( ) - > is_interface ( ) ) { // miranda method
2007-12-01 00:00:00 +00:00
vtable_index = vtable_index_of_miranda_method ( resolved_klass ,
2011-01-27 16:11:27 -08:00
resolved_method - > name ( ) ,
resolved_method - > signature ( ) , CHECK ) ;
2007-12-01 00:00:00 +00:00
assert ( vtable_index > = 0 , " we should have valid vtable index at this point " ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
InstanceKlass * inst = InstanceKlass : : cast ( recv_klass ( ) ) ;
2007-12-01 00:00:00 +00:00
selected_method = methodHandle ( THREAD , inst - > method_at_vtable ( vtable_index ) ) ;
} else {
// at this point we are sure that resolved_method is virtual and not
// a miranda method; therefore, it must have a valid vtable index.
vtable_index = resolved_method - > vtable_index ( ) ;
// We could get a negative vtable_index for final methods,
// because as an optimization they are they are never put in the vtable,
// unless they override an existing method.
// If we do get a negative, it means the resolved method is the the selected
// method, and it can never be changed by an override.
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
if ( vtable_index = = Method : : nonvirtual_vtable_index ) {
2007-12-01 00:00:00 +00:00
assert ( resolved_method - > can_be_statically_bound ( ) , " cannot override this method " ) ;
selected_method = resolved_method ;
} else {
// recv_klass might be an arrayKlassOop but all vtables start at
// the same place. The cast is to avoid virtual call and assertion.
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
InstanceKlass * inst = ( InstanceKlass * ) recv_klass ( ) ;
2007-12-01 00:00:00 +00:00
selected_method = methodHandle ( THREAD , inst - > method_at_vtable ( vtable_index ) ) ;
}
}
// check if method exists
if ( selected_method . is_null ( ) ) {
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_AbstractMethodError ( ) ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
resolved_method - > name ( ) ,
resolved_method - > signature ( ) ) ) ;
}
// check if abstract
if ( check_null_and_abstract & & selected_method - > is_abstract ( ) ) {
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_AbstractMethodError ( ) ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( resolved_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
selected_method - > name ( ) ,
selected_method - > signature ( ) ) ) ;
}
// setup result
result . set_virtual ( resolved_klass , recv_klass , resolved_method , selected_method , vtable_index , CHECK ) ;
}
void LinkResolver : : resolve_interface_call ( CallInfo & result , Handle recv , KlassHandle recv_klass , KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * method_name , Symbol * method_signature , KlassHandle current_klass ,
2007-12-01 00:00:00 +00:00
bool check_access , bool check_null_and_abstract , TRAPS ) {
methodHandle resolved_method ;
linktime_resolve_interface_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , check_access , CHECK ) ;
runtime_resolve_interface_method ( result , resolved_method , resolved_klass , recv , recv_klass , check_null_and_abstract , CHECK ) ;
}
// throws linktime exceptions
2011-01-27 16:11:27 -08:00
void LinkResolver : : linktime_resolve_interface_method ( methodHandle & resolved_method , KlassHandle resolved_klass , Symbol * method_name ,
Symbol * method_signature , KlassHandle current_klass , bool check_access , TRAPS ) {
2007-12-01 00:00:00 +00:00
// normal interface method resolution
resolve_interface_method ( resolved_method , resolved_klass , method_name , method_signature , current_klass , check_access , CHECK ) ;
assert ( resolved_method - > name ( ) ! = vmSymbols : : object_initializer_name ( ) , " should have been checked in verifier " ) ;
assert ( resolved_method - > name ( ) ! = vmSymbols : : class_initializer_name ( ) , " should have been checked in verifier " ) ;
}
// throws runtime exceptions
void LinkResolver : : runtime_resolve_interface_method ( CallInfo & result , methodHandle resolved_method , KlassHandle resolved_klass ,
Handle recv , KlassHandle recv_klass , bool check_null_and_abstract , TRAPS ) {
// check if receiver exists
if ( check_null_and_abstract & & recv . is_null ( ) ) {
THROW ( vmSymbols : : java_lang_NullPointerException ( ) ) ;
}
// check if receiver klass implements the resolved interface
if ( ! recv_klass - > is_subtype_of ( resolved_klass ( ) ) ) {
2011-05-05 07:51:05 -07:00
ResourceMark rm ( THREAD ) ;
2007-12-01 00:00:00 +00:00
char buf [ 200 ] ;
jio_snprintf ( buf , sizeof ( buf ) , " Class %s does not implement the requested interface %s " ,
( Klass : : cast ( recv_klass ( ) ) ) - > external_name ( ) ,
( Klass : : cast ( resolved_klass ( ) ) ) - > external_name ( ) ) ;
THROW_MSG ( vmSymbols : : java_lang_IncompatibleClassChangeError ( ) , buf ) ;
}
// do lookup based on receiver klass
methodHandle sel_method ;
lookup_instance_method_in_klasses ( sel_method , recv_klass ,
2011-01-27 16:11:27 -08:00
resolved_method - > name ( ) ,
resolved_method - > signature ( ) , CHECK ) ;
2007-12-01 00:00:00 +00:00
// check if method exists
if ( sel_method . is_null ( ) ) {
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_AbstractMethodError ( ) ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( recv_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
resolved_method - > name ( ) ,
resolved_method - > signature ( ) ) ) ;
}
// check if public
if ( ! sel_method - > is_public ( ) ) {
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_IllegalAccessError ( ) ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( recv_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
sel_method - > name ( ) ,
sel_method - > signature ( ) ) ) ;
}
// check if abstract
if ( check_null_and_abstract & & sel_method - > is_abstract ( ) ) {
ResourceMark rm ( THREAD ) ;
THROW_MSG ( vmSymbols : : java_lang_AbstractMethodError ( ) ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
Method : : name_and_sig_as_C_string ( Klass : : cast ( recv_klass ( ) ) ,
2007-12-01 00:00:00 +00:00
sel_method - > name ( ) ,
sel_method - > signature ( ) ) ) ;
}
// setup result
result . set_interface ( resolved_klass , recv_klass , resolved_method , sel_method , CHECK ) ;
}
methodHandle LinkResolver : : linktime_resolve_interface_method_or_null (
KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * method_name ,
Symbol * method_signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ,
bool check_access ) {
EXCEPTION_MARK ;
methodHandle method_result ;
linktime_resolve_interface_method ( method_result , resolved_klass , method_name , method_signature , current_klass , check_access , THREAD ) ;
if ( HAS_PENDING_EXCEPTION ) {
CLEAR_PENDING_EXCEPTION ;
return methodHandle ( ) ;
} else {
return method_result ;
}
}
methodHandle LinkResolver : : linktime_resolve_virtual_method_or_null (
KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * method_name ,
Symbol * method_signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ,
bool check_access ) {
EXCEPTION_MARK ;
methodHandle method_result ;
linktime_resolve_virtual_method ( method_result , resolved_klass , method_name , method_signature , current_klass , check_access , THREAD ) ;
if ( HAS_PENDING_EXCEPTION ) {
CLEAR_PENDING_EXCEPTION ;
return methodHandle ( ) ;
} else {
return method_result ;
}
}
methodHandle LinkResolver : : resolve_virtual_call_or_null (
KlassHandle receiver_klass ,
KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * name ,
Symbol * signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ) {
EXCEPTION_MARK ;
CallInfo info ;
resolve_virtual_call ( info , Handle ( ) , receiver_klass , resolved_klass , name , signature , current_klass , true , false , THREAD ) ;
if ( HAS_PENDING_EXCEPTION ) {
CLEAR_PENDING_EXCEPTION ;
return methodHandle ( ) ;
}
return info . selected_method ( ) ;
}
methodHandle LinkResolver : : resolve_interface_call_or_null (
KlassHandle receiver_klass ,
KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * name ,
Symbol * signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ) {
EXCEPTION_MARK ;
CallInfo info ;
resolve_interface_call ( info , Handle ( ) , receiver_klass , resolved_klass , name , signature , current_klass , true , false , THREAD ) ;
if ( HAS_PENDING_EXCEPTION ) {
CLEAR_PENDING_EXCEPTION ;
return methodHandle ( ) ;
}
return info . selected_method ( ) ;
}
int LinkResolver : : resolve_virtual_vtable_index (
KlassHandle receiver_klass ,
KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * name ,
Symbol * signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ) {
EXCEPTION_MARK ;
CallInfo info ;
resolve_virtual_call ( info , Handle ( ) , receiver_klass , resolved_klass , name , signature , current_klass , true , false , THREAD ) ;
if ( HAS_PENDING_EXCEPTION ) {
CLEAR_PENDING_EXCEPTION ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
return Method : : invalid_vtable_index ;
2007-12-01 00:00:00 +00:00
}
return info . vtable_index ( ) ;
}
methodHandle LinkResolver : : resolve_static_call_or_null (
KlassHandle resolved_klass ,
2011-01-27 16:11:27 -08:00
Symbol * name ,
Symbol * signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ) {
EXCEPTION_MARK ;
CallInfo info ;
resolve_static_call ( info , resolved_klass , name , signature , current_klass , true , false , THREAD ) ;
if ( HAS_PENDING_EXCEPTION ) {
CLEAR_PENDING_EXCEPTION ;
return methodHandle ( ) ;
}
return info . selected_method ( ) ;
}
2011-01-27 16:11:27 -08:00
methodHandle LinkResolver : : resolve_special_call_or_null ( KlassHandle resolved_klass , Symbol * name , Symbol * signature ,
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ) {
EXCEPTION_MARK ;
CallInfo info ;
resolve_special_call ( info , resolved_klass , name , signature , current_klass , true , THREAD ) ;
if ( HAS_PENDING_EXCEPTION ) {
CLEAR_PENDING_EXCEPTION ;
return methodHandle ( ) ;
}
return info . selected_method ( ) ;
}
//------------------------------------------------------------------------------------------------------------------------
// ConstantPool entries
void LinkResolver : : resolve_invoke ( CallInfo & result , Handle recv , constantPoolHandle pool , int index , Bytecodes : : Code byte , TRAPS ) {
switch ( byte ) {
case Bytecodes : : _invokestatic : resolve_invokestatic ( result , pool , index , CHECK ) ; break ;
case Bytecodes : : _invokespecial : resolve_invokespecial ( result , pool , index , CHECK ) ; break ;
case Bytecodes : : _invokevirtual : resolve_invokevirtual ( result , recv , pool , index , CHECK ) ; break ;
2012-07-24 10:51:00 -07:00
case Bytecodes : : _invokehandle : resolve_invokehandle ( result , pool , index , CHECK ) ; break ;
2009-04-21 23:21:04 -07:00
case Bytecodes : : _invokedynamic : resolve_invokedynamic ( result , pool , index , CHECK ) ; break ;
2007-12-01 00:00:00 +00:00
case Bytecodes : : _invokeinterface : resolve_invokeinterface ( result , recv , pool , index , CHECK ) ; break ;
}
return ;
}
2011-01-27 16:11:27 -08:00
void LinkResolver : : resolve_pool ( KlassHandle & resolved_klass , Symbol * & method_name , Symbol * & method_signature ,
2007-12-01 00:00:00 +00:00
KlassHandle & current_klass , constantPoolHandle pool , int index , TRAPS ) {
// resolve klass
resolve_klass ( resolved_klass , pool , index , CHECK ) ;
// Get name, signature, and static klass
2011-01-27 16:11:27 -08:00
method_name = pool - > name_ref_at ( index ) ;
method_signature = pool - > signature_ref_at ( index ) ;
2007-12-01 00:00:00 +00:00
current_klass = KlassHandle ( THREAD , pool - > pool_holder ( ) ) ;
}
void LinkResolver : : resolve_invokestatic ( CallInfo & result , constantPoolHandle pool , int index , TRAPS ) {
KlassHandle resolved_klass ;
2011-01-27 16:11:27 -08:00
Symbol * method_name = NULL ;
Symbol * method_signature = NULL ;
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ;
resolve_pool ( resolved_klass , method_name , method_signature , current_klass , pool , index , CHECK ) ;
resolve_static_call ( result , resolved_klass , method_name , method_signature , current_klass , true , true , CHECK ) ;
}
void LinkResolver : : resolve_invokespecial ( CallInfo & result , constantPoolHandle pool , int index , TRAPS ) {
KlassHandle resolved_klass ;
2011-01-27 16:11:27 -08:00
Symbol * method_name = NULL ;
Symbol * method_signature = NULL ;
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ;
resolve_pool ( resolved_klass , method_name , method_signature , current_klass , pool , index , CHECK ) ;
resolve_special_call ( result , resolved_klass , method_name , method_signature , current_klass , true , CHECK ) ;
}
void LinkResolver : : resolve_invokevirtual ( CallInfo & result , Handle recv ,
constantPoolHandle pool , int index ,
TRAPS ) {
KlassHandle resolved_klass ;
2011-01-27 16:11:27 -08:00
Symbol * method_name = NULL ;
Symbol * method_signature = NULL ;
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ;
resolve_pool ( resolved_klass , method_name , method_signature , current_klass , pool , index , CHECK ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
KlassHandle recvrKlass ( THREAD , recv . is_null ( ) ? ( Klass * ) NULL : recv - > klass ( ) ) ;
2007-12-01 00:00:00 +00:00
resolve_virtual_call ( result , recv , recvrKlass , resolved_klass , method_name , method_signature , current_klass , true , true , CHECK ) ;
}
void LinkResolver : : resolve_invokeinterface ( CallInfo & result , Handle recv , constantPoolHandle pool , int index , TRAPS ) {
KlassHandle resolved_klass ;
2011-01-27 16:11:27 -08:00
Symbol * method_name = NULL ;
Symbol * method_signature = NULL ;
2007-12-01 00:00:00 +00:00
KlassHandle current_klass ;
resolve_pool ( resolved_klass , method_name , method_signature , current_klass , pool , index , CHECK ) ;
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
KlassHandle recvrKlass ( THREAD , recv . is_null ( ) ? ( Klass * ) NULL : recv - > klass ( ) ) ;
2007-12-01 00:00:00 +00:00
resolve_interface_call ( result , recv , recvrKlass , resolved_klass , method_name , method_signature , current_klass , true , true , CHECK ) ;
}
2009-04-21 23:21:04 -07:00
2012-07-24 10:51:00 -07:00
void LinkResolver : : resolve_invokehandle ( CallInfo & result , constantPoolHandle pool , int index , TRAPS ) {
assert ( EnableInvokeDynamic , " " ) ;
// This guy is reached from InterpreterRuntime::resolve_invokehandle.
KlassHandle resolved_klass ;
Symbol * method_name = NULL ;
Symbol * method_signature = NULL ;
KlassHandle current_klass ;
resolve_pool ( resolved_klass , method_name , method_signature , current_klass , pool , index , CHECK ) ;
if ( TraceMethodHandles )
tty - > print_cr ( " resolve_invokehandle %s %s " , method_name - > as_C_string ( ) , method_signature - > as_C_string ( ) ) ;
resolve_handle_call ( result , resolved_klass , method_name , method_signature , current_klass , CHECK ) ;
}
void LinkResolver : : resolve_handle_call ( CallInfo & result , KlassHandle resolved_klass ,
Symbol * method_name , Symbol * method_signature ,
KlassHandle current_klass ,
TRAPS ) {
// JSR 292: this must be an implicitly generated method MethodHandle.invokeExact(*...) or similar
assert ( resolved_klass ( ) = = SystemDictionary : : MethodHandle_klass ( ) , " " ) ;
assert ( MethodHandles : : is_signature_polymorphic_name ( method_name ) , " " ) ;
methodHandle resolved_method ;
Handle resolved_appendix ;
lookup_polymorphic_method ( resolved_method , resolved_klass ,
method_name , method_signature ,
current_klass , & resolved_appendix , CHECK ) ;
result . set_handle ( resolved_method , resolved_appendix , CHECK ) ;
}
void LinkResolver : : resolve_invokedynamic ( CallInfo & result , constantPoolHandle pool , int index , TRAPS ) {
2009-04-21 23:21:04 -07:00
assert ( EnableInvokeDynamic , " " ) ;
2012-07-24 10:51:00 -07:00
pool - > set_invokedynamic ( ) ; // mark header to flag active call sites
//resolve_pool(<resolved_klass>, method_name, method_signature, current_klass, pool, index, CHECK);
Symbol * method_name = pool - > name_ref_at ( index ) ;
Symbol * method_signature = pool - > signature_ref_at ( index ) ;
KlassHandle current_klass = KlassHandle ( THREAD , pool - > pool_holder ( ) ) ;
// Resolve the bootstrap specifier (BSM + optional arguments).
Handle bootstrap_specifier ;
// Check if CallSite has been bound already:
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
ConstantPoolCacheEntry * cpce = pool - > invokedynamic_cp_cache_entry_at ( index ) ;
2012-07-24 10:51:00 -07:00
if ( cpce - > is_f1_null ( ) ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
int pool_index = cpce - > constant_pool_index ( ) ;
2012-07-24 10:51:00 -07:00
oop bsm_info = pool - > resolve_bootstrap_specifier_at ( pool_index , CHECK ) ;
assert ( bsm_info ! = NULL , " " ) ;
// FIXME: Cache this once per BootstrapMethods entry, not once per CONSTANT_InvokeDynamic.
bootstrap_specifier = Handle ( THREAD , bsm_info ) ;
}
if ( ! cpce - > is_f1_null ( ) ) {
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
methodHandle method ( THREAD , cpce - > f1_as_method ( ) ) ;
Handle appendix ( THREAD , cpce - > appendix_if_resolved ( pool ) ) ;
2012-07-24 10:51:00 -07:00
result . set_handle ( method , appendix , CHECK ) ;
return ;
}
2009-04-21 23:21:04 -07:00
2012-07-24 10:51:00 -07:00
if ( TraceMethodHandles ) {
tty - > print_cr ( " resolve_invokedynamic #%d %s %s " ,
6964458: Reimplement class meta-data storage to use native memory
Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Co-authored-by: Stefan Karlsson <stefan.karlsson@oracle.com>
Co-authored-by: Mikael Gerdin <mikael.gerdin@oracle.com>
Co-authored-by: Tom Rodriguez <tom.rodriguez@oracle.com>
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
2012-09-01 13:25:18 -04:00
ConstantPool : : decode_invokedynamic_index ( index ) ,
2012-07-24 10:51:00 -07:00
method_name - > as_C_string ( ) , method_signature - > as_C_string ( ) ) ;
tty - > print ( " BSM info: " ) ; bootstrap_specifier - > print ( ) ;
}
2009-04-21 23:21:04 -07:00
2012-07-24 10:51:00 -07:00
resolve_dynamic_call ( result , bootstrap_specifier , method_name , method_signature , current_klass , CHECK ) ;
}
2009-04-21 23:21:04 -07:00
2012-07-24 10:51:00 -07:00
void LinkResolver : : resolve_dynamic_call ( CallInfo & result ,
Handle bootstrap_specifier ,
Symbol * method_name , Symbol * method_signature ,
KlassHandle current_klass ,
TRAPS ) {
// JSR 292: this must resolve to an implicitly generated method MH.linkToCallSite(*...)
// The appendix argument is likely to be a freshly-created CallSite.
Handle resolved_appendix ;
methodHandle resolved_method =
SystemDictionary : : find_dynamic_call_site_invoker ( current_klass ,
bootstrap_specifier ,
method_name , method_signature ,
& resolved_appendix ,
2012-09-04 18:01:20 -07:00
THREAD ) ;
2011-06-01 23:25:20 -07:00
if ( HAS_PENDING_EXCEPTION ) {
2012-07-24 10:51:00 -07:00
if ( TraceMethodHandles ) {
tty - > print_cr ( " invokedynamic throws BSME for " INTPTR_FORMAT , PENDING_EXCEPTION ) ;
PENDING_EXCEPTION - > print ( ) ;
}
2011-06-01 23:25:20 -07:00
if ( PENDING_EXCEPTION - > is_a ( SystemDictionary : : BootstrapMethodError_klass ( ) ) ) {
// throw these guys, since they are already wrapped
return ;
}
if ( ! PENDING_EXCEPTION - > is_a ( SystemDictionary : : LinkageError_klass ( ) ) ) {
// intercept only LinkageErrors which might have failed to wrap
return ;
}
// See the "Linking Exceptions" section for the invokedynamic instruction in the JVMS.
2012-07-24 10:51:00 -07:00
Handle nested_exception ( THREAD , PENDING_EXCEPTION ) ;
2011-06-01 23:25:20 -07:00
CLEAR_PENDING_EXCEPTION ;
2012-09-04 18:01:20 -07:00
THROW_CAUSE ( vmSymbols : : java_lang_BootstrapMethodError ( ) , nested_exception )
2009-04-21 23:21:04 -07:00
}
2012-07-24 10:51:00 -07:00
result . set_handle ( resolved_method , resolved_appendix , CHECK ) ;
2009-04-21 23:21:04 -07:00
}
2007-12-01 00:00:00 +00:00
//------------------------------------------------------------------------------------------------------------------------
# ifndef PRODUCT
void FieldAccessInfo : : print ( ) {
ResourceMark rm ;
tty - > print_cr ( " Field %s@%d " , name ( ) - > as_C_string ( ) , field_offset ( ) ) ;
}
# endif