annotate src/share/vm/interpreter/linkResolver.cpp @ 14649:f6301b007a16

6498581: ThreadInterruptTest3 produces wrong output on Windows Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set. Reviewed-by: acorn, kvn Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author minqi
date Wed, 26 Feb 2014 15:20:41 -0800
parents f3959a2e0eee
children d8041d695d19 386dd1c71858
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
14279
7e072af80503 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 14221
diff changeset
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1508
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1508
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1508
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
25 #include "precompiled.hpp"
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6822
diff changeset
26 #include "classfile/defaultMethods.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
27 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
28 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
29 #include "compiler/compileBroker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
30 #include "gc_interface/collectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
31 #include "interpreter/bytecode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
32 #include "interpreter/interpreterRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
33 #include "interpreter/linkResolver.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
34 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
35 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
36 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
37 #include "oops/objArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
38 #include "prims/methodHandles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
39 #include "prims/nativeLookup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
40 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
41 #include "runtime/fieldDescriptor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
42 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
43 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
44 #include "runtime/reflection.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
45 #include "runtime/signature.hpp"
7180
f34d701e952e 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 6983
diff changeset
46 #include "runtime/thread.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
47 #include "runtime/vmThread.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // Implementation of CallInfo
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 void CallInfo::set_static(KlassHandle resolved_klass, methodHandle resolved_method, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
55 int vtable_index = Method::nonvirtual_vtable_index;
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
56 set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
57 }
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
60 void CallInfo::set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int itable_index, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // This is only called for interface methods. If the resolved_method
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // comes from java/lang/Object, it can be the subject of a virtual call, so
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // we should pick the vtable index from the resolved method.
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
64 // In that case, the caller must call set_virtual instead of set_interface.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
65 assert(resolved_method->method_holder()->is_interface(), "");
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
66 assert(itable_index == resolved_method()->itable_index(), "");
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
67 set_common(resolved_klass, selected_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
71 assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, "valid index");
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
72 assert(vtable_index < 0 || !resolved_method->has_vtable_index() || vtable_index == resolved_method->vtable_index(), "");
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
73 CallKind kind = (vtable_index >= 0 && !resolved_method->can_be_statically_bound() ? CallInfo::vtable_call : CallInfo::direct_call);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
74 set_common(resolved_klass, selected_klass, resolved_method, selected_method, kind, vtable_index, CHECK);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
75 assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
76 }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
78 void CallInfo::set_handle(methodHandle resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
79 if (resolved_method.is_null()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
80 THROW_MSG(vmSymbols::java_lang_InternalError(), "resolved method is null");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
81 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
82 KlassHandle resolved_klass = SystemDictionary::MethodHandle_klass();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
83 assert(resolved_method->intrinsic_id() == vmIntrinsics::_invokeBasic ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
84 resolved_method->is_compiled_lambda_form(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
85 "linkMethod must return one of these");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
86 int vtable_index = Method::nonvirtual_vtable_index;
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
87 assert(!resolved_method->has_vtable_index(), "");
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
88 set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
89 _resolved_appendix = resolved_appendix;
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
90 _resolved_method_type = resolved_method_type;
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1552
diff changeset
91 }
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1552
diff changeset
92
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
93 void CallInfo::set_common(KlassHandle resolved_klass,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
94 KlassHandle selected_klass,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
95 methodHandle resolved_method,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
96 methodHandle selected_method,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
97 CallKind kind,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
98 int index,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
99 TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
100 assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
a61af66fc99e Initial load
duke
parents:
diff changeset
101 _resolved_klass = resolved_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _selected_klass = selected_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 _resolved_method = resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _selected_method = selected_method;
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
105 _call_kind = kind;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
106 _call_index = index;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
107 _resolved_appendix = Handle();
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
108 DEBUG_ONLY(verify()); // verify before making side effects
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
109
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1660
diff changeset
110 if (CompilationPolicy::must_be_compiled(selected_method)) {
1135
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
111 // This path is unusual, mostly used by the '-Xcomp' stress test mode.
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
112
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1660
diff changeset
113 // Note: with several active threads, the must_be_compiled may be true
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1660
diff changeset
114 // while can_be_compiled is false; remove assert
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1660
diff changeset
115 // assert(CompilationPolicy::can_be_compiled(selected_method), "cannot compile");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
116 if (THREAD->is_Compiler_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // don't force compilation, resolve was on behalf of compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
118 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
120 if (selected_method->method_holder()->is_not_initialized()) {
1135
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
121 // 'is_not_initialized' means not only '!is_initialized', but also that
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
122 // initialization has not been started yet ('!being_initialized')
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
123 // Do not force compilation of methods in uninitialized classes.
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
124 // Note that doing this would throw an assert later,
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
125 // in CompileBroker::compile_method.
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
126 // We sometimes use the link resolver to do reflective lookups
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
127 // even before classes are initialized.
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
128 return;
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
129 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 CompileBroker::compile_method(selected_method, InvocationEntryBci,
3837
43f9d800f276 7066339: Tiered: policy should make consistent decisions about osr levels
iveresov
parents: 3785
diff changeset
131 CompilationPolicy::policy()->initial_compile_level(),
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1660
diff changeset
132 methodHandle(), 0, "must_be_compiled", CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
136 // utility query for unreflecting a method
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
137 CallInfo::CallInfo(Method* resolved_method, Klass* resolved_klass) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
138 Klass* resolved_method_holder = resolved_method->method_holder();
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
139 if (resolved_klass == NULL) { // 2nd argument defaults to holder of 1st
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
140 resolved_klass = resolved_method_holder;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
141 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
142 _resolved_klass = resolved_klass;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
143 _selected_klass = resolved_klass;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
144 _resolved_method = resolved_method;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
145 _selected_method = resolved_method;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
146 // classify:
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
147 CallKind kind = CallInfo::unknown_kind;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
148 int index = resolved_method->vtable_index();
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
149 if (resolved_method->can_be_statically_bound()) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
150 kind = CallInfo::direct_call;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
151 } else if (!resolved_method_holder->is_interface()) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
152 // Could be an Object method inherited into an interface, but still a vtable call.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
153 kind = CallInfo::vtable_call;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
154 } else if (!resolved_klass->is_interface()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
155 // A default or miranda method. Compute the vtable index.
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
156 ResourceMark rm;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
157 klassVtable* vt = InstanceKlass::cast(resolved_klass)->vtable();
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
158 index = LinkResolver::vtable_index_of_interface_method(resolved_klass,
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
159 resolved_method);
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
160 assert(index >= 0 , "we should have valid vtable index at this point");
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
161
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
162 kind = CallInfo::vtable_call;
12885
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
163 } else if (resolved_method->has_vtable_index()) {
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
164 // Can occur if an interface redeclares a method of Object.
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
165
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
166 #ifdef ASSERT
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
167 // Ensure that this is really the case.
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
168 KlassHandle object_klass = SystemDictionary::Object_klass();
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
169 Method * object_resolved_method = object_klass()->vtable()->method_at(index);
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
170 assert(object_resolved_method->name() == resolved_method->name(),
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
171 err_msg("Object and interface method names should match at vtable index %d, %s != %s",
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
172 index, object_resolved_method->name()->as_C_string(), resolved_method->name()->as_C_string()));
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
173 assert(object_resolved_method->signature() == resolved_method->signature(),
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
174 err_msg("Object and interface method signatures should match at vtable index %d, %s != %s",
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
175 index, object_resolved_method->signature()->as_C_string(), resolved_method->signature()->as_C_string()));
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
176 #endif // ASSERT
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
177
8df6f123d35e 8026124: JSR-292 bug: java.nio.file.Path.toString cores dump
drchase
parents: 12823
diff changeset
178 kind = CallInfo::vtable_call;
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
179 } else {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
180 // A regular interface call.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
181 kind = CallInfo::itable_call;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
182 index = resolved_method->itable_index();
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
183 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
184 assert(index == Method::nonvirtual_vtable_index || index >= 0, err_msg("bad index %d", index));
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
185 _call_kind = kind;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
186 _call_index = index;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
187 _resolved_appendix = Handle();
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
188 DEBUG_ONLY(verify());
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
189 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
190
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
191 #ifdef ASSERT
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
192 void CallInfo::verify() {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
193 switch (call_kind()) { // the meaning and allowed value of index depends on kind
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
194 case CallInfo::direct_call:
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
195 if (_call_index == Method::nonvirtual_vtable_index) break;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
196 // else fall through to check vtable index:
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
197 case CallInfo::vtable_call:
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
198 assert(resolved_klass()->verify_vtable_index(_call_index), "");
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
199 break;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
200 case CallInfo::itable_call:
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
201 assert(resolved_method()->method_holder()->verify_itable_index(_call_index), "");
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
202 break;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
203 case CallInfo::unknown_kind:
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
204 assert(call_kind() != CallInfo::unknown_kind, "CallInfo must be set");
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
205 break;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
206 default:
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
207 fatal(err_msg_res("Unexpected call kind %d", call_kind()));
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
208 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
209 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
210 #endif //ASSERT
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
211
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
212
0
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Klass resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 void LinkResolver::check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
218 if (!Reflection::verify_class_access(ref_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
219 sel_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220 true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
223 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
224 vmSymbols::java_lang_IllegalAccessError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
225 "tried to access class %s from class %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
226 sel_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
227 ref_klass->external_name()
a61af66fc99e Initial load
duke
parents:
diff changeset
228 );
a61af66fc99e Initial load
duke
parents:
diff changeset
229 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
234 Klass* result_oop = pool->klass_ref_at(index, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
235 result = KlassHandle(THREAD, result_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Method resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
240 //
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // According to JVM spec. $5.4.3c & $5.4.3d
a61af66fc99e Initial load
duke
parents:
diff changeset
242
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
243 // Look up method in klasses, including static methods
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
244 // Then look up local default methods
14208
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
245 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, bool checkpolymorphism, bool in_imethod_resolve, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
246 Method* result_oop = klass->uncached_lookup_method(name, signature);
14208
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
247
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
248 // JDK 8, JVMS 5.4.3.4: Interface method resolution should
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
249 // ignore static and non-public methods of java.lang.Object,
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
250 // like clone, finalize, registerNatives.
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
251 if (in_imethod_resolve &&
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
252 result_oop != NULL &&
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
253 klass->is_interface() &&
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
254 (result_oop->is_static() || !result_oop->is_public()) &&
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
255 result_oop->method_holder() == SystemDictionary::Object_klass()) {
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
256 result_oop = NULL;
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
257 }
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
258
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
259 if (result_oop == NULL) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
260 Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
261 if (default_methods != NULL) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
262 result_oop = InstanceKlass::find_method(default_methods, name, signature);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
263 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
264 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
265
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
266 if (checkpolymorphism && EnableInvokeDynamic && result_oop != NULL) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
267 vmIntrinsics::ID iid = result_oop->intrinsic_id();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
268 if (MethodHandles::is_signature_polymorphic(iid)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
269 // Do not link directly to these. The VM must produce a synthetic one using lookup_polymorphic_method.
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1142
diff changeset
270 return;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1142
diff changeset
271 }
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1142
diff changeset
272 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
273 result = methodHandle(THREAD, result_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // returns first instance method
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
277 // Looks up method in classes, then looks up local default methods
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
278 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
279 Method* result_oop = klass->uncached_lookup_method(name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
280 result = methodHandle(THREAD, result_oop);
12934
d248425bcfe8 8024804: Crash when InterfaceMethodref resolves to Object.registerNatives
hseigel
parents: 12858
diff changeset
281 while (!result.is_null() && result->is_static() && result->method_holder()->super() != NULL) {
13414
379f11bc04fc 8028438: static superclass method masks default methods
acorn
parents: 13413
diff changeset
282 KlassHandle super_klass = KlassHandle(THREAD, result->method_holder()->super());
379f11bc04fc 8028438: static superclass method masks default methods
acorn
parents: 13413
diff changeset
283 result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
285
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
286 if (result.is_null()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
287 Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
288 if (default_methods != NULL) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
289 result = methodHandle(InstanceKlass::find_method(default_methods, name, signature));
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
290 assert(result.is_null() || !result->is_static(), "static defaults not allowed");
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
291 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
292 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
295 int LinkResolver::vtable_index_of_interface_method(KlassHandle klass,
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
296 methodHandle resolved_method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
297
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
298 int vtable_index = Method::invalid_vtable_index;
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
299 Symbol* name = resolved_method->name();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
300 Symbol* signature = resolved_method->signature();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
301
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
302 // First check in default method array
14221
2353011244bd 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 14208
diff changeset
303 if (!resolved_method->is_abstract() &&
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
304 (InstanceKlass::cast(klass())->default_methods() != NULL)) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
305 int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
306 if (index >= 0 ) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
307 vtable_index = InstanceKlass::cast(klass())->default_vtable_indices()->at(index);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
308 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
309 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
310 if (vtable_index == Method::invalid_vtable_index) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
311 // get vtable_index for miranda methods
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
312 ResourceMark rm;
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
313 klassVtable *vt = InstanceKlass::cast(klass())->vtable();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
314 vtable_index = vt->index_of_miranda(name, signature);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
315 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
316 return vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
319 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
320 InstanceKlass *ik = InstanceKlass::cast(klass());
14221
2353011244bd 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 14208
diff changeset
321
2353011244bd 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 14208
diff changeset
322 // Specify 'true' in order to skip default methods when searching the
2353011244bd 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 14208
diff changeset
323 // interfaces. Function lookup_method_in_klasses() already looked for
2353011244bd 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 14208
diff changeset
324 // the method in the default methods table.
2353011244bd 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 14208
diff changeset
325 result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, true));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
328 void LinkResolver::lookup_polymorphic_method(methodHandle& result,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
329 KlassHandle klass, Symbol* name, Symbol* full_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
330 KlassHandle current_klass,
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
331 Handle *appendix_result_or_null,
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
332 Handle *method_type_result,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
333 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
334 vmIntrinsics::ID iid = MethodHandles::signature_polymorphic_name_id(name);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
335 if (TraceMethodHandles) {
9082
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
336 ResourceMark rm(THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
337 tty->print_cr("lookup_polymorphic_method iid=%s %s.%s%s",
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
338 vmIntrinsics::name_at(iid), klass->external_name(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
339 name->as_C_string(), full_signature->as_C_string());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
340 }
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2359
diff changeset
341 if (EnableInvokeDynamic &&
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1142
diff changeset
342 klass() == SystemDictionary::MethodHandle_klass() &&
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
343 iid != vmIntrinsics::_none) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
344 if (MethodHandles::is_signature_polymorphic_intrinsic(iid)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
345 // Most of these do not need an up-call to Java to resolve, so can be done anywhere.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
346 // Do not erase last argument type (MemberName) if it is a static linkTo method.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
347 bool keep_last_arg = MethodHandles::is_signature_polymorphic_static(iid);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
348 TempNewSymbol basic_signature =
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
349 MethodHandles::lookup_basic_type_signature(full_signature, keep_last_arg, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
350 if (TraceMethodHandles) {
9082
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
351 ResourceMark rm(THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
352 tty->print_cr("lookup_polymorphic_method %s %s => basic %s",
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
353 name->as_C_string(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
354 full_signature->as_C_string(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
355 basic_signature->as_C_string());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
356 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
357 result = SystemDictionary::find_method_handle_intrinsic(iid,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
358 basic_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
359 CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
360 if (result.not_null()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
361 assert(result->is_method_handle_intrinsic(), "MH.invokeBasic or MH.linkTo* intrinsic");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
362 assert(result->intrinsic_id() != vmIntrinsics::_invokeGeneric, "wrong place to find this");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
363 assert(basic_signature == result->signature(), "predict the result signature");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
364 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
365 tty->print("lookup_polymorphic_method => intrinsic ");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
366 result->print_on(tty);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
367 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
368 return;
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1552
diff changeset
369 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
370 } else if (iid == vmIntrinsics::_invokeGeneric
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
371 && !THREAD->is_Compiler_thread()
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
372 && appendix_result_or_null != NULL) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
373 // This is a method with type-checking semantics.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
374 // We will ask Java code to spin an adapter method for it.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
375 if (!MethodHandles::enabled()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
376 // Make sure the Java part of the runtime has been booted up.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
377 Klass* natives = SystemDictionary::MethodHandleNatives_klass();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
378 if (natives == NULL || InstanceKlass::cast(natives)->is_not_initialized()) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
379 SystemDictionary::resolve_or_fail(vmSymbols::java_lang_invoke_MethodHandleNatives(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
380 Handle(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
381 Handle(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
382 true,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
383 CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
384 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
385 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
386
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
387 Handle appendix;
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
388 Handle method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
389 result = SystemDictionary::find_method_handle_invoker(name,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
390 full_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
391 current_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
392 &appendix,
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
393 &method_type,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
394 CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
395 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
396 tty->print("lookup_polymorphic_method => (via Java) ");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
397 result->print_on(tty);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
398 tty->print(" lookup_polymorphic_method => appendix = ");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
399 if (appendix.is_null()) tty->print_cr("(none)");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
400 else appendix->print_on(tty);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
401 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
402 if (result.not_null()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
403 #ifdef ASSERT
9082
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
404 ResourceMark rm(THREAD);
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
405
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
406 TempNewSymbol basic_signature =
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
407 MethodHandles::lookup_basic_type_signature(full_signature, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
408 int actual_size_of_params = result->size_of_parameters();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
409 int expected_size_of_params = ArgumentSizeComputer(basic_signature).size();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
410 // +1 for MethodHandle.this, +1 for trailing MethodType
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
411 if (!MethodHandles::is_signature_polymorphic_static(iid)) expected_size_of_params += 1;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
412 if (appendix.not_null()) expected_size_of_params += 1;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
413 if (actual_size_of_params != expected_size_of_params) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
414 tty->print_cr("*** basic_signature=%s", basic_signature->as_C_string());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
415 tty->print_cr("*** result for %s: ", vmIntrinsics::name_at(iid));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
416 result->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
417 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
418 assert(actual_size_of_params == expected_size_of_params,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
419 err_msg("%d != %d", actual_size_of_params, expected_size_of_params));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
420 #endif //ASSERT
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
421
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
422 assert(appendix_result_or_null != NULL, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
423 (*appendix_result_or_null) = appendix;
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
424 (*method_type_result) = method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
425 return;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
426 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
427 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
428 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
429 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
430
0
a61af66fc99e Initial load
duke
parents:
diff changeset
431 void LinkResolver::check_method_accessability(KlassHandle ref_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
432 KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
433 KlassHandle sel_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
434 methodHandle sel_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
435 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 AccessFlags flags = sel_method->access_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
438
14208
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
439 // Special case: arrays always override "clone". JVMS 2.15.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // If the resolved klass is an array class, and the declaring class
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // is java.lang.Object and the method is "clone", set the flags
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // to public.
a61af66fc99e Initial load
duke
parents:
diff changeset
443 //
14208
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
444 // We'll check for the method name first, as that's most likely
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
445 // to be false (so we'll short-circuit out of these tests).
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
446 if (sel_method->name() == vmSymbols::clone_name() &&
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
447 sel_klass() == SystemDictionary::Object_klass() &&
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
448 resolved_klass->oop_is_array()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // We need to change "protected" to "public".
14208
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
450 assert(flags.is_protected(), "clone not protected?");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
451 jint new_flags = flags.as_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
452 new_flags = new_flags & (~JVM_ACC_PROTECTED);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 new_flags = new_flags | JVM_ACC_PUBLIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
454 flags.set_flags(new_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
456 // assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
457
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
458 if (!Reflection::verify_field_access(ref_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
459 resolved_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
460 sel_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
461 flags,
a61af66fc99e Initial load
duke
parents:
diff changeset
462 true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
463 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
464 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
465 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
466 vmSymbols::java_lang_IllegalAccessError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
467 "tried to access method %s.%s%s from class %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
468 sel_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
469 sel_method->name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
470 sel_method->signature()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
471 ref_klass->external_name()
a61af66fc99e Initial load
duke
parents:
diff changeset
472 );
a61af66fc99e Initial load
duke
parents:
diff changeset
473 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
475 }
a61af66fc99e Initial load
duke
parents:
diff changeset
476
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
477 void LinkResolver::resolve_method_statically(methodHandle& resolved_method, KlassHandle& resolved_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
478 Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS) {
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
479 // This method is used only
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
480 // (1) in C2 from InlineTree::ok_to_inline (via ciMethod::check_call),
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
481 // and
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
482 // (2) in Bytecode_invoke::static_target
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
483 // It appears to fail when applied to an invokeinterface call site.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
484 // FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // resolve klass
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
486 if (code == Bytecodes::_invokedynamic) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
487 resolved_klass = SystemDictionary::MethodHandle_klass();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
488 Symbol* method_name = vmSymbols::invoke_name();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
489 Symbol* method_signature = pool->signature_ref_at(index);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
490 KlassHandle current_klass(THREAD, pool->pool_holder());
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
491 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, false, CHECK);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
492 return;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
493 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
494
0
a61af66fc99e Initial load
duke
parents:
diff changeset
495 resolve_klass(resolved_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
496
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
497 Symbol* method_name = pool->name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
498 Symbol* method_signature = pool->signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
499 KlassHandle current_klass(THREAD, pool->pool_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
500
3785
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
501 if (pool->has_preresolution()
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
502 || (resolved_klass() == SystemDictionary::MethodHandle_klass() &&
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
503 MethodHandles::is_signature_polymorphic_name(resolved_klass(), method_name))) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
504 Method* result_oop = ConstantPool::method_at_if_loaded(pool, index);
3785
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
505 if (result_oop != NULL) {
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
506 resolved_method = methodHandle(THREAD, result_oop);
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
507 return;
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
508 }
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
509 }
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
510
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
511 if (code == Bytecodes::_invokeinterface) {
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
512 resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
513 } else if (code == Bytecodes::_invokevirtual) {
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
514 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
515 } else if (!resolved_klass->is_interface()) {
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
516 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, false, CHECK);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
517 } else {
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
518 bool nostatics = (code == Bytecodes::_invokestatic) ? false : true;
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
519 resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, nostatics, CHECK);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
520 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
522
a61af66fc99e Initial load
duke
parents:
diff changeset
523 void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
524 Symbol* method_name, Symbol* method_signature,
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
525 KlassHandle current_klass, bool check_access,
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
526 bool require_methodref, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
527
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
528 Handle nested_exception;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
529
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
530 // 1. check if methodref required, that resolved_klass is not interfacemethodref
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
531 if (require_methodref && resolved_klass->is_interface()) {
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
532 ResourceMark rm(THREAD);
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
533 char buf[200];
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
534 jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected",
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
535 resolved_klass()->external_name());
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
536 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
537 }
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
538
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
539 // 2. lookup method in resolved klass and its super klasses
14208
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
540 lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, true, false, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542 if (resolved_method.is_null()) { // not found in the class hierarchy
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
543 // 3. lookup method in all the interfaces implemented by the resolved klass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544 lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 if (resolved_method.is_null()) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
547 // JSR 292: see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
548 lookup_polymorphic_method(resolved_method, resolved_klass, method_name, method_signature,
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
549 current_klass, (Handle*)NULL, (Handle*)NULL, THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
550 if (HAS_PENDING_EXCEPTION) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
551 nested_exception = Handle(THREAD, PENDING_EXCEPTION);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
552 CLEAR_PENDING_EXCEPTION;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
553 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
554 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
555
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
556 if (resolved_method.is_null()) {
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
557 // 4. method lookup failed
0
a61af66fc99e Initial load
duke
parents:
diff changeset
558 ResourceMark rm(THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
559 THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
560 Method::name_and_sig_as_C_string(resolved_klass(),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
561 method_name,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
562 method_signature),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
563 nested_exception);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
566
14322
f3959a2e0eee 8032010: Attempt to resolve abstract method in concrete class fails with AbstractMethodError
ccheung
parents: 14279
diff changeset
567 // 5. access checks, access checking may be turned off when calling from within the VM.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
568 if (check_access) {
a61af66fc99e Initial load
duke
parents:
diff changeset
569 assert(current_klass.not_null() , "current_klass should not be null");
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // check if method can be accessed by the referring class
a61af66fc99e Initial load
duke
parents:
diff changeset
572 check_method_accessability(current_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
573 resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
574 KlassHandle(THREAD, resolved_method->method_holder()),
a61af66fc99e Initial load
duke
parents:
diff changeset
575 resolved_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
576 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // check loader constraints
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
579 Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
580 Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
581 {
a61af66fc99e Initial load
duke
parents:
diff changeset
582 ResourceMark rm(THREAD);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
583 Symbol* failed_type_symbol =
0
a61af66fc99e Initial load
duke
parents:
diff changeset
584 SystemDictionary::check_signature_loaders(method_signature, loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
585 class_loader, true, CHECK);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
586 if (failed_type_symbol != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
587 const char* msg = "loader constraint violation: when resolving method"
a61af66fc99e Initial load
duke
parents:
diff changeset
588 " \"%s\" the class loader (instance of %s) of the current class, %s,"
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
589 " and the class loader (instance of %s) for the method's defining class, %s, have"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
590 " different Class objects for the type %s used in the signature";
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
591 char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
592 const char* loader1 = SystemDictionary::loader_name(loader());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
593 char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
594 const char* loader2 = SystemDictionary::loader_name(class_loader());
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
595 char* target = InstanceKlass::cast(resolved_method->method_holder())
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
596 ->name()->as_C_string();
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
597 char* failed_type_name = failed_type_symbol->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
598 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
599 strlen(current) + strlen(loader2) + strlen(target) +
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
600 strlen(failed_type_name) + 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
601 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
602 jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
603 target, failed_type_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
604 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
611 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
612 Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
613 Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
614 KlassHandle current_klass,
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
615 bool check_access,
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
616 bool nostatics, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
617
14221
2353011244bd 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 14208
diff changeset
618 // check if klass is interface
0
a61af66fc99e Initial load
duke
parents:
diff changeset
619 if (!resolved_klass->is_interface()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
620 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
621 char buf[200];
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
622 jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass()->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
623 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // lookup method in this interface or its super, java.lang.Object
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
627 // JDK8: also look for static methods
14208
252066a125de 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 14207
diff changeset
628 lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, false, true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630 if (resolved_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // lookup method in all the super-interfaces
a61af66fc99e Initial load
duke
parents:
diff changeset
632 lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
633 if (resolved_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
634 // no method found
a61af66fc99e Initial load
duke
parents:
diff changeset
635 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
636 THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
637 Method::name_and_sig_as_C_string(resolved_klass(),
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
638 method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
639 method_signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
641 }
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 if (check_access) {
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
644 // JDK8 adds non-public interface methods, and accessability check requirement
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
645 assert(current_klass.not_null() , "current_klass should not be null");
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
646
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
647 // check if method can be accessed by the referring class
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
648 check_method_accessability(current_klass,
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
649 resolved_klass,
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
650 KlassHandle(THREAD, resolved_method->method_holder()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
651 resolved_method,
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
652 CHECK);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
653
0
a61af66fc99e Initial load
duke
parents:
diff changeset
654 HandleMark hm(THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
655 Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
656 Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
657 {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 ResourceMark rm(THREAD);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
659 Symbol* failed_type_symbol =
0
a61af66fc99e Initial load
duke
parents:
diff changeset
660 SystemDictionary::check_signature_loaders(method_signature, loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
661 class_loader, true, CHECK);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
662 if (failed_type_symbol != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
663 const char* msg = "loader constraint violation: when resolving "
a61af66fc99e Initial load
duke
parents:
diff changeset
664 "interface method \"%s\" the class loader (instance of %s) of the "
a61af66fc99e Initial load
duke
parents:
diff changeset
665 "current class, %s, and the class loader (instance of %s) for "
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
666 "the method's defining class, %s, have different Class objects for the type %s "
0
a61af66fc99e Initial load
duke
parents:
diff changeset
667 "used in the signature";
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
668 char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
669 const char* loader1 = SystemDictionary::loader_name(loader());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
670 char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
671 const char* loader2 = SystemDictionary::loader_name(class_loader());
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
672 char* target = InstanceKlass::cast(resolved_method->method_holder())
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
673 ->name()->as_C_string();
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
674 char* failed_type_name = failed_type_symbol->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
675 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
676 strlen(current) + strlen(loader2) + strlen(target) +
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
677 strlen(failed_type_name) + 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
678 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
680 target, failed_type_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
681 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
685
14279
7e072af80503 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 14221
diff changeset
686 if (nostatics && resolved_method->is_static()) {
7e072af80503 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 14221
diff changeset
687 ResourceMark rm(THREAD);
7e072af80503 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 14221
diff changeset
688 char buf[200];
7e072af80503 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 14221
diff changeset
689 jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s",
7e072af80503 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 14221
diff changeset
690 Method::name_and_sig_as_C_string(resolved_klass(),
7e072af80503 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 14221
diff changeset
691 resolved_method->name(), resolved_method->signature()));
7e072af80503 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 14221
diff changeset
692 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
7e072af80503 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 14221
diff changeset
693 }
7e072af80503 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 14221
diff changeset
694
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
695 if (TraceItables && Verbose) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
696 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
697 tty->print("invokeinterface resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
698 (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
699 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
700 Method::name_and_sig_as_C_string(resolved_klass(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
701 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
702 resolved_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
703 resolved_method->method_holder()->internal_name()
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
704 );
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
705 resolved_method->access_flags().print_on(tty);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
706 if (resolved_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
707 tty->print("default ");
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
708 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
709 if (resolved_method->is_overpass()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
710 tty->print("overpass");
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
711 }
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
712 tty->cr();
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
713 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
714 }
a61af66fc99e Initial load
duke
parents:
diff changeset
715
a61af66fc99e Initial load
duke
parents:
diff changeset
716 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // Field resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 void LinkResolver::check_field_accessability(KlassHandle ref_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
720 KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
721 KlassHandle sel_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
722 fieldDescriptor& fd,
a61af66fc99e Initial load
duke
parents:
diff changeset
723 TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
724 if (!Reflection::verify_field_access(ref_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
725 resolved_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
726 sel_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
727 fd.access_flags(),
a61af66fc99e Initial load
duke
parents:
diff changeset
728 true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
730 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
731 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
732 vmSymbols::java_lang_IllegalAccessError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
733 "tried to access field %s.%s from class %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
734 sel_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
735 fd.name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
736 ref_klass->external_name()
a61af66fc99e Initial load
duke
parents:
diff changeset
737 );
a61af66fc99e Initial load
duke
parents:
diff changeset
738 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
741
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
742 void LinkResolver::resolve_field_access(fieldDescriptor& result, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
743 // Load these early in case the resolve of the containing klass fails
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
744 Symbol* field = pool->name_ref_at(index);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
745 Symbol* sig = pool->signature_ref_at(index);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
746
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
747 // resolve specified klass
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
748 KlassHandle resolved_klass;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
749 resolve_klass(resolved_klass, pool, index, CHECK);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
750
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
751 KlassHandle current_klass(THREAD, pool->pool_holder());
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
752 resolve_field(result, resolved_klass, field, sig, current_klass, byte, true, true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
753 }
a61af66fc99e Initial load
duke
parents:
diff changeset
754
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
755 void LinkResolver::resolve_field(fieldDescriptor& fd, KlassHandle resolved_klass, Symbol* field, Symbol* sig,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
756 KlassHandle current_klass, Bytecodes::Code byte, bool check_access, bool initialize_class,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
757 TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
758 assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
759 byte == Bytecodes::_getfield || byte == Bytecodes::_putfield ||
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
760 (byte == Bytecodes::_nop && !check_access), "bad field access bytecode");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
761
a61af66fc99e Initial load
duke
parents:
diff changeset
762 bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
a61af66fc99e Initial load
duke
parents:
diff changeset
763 bool is_put = (byte == Bytecodes::_putfield || byte == Bytecodes::_putstatic);
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // Check if there's a resolved klass containing the field
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
766 if (resolved_klass.is_null()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
767 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
768 THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 // Resolve instance field
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
772 KlassHandle sel_klass(THREAD, InstanceKlass::cast(resolved_klass())->find_field(field, sig, &fd));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // check if field exists; i.e., if a klass containing the field def has been selected
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
774 if (sel_klass.is_null()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
775 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
776 THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
778
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
779 if (!check_access)
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
780 // Access checking may be turned off when calling from within the VM.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
781 return;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
782
0
a61af66fc99e Initial load
duke
parents:
diff changeset
783 // check access
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
784 check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // check for errors
a61af66fc99e Initial load
duke
parents:
diff changeset
787 if (is_static != fd.is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
788 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
789 char msg[200];
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
790 jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
791 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
793
a61af66fc99e Initial load
duke
parents:
diff changeset
794 // Final fields can only be accessed from its own class.
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
795 if (is_put && fd.access_flags().is_final() && sel_klass() != current_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
796 THROW(vmSymbols::java_lang_IllegalAccessError());
a61af66fc99e Initial load
duke
parents:
diff changeset
797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799 // initialize resolved_klass if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // note 1: the klass which declared the field must be initialized (i.e, sel_klass)
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
a61af66fc99e Initial load
duke
parents:
diff changeset
802 //
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // note 2: we don't want to force initialization if we are just checking
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // if the field access is legal; e.g., during compilation
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
805 if (is_static && initialize_class) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
806 sel_klass->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
808
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
809 if (sel_klass() != current_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
810 HandleMark hm(THREAD);
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
811 Handle ref_loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
812 Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
813 {
a61af66fc99e Initial load
duke
parents:
diff changeset
814 ResourceMark rm(THREAD);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
815 Symbol* failed_type_symbol =
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
816 SystemDictionary::check_signature_loaders(sig,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
817 ref_loader, sel_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
818 false,
a61af66fc99e Initial load
duke
parents:
diff changeset
819 CHECK);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
820 if (failed_type_symbol != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
821 const char* msg = "loader constraint violation: when resolving field"
a61af66fc99e Initial load
duke
parents:
diff changeset
822 " \"%s\" the class loader (instance of %s) of the referring class, "
a61af66fc99e Initial load
duke
parents:
diff changeset
823 "%s, and the class loader (instance of %s) for the field's resolved "
a61af66fc99e Initial load
duke
parents:
diff changeset
824 "type, %s, have different Class objects for that type";
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
825 char* field_name = field->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
826 const char* loader1 = SystemDictionary::loader_name(ref_loader());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
827 char* sel = InstanceKlass::cast(sel_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
828 const char* loader2 = SystemDictionary::loader_name(sel_loader());
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
829 char* failed_type_name = failed_type_symbol->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
830 size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) +
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
831 strlen(sel) + strlen(loader2) + strlen(failed_type_name) + 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
832 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
833 jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
a61af66fc99e Initial load
duke
parents:
diff changeset
834 failed_type_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
835 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
839
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // return information. note that the klass is set to the actual klass containing the
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // field, otherwise access of static fields in superclasses will not work.
a61af66fc99e Initial load
duke
parents:
diff changeset
842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
843
a61af66fc99e Initial load
duke
parents:
diff changeset
844
a61af66fc99e Initial load
duke
parents:
diff changeset
845 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
846 // Invoke resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
847 //
a61af66fc99e Initial load
duke
parents:
diff changeset
848 // Naming conventions:
a61af66fc99e Initial load
duke
parents:
diff changeset
849 //
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // resolved_method the specified method (i.e., static receiver specified via constant pool index)
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // sel_method the selected method (selected via run-time lookup; e.g., based on dynamic receiver class)
a61af66fc99e Initial load
duke
parents:
diff changeset
852 // resolved_klass the specified klass (i.e., specified via constant pool index)
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // recv_klass the receiver klass
a61af66fc99e Initial load
duke
parents:
diff changeset
854
a61af66fc99e Initial load
duke
parents:
diff changeset
855
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
856 void LinkResolver::resolve_static_call(CallInfo& result, KlassHandle& resolved_klass, Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
857 Symbol* method_signature, KlassHandle current_klass,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
858 bool check_access, bool initialize_class, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
859 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
860 linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
861 resolved_klass = KlassHandle(THREAD, resolved_method->method_holder());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
862
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // Initialize klass (this should only happen if everything is ok)
a61af66fc99e Initial load
duke
parents:
diff changeset
864 if (initialize_class && resolved_klass->should_be_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
865 resolved_klass->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
866 linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // setup result
a61af66fc99e Initial load
duke
parents:
diff changeset
870 result.set_static(resolved_klass, resolved_method, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 // throws linktime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
874 void LinkResolver::linktime_resolve_static_method(methodHandle& resolved_method, KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
875 Symbol* method_name, Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
876 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
877
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
878 if (!resolved_klass->is_interface()) {
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
879 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
880 } else {
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
881 resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
882 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
883 assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
884
a61af66fc99e Initial load
duke
parents:
diff changeset
885 // check if static
a61af66fc99e Initial load
duke
parents:
diff changeset
886 if (!resolved_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
887 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
888 char buf[200];
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
889 jio_snprintf(buf, sizeof(buf), "Expected static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
890 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
891 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
892 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
893 }
a61af66fc99e Initial load
duke
parents:
diff changeset
894 }
a61af66fc99e Initial load
duke
parents:
diff changeset
895
a61af66fc99e Initial load
duke
parents:
diff changeset
896
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
897 void LinkResolver::resolve_special_call(CallInfo& result, KlassHandle resolved_klass, Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
898 Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
899 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
900 linktime_resolve_special_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
901 runtime_resolve_special_method(result, resolved_method, resolved_klass, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 // throws linktime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
905 void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method, KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
906 Symbol* method_name, Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
907 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
908
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
909 // Invokespecial is called for multiple special reasons:
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
910 // <init>
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
911 // local private method invocation, for classes and interfaces
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
912 // superclass.method, which can also resolve to a default method
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
913 // and the selected method is recalculated relative to the direct superclass
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
914 // superinterface.method, which explicitly does not check shadowing
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6822
diff changeset
915
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
916 if (!resolved_klass->is_interface()) {
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
917 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
918 } else {
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
919 resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
920 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
921
a61af66fc99e Initial load
duke
parents:
diff changeset
922 // check if method name is <init>, that it is found in same klass as static type
a61af66fc99e Initial load
duke
parents:
diff changeset
923 if (resolved_method->name() == vmSymbols::object_initializer_name() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
924 resolved_method->method_holder() != resolved_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
925 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
926 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
927 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
928 vmSymbols::java_lang_NoSuchMethodError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
929 "%s: method %s%s not found",
a61af66fc99e Initial load
duke
parents:
diff changeset
930 resolved_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
931 resolved_method->name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
932 resolved_method->signature()->as_C_string()
a61af66fc99e Initial load
duke
parents:
diff changeset
933 );
a61af66fc99e Initial load
duke
parents:
diff changeset
934 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936
13401
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
937 // check if invokespecial's interface method reference is in an indirect superinterface
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
938 if (!current_klass.is_null() && resolved_klass->is_interface()) {
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
939 Klass *klass_to_check = !InstanceKlass::cast(current_klass())->is_anonymous() ?
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
940 current_klass() :
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
941 InstanceKlass::cast(current_klass())->host_klass();
14207
5270f046a962 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
942 // As of the fix for 4486457 we disable verification for all of the
5270f046a962 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
943 // dynamically-generated bytecodes associated with the 1.4
5270f046a962 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
944 // reflection implementation, not just those associated with
5270f046a962 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
945 // sun/reflect/SerializationConstructorAccessor.
5270f046a962 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
946 bool is_reflect = JDK_Version::is_gte_jdk14x_version() &&
5270f046a962 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
947 UseNewReflection &&
5270f046a962 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
948 klass_to_check->is_subclass_of(
5270f046a962 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
949 SystemDictionary::reflect_MagicAccessorImpl_klass());
13401
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
950
14207
5270f046a962 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
951 if (!is_reflect &&
5270f046a962 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
952 !InstanceKlass::cast(klass_to_check)->is_same_or_direct_interface(resolved_klass())) {
13401
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
953 ResourceMark rm(THREAD);
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
954 char buf[200];
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
955 jio_snprintf(buf, sizeof(buf),
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
956 "Interface method reference: %s, is in an indirect superinterface of %s",
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
957 Method::name_and_sig_as_C_string(resolved_klass(),
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
958 resolved_method->name(),
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
959 resolved_method->signature()),
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
960 current_klass->external_name());
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
961 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
962 }
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
963 }
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
964
0
a61af66fc99e Initial load
duke
parents:
diff changeset
965 // check if not static
a61af66fc99e Initial load
duke
parents:
diff changeset
966 if (resolved_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
967 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
968 char buf[200];
a61af66fc99e Initial load
duke
parents:
diff changeset
969 jio_snprintf(buf, sizeof(buf),
a61af66fc99e Initial load
duke
parents:
diff changeset
970 "Expecting non-static method %s",
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
971 Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
972 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
973 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
974 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
975 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
976
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
977 if (TraceItables && Verbose) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
978 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
979 tty->print("invokespecial resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
980 (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
981 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
982 Method::name_and_sig_as_C_string(resolved_klass(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
983 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
984 resolved_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
985 resolved_method->method_holder()->internal_name()
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
986 );
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
987 resolved_method->access_flags().print_on(tty);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
988 if (resolved_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
989 tty->print("default ");
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
990 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
991 if (resolved_method->is_overpass()) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
992 tty->print("overpass");
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
993 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
994 tty->cr();
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
995 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
996 }
a61af66fc99e Initial load
duke
parents:
diff changeset
997
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // throws runtime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
999 void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1001
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 // resolved method is selected method unless we have an old-style lookup
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1003 // for a superclass method
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1004 // Invokespecial for a superinterface, resolved method is selected method,
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1005 // no checks for shadowing
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 methodHandle sel_method(THREAD, resolved_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 // check if this is an old-style super call and do a new lookup if so
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 { KlassHandle method_klass = KlassHandle(THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 resolved_method->method_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
1011
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1012 if (check_access &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 // a) check if ACC_SUPER flag is set for the current class
8702
77443715ec55 8001307: Modify ACC_SUPER behavior
kamg
parents: 6822
diff changeset
1014 (current_klass->is_super() || !AllowNonVirtualCalls) &&
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1015 // b) check if the class of the resolved_klass is a superclass
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1016 // (not supertype in order to exclude interface classes) of the current class.
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1017 // This check is not performed for super.invoke for interface methods
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1018 // in super interfaces.
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1019 current_klass->is_subclass_of(resolved_klass()) &&
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1020 current_klass() != resolved_klass() &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 // c) check if the method is not <init>
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 resolved_method->name() != vmSymbols::object_initializer_name()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 // Lookup super method
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 KlassHandle super_klass(THREAD, current_klass->super());
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 lookup_instance_method_in_klasses(sel_method, super_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1026 resolved_method->name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1027 resolved_method->signature(), CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // check if found
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 if (sel_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1032 Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1038
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // check if not static
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 if (sel_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
1041 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 char buf[200];
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1043 jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1048
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 // check if abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 if (sel_method->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1053 Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 sel_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 sel_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1058 if (TraceItables && Verbose) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1059 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1060 tty->print("invokespecial selected method: resolved-class:%s, method:%s, method_holder:%s, access_flags: ",
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1061 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1062 Method::name_and_sig_as_C_string(resolved_klass(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1063 sel_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1064 sel_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1065 sel_method->method_holder()->internal_name()
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1066 );
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1067 sel_method->access_flags().print_on(tty);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1068 if (sel_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1069 tty->print("default ");
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1070 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1071 if (sel_method->is_overpass()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1072 tty->print("overpass");
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1073 }
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1074 tty->cr();
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1075 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1076
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 // setup result
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 result.set_static(resolved_klass, sel_method, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1080
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass, KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1082 Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 bool check_access, bool check_null_and_abstract, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 linktime_resolve_virtual_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 runtime_resolve_virtual_method(result, resolved_method, resolved_klass, recv, receiver_klass, check_null_and_abstract, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1088
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // throws linktime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 void LinkResolver::linktime_resolve_virtual_method(methodHandle &resolved_method, KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1091 Symbol* method_name, Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // normal method resolution
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
1094 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1095
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
1098
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1099 // check if private interface method
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1100 if (resolved_klass->is_interface() && resolved_method->is_private()) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1101 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1102 char buf[200];
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1103 jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokevirtual: method %s, caller-class:%s",
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1104 Method::name_and_sig_as_C_string(resolved_klass(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1105 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1106 resolved_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1107 (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1108 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1109 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1110
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 // check if not static
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 if (resolved_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
1113 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 char buf[200];
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1115 jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 }
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1120
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1121 if (PrintVtables && Verbose) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1122 ResourceMark rm(THREAD);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1123 tty->print("invokevirtual resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1124 (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1125 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1126 Method::name_and_sig_as_C_string(resolved_klass(),
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1127 resolved_method->name(),
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1128 resolved_method->signature()),
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1129 resolved_method->method_holder()->internal_name()
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1130 );
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1131 resolved_method->access_flags().print_on(tty);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1132 if (resolved_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1133 tty->print("default ");
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1134 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1135 if (resolved_method->is_overpass()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1136 tty->print("overpass");
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1137 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1138 tty->cr();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1139 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 // throws runtime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 methodHandle resolved_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 Handle recv,
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 KlassHandle recv_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 bool check_null_and_abstract,
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1150
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 // setup default return values
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1152 int vtable_index = Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 methodHandle selected_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1154
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 assert(recv.is_null() || recv->is_oop(), "receiver is not an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
1156
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 // runtime method resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 if (check_null_and_abstract && recv.is_null()) { // check if receiver exists
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1161
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1162 // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 // a missing receiver might result in a bogus lookup.
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
1165 assert(resolved_method->method_holder()->is_linked(), "must be linked");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 // do lookup based on receiver klass using the vtable index
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1168 if (resolved_method->method_holder()->is_interface()) { // miranda method
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1169 vtable_index = vtable_index_of_interface_method(resolved_klass,
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1170 resolved_method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 assert(vtable_index >= 0 , "we should have valid vtable index at this point");
a61af66fc99e Initial load
duke
parents:
diff changeset
1172
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1173 InstanceKlass* inst = InstanceKlass::cast(recv_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 // at this point we are sure that resolved_method is virtual and not
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 // a miranda method; therefore, it must have a valid vtable index.
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1178 assert(!resolved_method->has_itable_index(), "");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 vtable_index = resolved_method->vtable_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // We could get a negative vtable_index for final methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 // because as an optimization they are they are never put in the vtable,
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 // unless they override an existing method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // If we do get a negative, it means the resolved method is the the selected
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 // method, and it can never be changed by an override.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1185 if (vtable_index == Method::nonvirtual_vtable_index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 assert(resolved_method->can_be_statically_bound(), "cannot override this method");
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 selected_method = resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 // recv_klass might be an arrayKlassOop but all vtables start at
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 // the same place. The cast is to avoid virtual call and assertion.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1191 InstanceKlass* inst = (InstanceKlass*)recv_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1195
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // check if method exists
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 if (selected_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1200 Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1204
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 // check if abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 if (check_null_and_abstract && selected_method->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1209 Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 selected_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 selected_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1213
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1214 if (PrintVtables && Verbose) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1215 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1216 tty->print("invokevirtual selected method: receiver-class:%s, resolved-class:%s, method:%s, method_holder:%s, vtable_index:%d, access_flags: ",
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1217 (recv_klass.is_null() ? "<NULL>" : recv_klass->internal_name()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1218 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1219 Method::name_and_sig_as_C_string(resolved_klass(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1220 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1221 resolved_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1222 selected_method->method_holder()->internal_name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1223 vtable_index
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1224 );
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1225 selected_method->access_flags().print_on(tty);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1226 if (selected_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1227 tty->print("default ");
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1228 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1229 if (selected_method->is_overpass()) {
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1230 tty->print("overpass");
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1231 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1232 tty->cr();
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1233 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // setup result
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1237
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1239 Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 bool check_access, bool check_null_and_abstract, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 linktime_resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 runtime_resolve_interface_method(result, resolved_method, resolved_klass, recv, recv_klass, check_null_and_abstract, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1245
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 // throws linktime exceptions
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1247 void LinkResolver::linktime_resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1248 Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 // normal interface method resolution
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
1250 resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1251
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1255
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 // throws runtime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 // check if receiver exists
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 if (check_null_and_abstract && recv.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1263
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1264 // check if private interface method
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1265 if (resolved_klass->is_interface() && resolved_method->is_private()) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1266 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1267 char buf[200];
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1268 jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokeinterface: method %s",
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1269 Method::name_and_sig_as_C_string(resolved_klass(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1270 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1271 resolved_method->signature()));
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1272 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1273 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1274
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 // check if receiver klass implements the resolved interface
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 if (!recv_klass->is_subtype_of(resolved_klass())) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
1277 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 char buf[200];
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1280 recv_klass()->external_name(),
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1281 resolved_klass()->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 }
14221
2353011244bd 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 14208
diff changeset
1284
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 // do lookup based on receiver klass
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 methodHandle sel_method;
14221
2353011244bd 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 14208
diff changeset
1287 // This search must match the linktime preparation search for itable initialization
2353011244bd 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 14208
diff changeset
1288 // to correctly enforce loader constraints for interface method inheritance
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 lookup_instance_method_in_klasses(sel_method, recv_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1290 resolved_method->name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1291 resolved_method->signature(), CHECK);
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1292 if (sel_method.is_null() && !check_null_and_abstract) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1293 // In theory this is a harmless placeholder value, but
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1294 // in practice leaving in null affects the nsk default method tests.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1295 // This needs further study.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1296 sel_method = resolved_method;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1297 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 // check if method exists
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 if (sel_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1302 Method::name_and_sig_as_C_string(recv_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 }
10128
41ed397cc0cd 8006267: InterfaceMethod_ref should allow invokestatic and invokespecial
bharadwaj
parents: 9082
diff changeset
1306 // check access
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1307 // Throw Illegal Access Error if sel_method is not public.
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1308 if (!sel_method->is_public()) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1309 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1310 THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1311 Method::name_and_sig_as_C_string(recv_klass(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1312 sel_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1313 sel_method->signature()));
10128
41ed397cc0cd 8006267: InterfaceMethod_ref should allow invokestatic and invokespecial
bharadwaj
parents: 9082
diff changeset
1314 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 // check if abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 if (check_null_and_abstract && sel_method->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1319 Method::name_and_sig_as_C_string(recv_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 sel_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 sel_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 }
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1323
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1324 if (TraceItables && Verbose) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1325 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1326 tty->print("invokeinterface selected method: receiver-class:%s, resolved-class:%s, method:%s, method_holder:%s, access_flags: ",
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1327 (recv_klass.is_null() ? "<NULL>" : recv_klass->internal_name()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1328 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1329 Method::name_and_sig_as_C_string(resolved_klass(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1330 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1331 resolved_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1332 sel_method->method_holder()->internal_name()
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1333 );
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1334 sel_method->access_flags().print_on(tty);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1335 if (sel_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1336 tty->print("default ");
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1337 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1338 if (sel_method->is_overpass()) {
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1339 tty->print("overpass");
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1340 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1341 tty->cr();
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1342 }
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1343 // setup result
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1344 if (!resolved_method->has_itable_index()) {
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1345 int vtable_index = resolved_method->vtable_index();
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1346 assert(vtable_index == sel_method->vtable_index(), "sanity check");
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1347 result.set_virtual(resolved_klass, recv_klass, resolved_method, sel_method, vtable_index, CHECK);
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1348 } else {
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1349 int itable_index = resolved_method()->itable_index();
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1350 result.set_interface(resolved_klass, recv_klass, resolved_method, sel_method, itable_index, CHECK);
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1351 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1353
a61af66fc99e Initial load
duke
parents:
diff changeset
1354
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1357 Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1358 Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 KlassHandle current_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 bool check_access) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 methodHandle method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 linktime_resolve_interface_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 return method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1371
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 methodHandle LinkResolver::linktime_resolve_virtual_method_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1374 Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1375 Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 KlassHandle current_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 bool check_access) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 methodHandle method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 linktime_resolve_virtual_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 return method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 methodHandle LinkResolver::resolve_virtual_call_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 KlassHandle receiver_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1392 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1393 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1404
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 methodHandle LinkResolver::resolve_interface_call_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 KlassHandle receiver_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1408 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1409 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 resolve_interface_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1420
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 int LinkResolver::resolve_virtual_vtable_index(
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 KlassHandle receiver_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1424 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1425 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 CLEAR_PENDING_EXCEPTION;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1432 return Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 return info.vtable_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1436
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 methodHandle LinkResolver::resolve_static_call_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1439 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1440 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 resolve_static_call(info, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1451
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1452 methodHandle LinkResolver::resolve_special_call_or_null(KlassHandle resolved_klass, Symbol* name, Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 resolve_special_call(info, resolved_klass, name, signature, current_klass, true, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1463
a61af66fc99e Initial load
duke
parents:
diff changeset
1464
a61af66fc99e Initial load
duke
parents:
diff changeset
1465
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 // ConstantPool entries
a61af66fc99e Initial load
duke
parents:
diff changeset
1468
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 switch (byte) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 case Bytecodes::_invokespecial : resolve_invokespecial (result, pool, index, CHECK); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 case Bytecodes::_invokevirtual : resolve_invokevirtual (result, recv, pool, index, CHECK); break;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1474 case Bytecodes::_invokehandle : resolve_invokehandle (result, pool, index, CHECK); break;
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1475 case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1480
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1481 void LinkResolver::resolve_pool(KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 // resolve klass
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 resolve_klass(resolved_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1485
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 // Get name, signature, and static klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1487 method_name = pool->name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1488 method_signature = pool->signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 current_klass = KlassHandle(THREAD, pool->pool_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1491
a61af66fc99e Initial load
duke
parents:
diff changeset
1492
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 void LinkResolver::resolve_invokestatic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1495 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1496 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 resolve_static_call(result, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1501
a61af66fc99e Initial load
duke
parents:
diff changeset
1502
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 void LinkResolver::resolve_invokespecial(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1505 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1506 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 resolve_special_call(result, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1511
a61af66fc99e Initial load
duke
parents:
diff changeset
1512
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 void LinkResolver::resolve_invokevirtual(CallInfo& result, Handle recv,
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 constantPoolHandle pool, int index,
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1516
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1518 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1519 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1522 KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 resolve_virtual_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1525
a61af66fc99e Initial load
duke
parents:
diff changeset
1526
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1529 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1530 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1533 KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1536
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1537
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1538 void LinkResolver::resolve_invokehandle(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1539 assert(EnableInvokeDynamic, "");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1540 // This guy is reached from InterpreterRuntime::resolve_invokehandle.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1541 KlassHandle resolved_klass;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1542 Symbol* method_name = NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1543 Symbol* method_signature = NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1544 KlassHandle current_klass;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1545 resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
9082
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
1546 if (TraceMethodHandles) {
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
1547 ResourceMark rm(THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1548 tty->print_cr("resolve_invokehandle %s %s", method_name->as_C_string(), method_signature->as_C_string());
9082
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
1549 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1550 resolve_handle_call(result, resolved_klass, method_name, method_signature, current_klass, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1551 }
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1552
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1553 void LinkResolver::resolve_handle_call(CallInfo& result, KlassHandle resolved_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1554 Symbol* method_name, Symbol* method_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1555 KlassHandle current_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1556 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1557 // JSR 292: this must be an implicitly generated method MethodHandle.invokeExact(*...) or similar
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1558 assert(resolved_klass() == SystemDictionary::MethodHandle_klass(), "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1559 assert(MethodHandles::is_signature_polymorphic_name(method_name), "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1560 methodHandle resolved_method;
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1561 Handle resolved_appendix;
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1562 Handle resolved_method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1563 lookup_polymorphic_method(resolved_method, resolved_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1564 method_name, method_signature,
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1565 current_klass, &resolved_appendix, &resolved_method_type, CHECK);
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1566 result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1567 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1568
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1569
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1570 void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1571 assert(EnableInvokeDynamic, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1572
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1573 //resolve_pool(<resolved_klass>, method_name, method_signature, current_klass, pool, index, CHECK);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1574 Symbol* method_name = pool->name_ref_at(index);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1575 Symbol* method_signature = pool->signature_ref_at(index);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1576 KlassHandle current_klass = KlassHandle(THREAD, pool->pool_holder());
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1577
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1578 // Resolve the bootstrap specifier (BSM + optional arguments).
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1579 Handle bootstrap_specifier;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1580 // Check if CallSite has been bound already:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1581 ConstantPoolCacheEntry* cpce = pool->invokedynamic_cp_cache_entry_at(index);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1582 if (cpce->is_f1_null()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1583 int pool_index = cpce->constant_pool_index();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1584 oop bsm_info = pool->resolve_bootstrap_specifier_at(pool_index, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1585 assert(bsm_info != NULL, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1586 // FIXME: Cache this once per BootstrapMethods entry, not once per CONSTANT_InvokeDynamic.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1587 bootstrap_specifier = Handle(THREAD, bsm_info);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1588 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1589 if (!cpce->is_f1_null()) {
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1590 methodHandle method( THREAD, cpce->f1_as_method());
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1591 Handle appendix( THREAD, cpce->appendix_if_resolved(pool));
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1592 Handle method_type(THREAD, cpce->method_type_if_resolved(pool));
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1593 result.set_handle(method, appendix, method_type, CHECK);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1594 return;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1595 }
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1596
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1597 if (TraceMethodHandles) {
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1598 ResourceMark rm(THREAD);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1599 tty->print_cr("resolve_invokedynamic #%d %s %s",
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1600 ConstantPool::decode_invokedynamic_index(index),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1601 method_name->as_C_string(), method_signature->as_C_string());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1602 tty->print(" BSM info: "); bootstrap_specifier->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1603 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1604
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1605 resolve_dynamic_call(result, bootstrap_specifier, method_name, method_signature, current_klass, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1606 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1607
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1608 void LinkResolver::resolve_dynamic_call(CallInfo& result,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1609 Handle bootstrap_specifier,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1610 Symbol* method_name, Symbol* method_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1611 KlassHandle current_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1612 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1613 // JSR 292: this must resolve to an implicitly generated method MH.linkToCallSite(*...)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1614 // The appendix argument is likely to be a freshly-created CallSite.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1615 Handle resolved_appendix;
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1616 Handle resolved_method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1617 methodHandle resolved_method =
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1618 SystemDictionary::find_dynamic_call_site_invoker(current_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1619 bootstrap_specifier,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1620 method_name, method_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1621 &resolved_appendix,
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1622 &resolved_method_type,
6729
d17383603741 7196120: NPG: JSR 2292 test fails because missing fix for 7188911
twisti
parents: 6725
diff changeset
1623 THREAD);
3744
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1624 if (HAS_PENDING_EXCEPTION) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1625 if (TraceMethodHandles) {
12316
190899198332 7195622: CheckUnhandledOops has limited usefulness now
hseigel
parents: 12264
diff changeset
1626 tty->print_cr("invokedynamic throws BSME for "INTPTR_FORMAT, (void *)PENDING_EXCEPTION);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1627 PENDING_EXCEPTION->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1628 }
3744
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1629 if (PENDING_EXCEPTION->is_a(SystemDictionary::BootstrapMethodError_klass())) {
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1630 // throw these guys, since they are already wrapped
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1631 return;
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1632 }
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1633 if (!PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) {
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1634 // intercept only LinkageErrors which might have failed to wrap
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1635 return;
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1636 }
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1637 // See the "Linking Exceptions" section for the invokedynamic instruction in the JVMS.
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1638 Handle nested_exception(THREAD, PENDING_EXCEPTION);
3744
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1639 CLEAR_PENDING_EXCEPTION;
6729
d17383603741 7196120: NPG: JSR 2292 test fails because missing fix for 7188911
twisti
parents: 6725
diff changeset
1640 THROW_CAUSE(vmSymbols::java_lang_BootstrapMethodError(), nested_exception)
3744
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1641 }
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6729
diff changeset
1642 result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1643 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1644
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1647
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1648 void CallInfo::print() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 ResourceMark rm;
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1650 const char* kindstr = "unknown";
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1651 switch (_call_kind) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1652 case direct_call: kindstr = "direct"; break;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1653 case vtable_call: kindstr = "vtable"; break;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1654 case itable_call: kindstr = "itable"; break;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1655 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1656 tty->print_cr("Call %s@%d %s", kindstr, _call_index,
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1657 _resolved_method.is_null() ? "(none)" : _resolved_method->name_and_sig_as_C_string());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1659
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 #endif