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