65 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) { 66 assert(vtable_index >= 0 || vtable_index == methodOopDesc::nonvirtual_vtable_index, "valid index"); 67 set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK); 68 } 69 70 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) { 71 assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond"); 72 _resolved_klass = resolved_klass; 73 _selected_klass = selected_klass; 74 _resolved_method = resolved_method; 75 _selected_method = selected_method; 76 _vtable_index = vtable_index; 77 if (CompilationPolicy::mustBeCompiled(selected_method)) { 78 // Note: with several active threads, the mustBeCompiled may be true 79 // while canBeCompiled is false; remove assert 80 // assert(CompilationPolicy::canBeCompiled(selected_method), "cannot compile"); 81 if (THREAD->is_Compiler_thread()) { 82 // don't force compilation, resolve was on behalf of compiler 83 return; 84 } 85 CompileBroker::compile_method(selected_method, InvocationEntryBci, 86 methodHandle(), 0, "mustBeCompiled", CHECK); 87 } 88 } 89 90 91 //------------------------------------------------------------------------------------------------------------------------ 92 // Klass resolution 93 94 void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) { 95 if (!Reflection::verify_class_access(ref_klass->as_klassOop(), 96 sel_klass->as_klassOop(), 97 true)) { 98 ResourceMark rm(THREAD); 99 Exceptions::fthrow( 100 THREAD_AND_LOCATION, 101 vmSymbolHandles::java_lang_IllegalAccessError(), 102 "tried to access class %s from class %s", 103 sel_klass->external_name(), 104 ref_klass->external_name() 206 sel_method->signature()->as_C_string(), 207 ref_klass->external_name() 208 ); 209 return; 210 } 211 } 212 213 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle& resolved_klass, 214 constantPoolHandle pool, int index, TRAPS) { 215 216 // resolve klass 217 resolve_klass(resolved_klass, pool, index, CHECK); 218 219 symbolHandle method_name (THREAD, pool->name_ref_at(index)); 220 symbolHandle method_signature (THREAD, pool->signature_ref_at(index)); 221 KlassHandle current_klass(THREAD, pool->pool_holder()); 222 223 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK); 224 } 225 226 void LinkResolver::resolve_interface_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) { 227 228 // resolve klass 229 resolve_klass(resolved_klass, pool, index, CHECK); 230 symbolHandle method_name (THREAD, pool->name_ref_at(index)); 231 symbolHandle method_signature (THREAD, pool->signature_ref_at(index)); 232 KlassHandle current_klass(THREAD, pool->pool_holder()); 233 234 resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK); 235 } 236 237 238 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass, 239 symbolHandle method_name, symbolHandle method_signature, 240 KlassHandle current_klass, bool check_access, TRAPS) { 241 242 // 1. check if klass is not interface 243 if (resolved_klass->is_interface()) { 244 char buf[200]; 245 jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name()); | 65 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) { 66 assert(vtable_index >= 0 || vtable_index == methodOopDesc::nonvirtual_vtable_index, "valid index"); 67 set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK); 68 } 69 70 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) { 71 assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond"); 72 _resolved_klass = resolved_klass; 73 _selected_klass = selected_klass; 74 _resolved_method = resolved_method; 75 _selected_method = selected_method; 76 _vtable_index = vtable_index; 77 if (CompilationPolicy::mustBeCompiled(selected_method)) { 78 // Note: with several active threads, the mustBeCompiled may be true 79 // while canBeCompiled is false; remove assert 80 // assert(CompilationPolicy::canBeCompiled(selected_method), "cannot compile"); 81 if (THREAD->is_Compiler_thread()) { 82 // don't force compilation, resolve was on behalf of compiler 83 return; 84 } 85 if (instanceKlass::cast(selected_method->method_holder())->is_not_initialized()) { 86 // Do not force compilation of methods in uninitialized classes. 87 // Note that doing this would throw an assert later, 88 // in CompileBroker::compile_method. 89 // We sometimes use the link resolver to do reflective lookups 90 // even before classes are initialized. 91 return; 92 } 93 CompileBroker::compile_method(selected_method, InvocationEntryBci, 94 methodHandle(), 0, "mustBeCompiled", CHECK); 95 } 96 } 97 98 99 //------------------------------------------------------------------------------------------------------------------------ 100 // Klass resolution 101 102 void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) { 103 if (!Reflection::verify_class_access(ref_klass->as_klassOop(), 104 sel_klass->as_klassOop(), 105 true)) { 106 ResourceMark rm(THREAD); 107 Exceptions::fthrow( 108 THREAD_AND_LOCATION, 109 vmSymbolHandles::java_lang_IllegalAccessError(), 110 "tried to access class %s from class %s", 111 sel_klass->external_name(), 112 ref_klass->external_name() 214 sel_method->signature()->as_C_string(), 215 ref_klass->external_name() 216 ); 217 return; 218 } 219 } 220 221 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle& resolved_klass, 222 constantPoolHandle pool, int index, TRAPS) { 223 224 // resolve klass 225 resolve_klass(resolved_klass, pool, index, CHECK); 226 227 symbolHandle method_name (THREAD, pool->name_ref_at(index)); 228 symbolHandle method_signature (THREAD, pool->signature_ref_at(index)); 229 KlassHandle current_klass(THREAD, pool->pool_holder()); 230 231 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK); 232 } 233 234 void LinkResolver::resolve_dynamic_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) { 235 // The class is java.dyn.MethodHandle 236 resolved_klass = SystemDictionaryHandles::MethodHandle_klass(); 237 238 symbolHandle method_name = vmSymbolHandles::invoke_name(); 239 240 symbolHandle method_signature(THREAD, pool->signature_ref_at(index)); 241 KlassHandle current_klass (THREAD, pool->pool_holder()); 242 243 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK); 244 } 245 246 void LinkResolver::resolve_interface_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) { 247 248 // resolve klass 249 resolve_klass(resolved_klass, pool, index, CHECK); 250 symbolHandle method_name (THREAD, pool->name_ref_at(index)); 251 symbolHandle method_signature (THREAD, pool->signature_ref_at(index)); 252 KlassHandle current_klass(THREAD, pool->pool_holder()); 253 254 resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK); 255 } 256 257 258 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass, 259 symbolHandle method_name, symbolHandle method_signature, 260 KlassHandle current_klass, bool check_access, TRAPS) { 261 262 // 1. check if klass is not interface 263 if (resolved_klass->is_interface()) { 264 char buf[200]; 265 jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name()); |