annotate src/share/vm/interpreter/linkResolver.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 78bbf4d43a14
children 52b4284cb496 54bc75c144b0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17637
1a023fd29afb 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 17464
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
13436
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
245 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, bool checkpolymorphism, bool in_imethod_resolve, TRAPS) {
17889
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
246 // Ignore overpasses so statics can be found during resolution
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
247 Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::skip_overpass);
13436
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
248
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
249 // JDK 8, JVMS 5.4.3.4: Interface method resolution should
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
250 // ignore static and non-public methods of java.lang.Object,
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
251 // like clone, finalize, registerNatives.
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
252 if (in_imethod_resolve &&
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
253 result_oop != NULL &&
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
254 klass->is_interface() &&
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
255 (result_oop->is_static() || !result_oop->is_public()) &&
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
256 result_oop->method_holder() == SystemDictionary::Object_klass()) {
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
257 result_oop = NULL;
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
258 }
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
259
17889
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
260 // Before considering default methods, check for an overpass in the
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
261 // current class if a method has not been found.
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
262 if (result_oop == NULL) {
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
263 result_oop = InstanceKlass::cast(klass())->find_method(name, signature);
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
264 }
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
265
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
266 if (result_oop == NULL) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
267 Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
268 if (default_methods != NULL) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
269 result_oop = InstanceKlass::find_method(default_methods, name, signature);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
270 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
271 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
272
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
273 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
274 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
275 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
276 // 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
277 return;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1142
diff changeset
278 }
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1142
diff changeset
279 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
280 result = methodHandle(THREAD, result_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // returns first instance method
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
284 // 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
285 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
17889
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
286 Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::normal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
287 result = methodHandle(THREAD, result_oop);
12934
d248425bcfe8 8024804: Crash when InterfaceMethodref resolves to Object.registerNatives
hseigel
parents: 12858
diff changeset
288 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
289 KlassHandle super_klass = KlassHandle(THREAD, result->method_holder()->super());
17889
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
290 result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature, Klass::normal));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
292
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
293 if (result.is_null()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
294 Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
295 if (default_methods != NULL) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
296 result = methodHandle(InstanceKlass::find_method(default_methods, name, signature));
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
297 assert(result.is_null() || !result->is_static(), "static defaults not allowed");
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
298 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
299 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
302 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
303 methodHandle resolved_method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
304
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
305 int vtable_index = Method::invalid_vtable_index;
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
306 Symbol* name = resolved_method->name();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
307 Symbol* signature = resolved_method->signature();
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 // First check in default method array
17464
5832cdaf89c6 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 13436
diff changeset
310 if (!resolved_method->is_abstract() &&
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
311 (InstanceKlass::cast(klass())->default_methods() != NULL)) {
17889
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
312 int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature, false);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
313 if (index >= 0 ) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
314 vtable_index = InstanceKlass::cast(klass())->default_vtable_indices()->at(index);
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 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
317 if (vtable_index == Method::invalid_vtable_index) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
318 // get vtable_index for miranda methods
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
319 ResourceMark rm;
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
320 klassVtable *vt = InstanceKlass::cast(klass())->vtable();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
321 vtable_index = vt->index_of_miranda(name, signature);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
322 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
323 return vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
325
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
326 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
327 InstanceKlass *ik = InstanceKlass::cast(klass());
17464
5832cdaf89c6 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 13436
diff changeset
328
5832cdaf89c6 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 13436
diff changeset
329 // Specify 'true' in order to skip default methods when searching the
5832cdaf89c6 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 13436
diff changeset
330 // interfaces. Function lookup_method_in_klasses() already looked for
5832cdaf89c6 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 13436
diff changeset
331 // the method in the default methods table.
17889
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17666
diff changeset
332 result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, Klass::skip_defaults));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
335 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
336 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
337 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
338 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
339 Handle *method_type_result,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
340 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
341 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
342 if (TraceMethodHandles) {
9082
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
343 ResourceMark rm(THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
344 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
345 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
346 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
347 }
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2359
diff changeset
348 if (EnableInvokeDynamic &&
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1142
diff changeset
349 klass() == SystemDictionary::MethodHandle_klass() &&
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
350 iid != vmIntrinsics::_none) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
351 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
352 // 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
353 // 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
354 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
355 TempNewSymbol basic_signature =
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
356 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
357 if (TraceMethodHandles) {
9082
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
358 ResourceMark rm(THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
359 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
360 name->as_C_string(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
361 full_signature->as_C_string(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
362 basic_signature->as_C_string());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
363 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
364 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
365 basic_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
366 CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
367 if (result.not_null()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
368 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
369 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
370 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
371 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
372 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
373 result->print_on(tty);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
374 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
375 return;
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1552
diff changeset
376 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
377 } else if (iid == vmIntrinsics::_invokeGeneric
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
378 && !THREAD->is_Compiler_thread()
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
379 && appendix_result_or_null != NULL) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
380 // 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
381 // 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
382 if (!MethodHandles::enabled()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
383 // 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
384 Klass* natives = SystemDictionary::MethodHandleNatives_klass();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
385 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
386 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
387 Handle(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
388 Handle(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
389 true,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
390 CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
391 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
392 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
393
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
394 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
395 Handle method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
396 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
397 full_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
398 current_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
399 &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
400 &method_type,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
401 CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
402 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
403 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
404 result->print_on(tty);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
405 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
406 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
407 else appendix->print_on(tty);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
408 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
409 if (result.not_null()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
410 #ifdef ASSERT
9082
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
411 ResourceMark rm(THREAD);
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
412
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
413 TempNewSymbol basic_signature =
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
414 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
415 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
416 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
417 // +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
418 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
419 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
420 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
421 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
422 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
423 result->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
424 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
425 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
426 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
427 #endif //ASSERT
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
428
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
429 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
430 (*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
431 (*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
432 return;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
433 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
434 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
435 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
436 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
437
0
a61af66fc99e Initial load
duke
parents:
diff changeset
438 void LinkResolver::check_method_accessability(KlassHandle ref_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
439 KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
440 KlassHandle sel_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
441 methodHandle sel_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
442 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 AccessFlags flags = sel_method->access_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
445
13436
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
446 // Special case: arrays always override "clone". JVMS 2.15.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // If the resolved klass is an array class, and the declaring class
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // is java.lang.Object and the method is "clone", set the flags
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // to public.
a61af66fc99e Initial load
duke
parents:
diff changeset
450 //
13436
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
451 // We'll check for the method name first, as that's most likely
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
452 // to be false (so we'll short-circuit out of these tests).
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
453 if (sel_method->name() == vmSymbols::clone_name() &&
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
454 sel_klass() == SystemDictionary::Object_klass() &&
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
455 resolved_klass->oop_is_array()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // We need to change "protected" to "public".
13436
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
457 assert(flags.is_protected(), "clone not protected?");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
458 jint new_flags = flags.as_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
459 new_flags = new_flags & (~JVM_ACC_PROTECTED);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 new_flags = new_flags | JVM_ACC_PUBLIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
461 flags.set_flags(new_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
463 // assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
464
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
465 if (!Reflection::verify_field_access(ref_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
466 resolved_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
467 sel_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
468 flags,
a61af66fc99e Initial load
duke
parents:
diff changeset
469 true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
470 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
471 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
472 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
473 vmSymbols::java_lang_IllegalAccessError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
474 "tried to access method %s.%s%s from class %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
475 sel_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
476 sel_method->name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
477 sel_method->signature()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
478 ref_klass->external_name()
a61af66fc99e Initial load
duke
parents:
diff changeset
479 );
a61af66fc99e Initial load
duke
parents:
diff changeset
480 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482 }
a61af66fc99e Initial load
duke
parents:
diff changeset
483
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
484 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
485 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
486 // This method is used only
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
487 // (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
488 // and
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
489 // (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
490 // 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
491 // FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // resolve klass
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
493 if (code == Bytecodes::_invokedynamic) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
494 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
495 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
496 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
497 KlassHandle current_klass(THREAD, pool->pool_holder());
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
498 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
499 return;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
500 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
501
0
a61af66fc99e Initial load
duke
parents:
diff changeset
502 resolve_klass(resolved_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
503
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
504 Symbol* method_name = pool->name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
505 Symbol* method_signature = pool->signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
506 KlassHandle current_klass(THREAD, pool->pool_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
507
3785
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
508 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
509 || (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
510 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
511 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
512 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
513 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
514 return;
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
515 }
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
516 }
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
517
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
518 if (code == Bytecodes::_invokeinterface) {
13413
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, true, CHECK);
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
520 } else if (code == Bytecodes::_invokevirtual) {
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
521 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
522 } else if (!resolved_klass->is_interface()) {
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
523 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
524 } else {
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
525 bool nostatics = (code == Bytecodes::_invokestatic) ? false : true;
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
526 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
527 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 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
531 Symbol* method_name, Symbol* method_signature,
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
532 KlassHandle current_klass, bool check_access,
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
533 bool require_methodref, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
534
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
535 Handle nested_exception;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
536
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
537 // 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
538 if (require_methodref && resolved_klass->is_interface()) {
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
539 ResourceMark rm(THREAD);
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
540 char buf[200];
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
541 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
542 resolved_klass()->external_name());
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
543 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
544 }
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
545
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
546 // 2. lookup method in resolved klass and its super klasses
13436
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
547 lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, true, false, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 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
550 // 3. lookup method in all the interfaces implemented by the resolved klass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
551 lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 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
554 // 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
555 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
556 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
557 if (HAS_PENDING_EXCEPTION) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
558 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
559 CLEAR_PENDING_EXCEPTION;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
560 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
561 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
562
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
563 if (resolved_method.is_null()) {
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
564 // 4. method lookup failed
0
a61af66fc99e Initial load
duke
parents:
diff changeset
565 ResourceMark rm(THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
566 THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
567 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
568 method_name,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
569 method_signature),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
570 nested_exception);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
571 }
a61af66fc99e Initial load
duke
parents:
diff changeset
572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
573
17666
a81bc2b2c4d3 8032010: Attempt to resolve abstract method in concrete class fails with AbstractMethodError
ccheung
parents: 17637
diff changeset
574 // 5. access checks, access checking may be turned off when calling from within the VM.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575 if (check_access) {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 assert(current_klass.not_null() , "current_klass should not be null");
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // check if method can be accessed by the referring class
a61af66fc99e Initial load
duke
parents:
diff changeset
579 check_method_accessability(current_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
580 resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
581 KlassHandle(THREAD, resolved_method->method_holder()),
a61af66fc99e Initial load
duke
parents:
diff changeset
582 resolved_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
583 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
584
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // check loader constraints
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
586 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
587 Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
588 {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 ResourceMark rm(THREAD);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
590 Symbol* failed_type_symbol =
0
a61af66fc99e Initial load
duke
parents:
diff changeset
591 SystemDictionary::check_signature_loaders(method_signature, loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
592 class_loader, true, CHECK);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
593 if (failed_type_symbol != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
594 const char* msg = "loader constraint violation: when resolving method"
a61af66fc99e Initial load
duke
parents:
diff changeset
595 " \"%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
596 " and the class loader (instance of %s) for the method's defining class, %s, have"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
597 " different Class objects for the type %s used in the signature";
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
598 char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
599 const char* loader1 = SystemDictionary::loader_name(loader());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
600 char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
601 const char* loader2 = SystemDictionary::loader_name(class_loader());
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
602 char* target = InstanceKlass::cast(resolved_method->method_holder())
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
603 ->name()->as_C_string();
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
604 char* failed_type_name = failed_type_symbol->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
605 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
606 strlen(current) + strlen(loader2) + strlen(target) +
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
607 strlen(failed_type_name) + 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
608 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
609 jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
610 target, failed_type_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
611 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
612 }
a61af66fc99e Initial load
duke
parents:
diff changeset
613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
618 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
619 Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
620 Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
621 KlassHandle current_klass,
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
622 bool check_access,
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
623 bool nostatics, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
624
17464
5832cdaf89c6 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 13436
diff changeset
625 // check if klass is interface
0
a61af66fc99e Initial load
duke
parents:
diff changeset
626 if (!resolved_klass->is_interface()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
627 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
628 char buf[200];
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
629 jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass()->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
630 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
631 }
a61af66fc99e Initial load
duke
parents:
diff changeset
632
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // lookup method in this interface or its super, java.lang.Object
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
634 // JDK8: also look for static methods
13436
9fbabcbb875b 8028741: Interface Method Resolution should skip static and non-public methods in j.l.Object
hseigel
parents: 13433
diff changeset
635 lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, false, true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
636
a61af66fc99e Initial load
duke
parents:
diff changeset
637 if (resolved_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // lookup method in all the super-interfaces
a61af66fc99e Initial load
duke
parents:
diff changeset
639 lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
640 if (resolved_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // no method found
a61af66fc99e Initial load
duke
parents:
diff changeset
642 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
643 THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
644 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
645 method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
646 method_signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650 if (check_access) {
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
651 // 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
652 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
653
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
654 // 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
655 check_method_accessability(current_klass,
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
656 resolved_klass,
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
657 KlassHandle(THREAD, resolved_method->method_holder()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
658 resolved_method,
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
659 CHECK);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
660
0
a61af66fc99e Initial load
duke
parents:
diff changeset
661 HandleMark hm(THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
662 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
663 Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
664 {
a61af66fc99e Initial load
duke
parents:
diff changeset
665 ResourceMark rm(THREAD);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
666 Symbol* failed_type_symbol =
0
a61af66fc99e Initial load
duke
parents:
diff changeset
667 SystemDictionary::check_signature_loaders(method_signature, loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
668 class_loader, true, CHECK);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
669 if (failed_type_symbol != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
670 const char* msg = "loader constraint violation: when resolving "
a61af66fc99e Initial load
duke
parents:
diff changeset
671 "interface method \"%s\" the class loader (instance of %s) of the "
a61af66fc99e Initial load
duke
parents:
diff changeset
672 "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
673 "the method's defining class, %s, have different Class objects for the type %s "
0
a61af66fc99e Initial load
duke
parents:
diff changeset
674 "used in the signature";
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
675 char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
676 const char* loader1 = SystemDictionary::loader_name(loader());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
677 char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
678 const char* loader2 = SystemDictionary::loader_name(class_loader());
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
679 char* target = InstanceKlass::cast(resolved_method->method_holder())
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
680 ->name()->as_C_string();
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
681 char* failed_type_name = failed_type_symbol->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
682 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
683 strlen(current) + strlen(loader2) + strlen(target) +
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
684 strlen(failed_type_name) + 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
685 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
686 jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
687 target, failed_type_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
688 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
689 }
a61af66fc99e Initial load
duke
parents:
diff changeset
690 }
a61af66fc99e Initial load
duke
parents:
diff changeset
691 }
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
692
17637
1a023fd29afb 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 17464
diff changeset
693 if (nostatics && resolved_method->is_static()) {
1a023fd29afb 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 17464
diff changeset
694 ResourceMark rm(THREAD);
1a023fd29afb 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 17464
diff changeset
695 char buf[200];
1a023fd29afb 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 17464
diff changeset
696 jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s",
1a023fd29afb 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 17464
diff changeset
697 Method::name_and_sig_as_C_string(resolved_klass(),
1a023fd29afb 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 17464
diff changeset
698 resolved_method->name(), resolved_method->signature()));
1a023fd29afb 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 17464
diff changeset
699 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
1a023fd29afb 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 17464
diff changeset
700 }
1a023fd29afb 8031045: Access checks should precede additional per-instruction checks
hseigel
parents: 17464
diff changeset
701
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
702 if (TraceItables && Verbose) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
703 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
704 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
705 (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
706 (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
707 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
708 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
709 resolved_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
710 resolved_method->method_holder()->internal_name()
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
711 );
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
712 resolved_method->access_flags().print_on(tty);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
713 if (resolved_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
714 tty->print("default ");
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
715 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
716 if (resolved_method->is_overpass()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
717 tty->print("overpass");
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
718 }
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
719 tty->cr();
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
720 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
721 }
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
724 // Field resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 void LinkResolver::check_field_accessability(KlassHandle ref_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
727 KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
728 KlassHandle sel_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
729 fieldDescriptor& fd,
a61af66fc99e Initial load
duke
parents:
diff changeset
730 TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
731 if (!Reflection::verify_field_access(ref_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
732 resolved_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
733 sel_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
734 fd.access_flags(),
a61af66fc99e Initial load
duke
parents:
diff changeset
735 true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
736 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
737 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
738 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
739 vmSymbols::java_lang_IllegalAccessError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
740 "tried to access field %s.%s from class %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
741 sel_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
742 fd.name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
743 ref_klass->external_name()
a61af66fc99e Initial load
duke
parents:
diff changeset
744 );
a61af66fc99e Initial load
duke
parents:
diff changeset
745 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
747 }
a61af66fc99e Initial load
duke
parents:
diff changeset
748
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
749 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
750 // 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
751 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
752 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
753
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
754 // resolve specified klass
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
755 KlassHandle resolved_klass;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
756 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
757
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
758 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
759 resolve_field(result, resolved_klass, field, sig, current_klass, byte, true, true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
760 }
a61af66fc99e Initial load
duke
parents:
diff changeset
761
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
762 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
763 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
764 TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
765 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
766 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
767 (byte == Bytecodes::_nop && !check_access), "bad field access bytecode");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
768
a61af66fc99e Initial load
duke
parents:
diff changeset
769 bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
a61af66fc99e Initial load
duke
parents:
diff changeset
770 bool is_put = (byte == Bytecodes::_putfield || byte == Bytecodes::_putstatic);
a61af66fc99e Initial load
duke
parents:
diff changeset
771
a61af66fc99e Initial load
duke
parents:
diff changeset
772 // 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
773 if (resolved_klass.is_null()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
774 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
775 THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
777
a61af66fc99e Initial load
duke
parents:
diff changeset
778 // Resolve instance field
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
779 KlassHandle sel_klass(THREAD, InstanceKlass::cast(resolved_klass())->find_field(field, sig, &fd));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // 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
781 if (sel_klass.is_null()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
782 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
783 THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
785
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
786 if (!check_access)
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
787 // 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
788 return;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
789
0
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // check access
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
791 check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
792
a61af66fc99e Initial load
duke
parents:
diff changeset
793 // check for errors
a61af66fc99e Initial load
duke
parents:
diff changeset
794 if (is_static != fd.is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
795 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
796 char msg[200];
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
797 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
798 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // 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
802 if (is_put && fd.access_flags().is_final() && sel_klass() != current_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
803 THROW(vmSymbols::java_lang_IllegalAccessError());
a61af66fc99e Initial load
duke
parents:
diff changeset
804 }
a61af66fc99e Initial load
duke
parents:
diff changeset
805
a61af66fc99e Initial load
duke
parents:
diff changeset
806 // initialize resolved_klass if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
807 // note 1: the klass which declared the field must be initialized (i.e, sel_klass)
a61af66fc99e Initial load
duke
parents:
diff changeset
808 // according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
a61af66fc99e Initial load
duke
parents:
diff changeset
809 //
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // note 2: we don't want to force initialization if we are just checking
a61af66fc99e Initial load
duke
parents:
diff changeset
811 // 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
812 if (is_static && initialize_class) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
813 sel_klass->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
814 }
a61af66fc99e Initial load
duke
parents:
diff changeset
815
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
816 if (sel_klass() != current_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
817 HandleMark hm(THREAD);
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
818 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
819 Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
820 {
a61af66fc99e Initial load
duke
parents:
diff changeset
821 ResourceMark rm(THREAD);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
822 Symbol* failed_type_symbol =
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
823 SystemDictionary::check_signature_loaders(sig,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
824 ref_loader, sel_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
825 false,
a61af66fc99e Initial load
duke
parents:
diff changeset
826 CHECK);
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
827 if (failed_type_symbol != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
828 const char* msg = "loader constraint violation: when resolving field"
a61af66fc99e Initial load
duke
parents:
diff changeset
829 " \"%s\" the class loader (instance of %s) of the referring class, "
a61af66fc99e Initial load
duke
parents:
diff changeset
830 "%s, and the class loader (instance of %s) for the field's resolved "
a61af66fc99e Initial load
duke
parents:
diff changeset
831 "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
832 char* field_name = field->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
833 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
834 char* sel = InstanceKlass::cast(sel_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
835 const char* loader2 = SystemDictionary::loader_name(sel_loader());
8840
cd3089a56438 8009731: Confusing error message for loader constraint violation
acorn
parents: 8706
diff changeset
836 char* failed_type_name = failed_type_symbol->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
837 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
838 strlen(sel) + strlen(loader2) + strlen(failed_type_name) + 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
839 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
840 jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
a61af66fc99e Initial load
duke
parents:
diff changeset
841 failed_type_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
842 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
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
a61af66fc99e Initial load
duke
parents:
diff changeset
847 // return information. note that the klass is set to the actual klass containing the
a61af66fc99e Initial load
duke
parents:
diff changeset
848 // field, otherwise access of static fields in superclasses will not work.
a61af66fc99e Initial load
duke
parents:
diff changeset
849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851
a61af66fc99e Initial load
duke
parents:
diff changeset
852 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // Invoke resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
854 //
a61af66fc99e Initial load
duke
parents:
diff changeset
855 // Naming conventions:
a61af66fc99e Initial load
duke
parents:
diff changeset
856 //
a61af66fc99e Initial load
duke
parents:
diff changeset
857 // resolved_method the specified method (i.e., static receiver specified via constant pool index)
a61af66fc99e Initial load
duke
parents:
diff changeset
858 // sel_method the selected method (selected via run-time lookup; e.g., based on dynamic receiver class)
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // resolved_klass the specified klass (i.e., specified via constant pool index)
a61af66fc99e Initial load
duke
parents:
diff changeset
860 // recv_klass the receiver klass
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
863 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
864 Symbol* method_signature, KlassHandle current_klass,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
865 bool check_access, bool initialize_class, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
866 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
867 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
868 resolved_klass = KlassHandle(THREAD, resolved_method->method_holder());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 // Initialize klass (this should only happen if everything is ok)
a61af66fc99e Initial load
duke
parents:
diff changeset
871 if (initialize_class && resolved_klass->should_be_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
872 resolved_klass->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
873 linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
875
a61af66fc99e Initial load
duke
parents:
diff changeset
876 // setup result
a61af66fc99e Initial load
duke
parents:
diff changeset
877 result.set_static(resolved_klass, resolved_method, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // throws linktime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
881 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
882 Symbol* method_name, Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
883 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
884
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
885 if (!resolved_klass->is_interface()) {
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
886 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
887 } else {
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
888 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
889 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
890 assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 // check if static
a61af66fc99e Initial load
duke
parents:
diff changeset
893 if (!resolved_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
894 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
895 char buf[200];
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
896 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
897 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
898 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
899 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
902
a61af66fc99e Initial load
duke
parents:
diff changeset
903
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
904 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
905 Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
906 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
907 linktime_resolve_special_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
908 runtime_resolve_special_method(result, resolved_method, resolved_klass, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
909 }
a61af66fc99e Initial load
duke
parents:
diff changeset
910
a61af66fc99e Initial load
duke
parents:
diff changeset
911 // throws linktime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
912 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
913 Symbol* method_name, Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
914 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
915
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
916 // Invokespecial is called for multiple special reasons:
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
917 // <init>
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
918 // 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
919 // 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
920 // 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
921 // superinterface.method, which explicitly does not check shadowing
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6822
diff changeset
922
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
923 if (!resolved_klass->is_interface()) {
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
924 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
925 } else {
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
926 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
927 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929 // check if method name is <init>, that it is found in same klass as static type
a61af66fc99e Initial load
duke
parents:
diff changeset
930 if (resolved_method->name() == vmSymbols::object_initializer_name() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
931 resolved_method->method_holder() != resolved_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
932 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
933 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
934 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
935 vmSymbols::java_lang_NoSuchMethodError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
936 "%s: method %s%s not found",
a61af66fc99e Initial load
duke
parents:
diff changeset
937 resolved_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
938 resolved_method->name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
939 resolved_method->signature()->as_C_string()
a61af66fc99e Initial load
duke
parents:
diff changeset
940 );
a61af66fc99e Initial load
duke
parents:
diff changeset
941 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
13401
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
944 // 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
945 if (!current_klass.is_null() && resolved_klass->is_interface()) {
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
946 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
947 current_klass() :
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
948 InstanceKlass::cast(current_klass())->host_klass();
13433
769557390c43 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
949 // As of the fix for 4486457 we disable verification for all of the
769557390c43 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
950 // dynamically-generated bytecodes associated with the 1.4
769557390c43 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
951 // reflection implementation, not just those associated with
769557390c43 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
952 // sun/reflect/SerializationConstructorAccessor.
769557390c43 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
953 bool is_reflect = JDK_Version::is_gte_jdk14x_version() &&
769557390c43 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
954 UseNewReflection &&
769557390c43 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
955 klass_to_check->is_subclass_of(
769557390c43 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
956 SystemDictionary::reflect_MagicAccessorImpl_klass());
13401
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
957
13433
769557390c43 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
958 if (!is_reflect &&
769557390c43 8029415: java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java fails on all platforms with hs25-b61
hseigel
parents: 13414
diff changeset
959 !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
960 ResourceMark rm(THREAD);
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
961 char buf[200];
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
962 jio_snprintf(buf, sizeof(buf),
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
963 "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
964 Method::name_and_sig_as_C_string(resolved_klass(),
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
965 resolved_method->name(),
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
966 resolved_method->signature()),
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
967 current_klass->external_name());
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
968 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
969 }
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
970 }
22eaa15b7960 8026065: InterfaceMethodref for invokespecial must name a direct superinterface
hseigel
parents: 13055
diff changeset
971
0
a61af66fc99e Initial load
duke
parents:
diff changeset
972 // check if not static
a61af66fc99e Initial load
duke
parents:
diff changeset
973 if (resolved_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
974 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
975 char buf[200];
a61af66fc99e Initial load
duke
parents:
diff changeset
976 jio_snprintf(buf, sizeof(buf),
a61af66fc99e Initial load
duke
parents:
diff changeset
977 "Expecting non-static method %s",
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
978 Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
979 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
980 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
981 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
983
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
984 if (TraceItables && Verbose) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
985 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
986 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
987 (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
988 (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
989 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
990 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
991 resolved_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
992 resolved_method->method_holder()->internal_name()
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 resolved_method->access_flags().print_on(tty);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
995 if (resolved_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
996 tty->print("default ");
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
997 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
998 if (resolved_method->is_overpass()) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
999 tty->print("overpass");
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1000 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1001 tty->cr();
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1002 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1004
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 // throws runtime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1008
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 // 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
1010 // for a superclass method
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1011 // 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
1012 // no checks for shadowing
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 methodHandle sel_method(THREAD, resolved_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
1014
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 // check if this is an old-style super call and do a new lookup if so
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 { KlassHandle method_klass = KlassHandle(THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 resolved_method->method_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1019 if (check_access &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 // a) check if ACC_SUPER flag is set for the current class
8702
77443715ec55 8001307: Modify ACC_SUPER behavior
kamg
parents: 6822
diff changeset
1021 (current_klass->is_super() || !AllowNonVirtualCalls) &&
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1022 // 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
1023 // (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
1024 // 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
1025 // in super interfaces.
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1026 current_klass->is_subclass_of(resolved_klass()) &&
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1027 current_klass() != resolved_klass() &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // c) check if the method is not <init>
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 resolved_method->name() != vmSymbols::object_initializer_name()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // Lookup super method
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 KlassHandle super_klass(THREAD, current_klass->super());
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 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
1033 resolved_method->name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1034 resolved_method->signature(), CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 // check if found
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 if (sel_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1039 Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1045
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 // check if not static
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 if (sel_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
1048 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 char buf[200];
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1050 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
1051 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1055
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 // check if abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 if (sel_method->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1060 Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 sel_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 sel_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1064
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1065 if (TraceItables && Verbose) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1066 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1067 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
1068 (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
1069 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
1070 sel_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1071 sel_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1072 sel_method->method_holder()->internal_name()
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1073 );
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1074 sel_method->access_flags().print_on(tty);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1075 if (sel_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1076 tty->print("default ");
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1077 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1078 if (sel_method->is_overpass()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1079 tty->print("overpass");
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1080 }
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1081 tty->cr();
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1082 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1083
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 // setup result
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 result.set_static(resolved_klass, sel_method, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1087
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 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
1089 Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 bool check_access, bool check_null_and_abstract, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 linktime_resolve_virtual_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 runtime_resolve_virtual_method(result, resolved_method, resolved_klass, recv, receiver_klass, check_null_and_abstract, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1095
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 // throws linktime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 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
1098 Symbol* method_name, Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // normal method resolution
12858
2f8728d92483 8026299: invokespecial gets ICCE when it should get AME.
acorn
parents: 12823
diff changeset
1101 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1102
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
1105
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1106 // check if private interface method
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1107 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
1108 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1109 char buf[200];
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1110 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
1111 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
1112 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1113 resolved_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1114 (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
1115 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1116 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1117
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 // check if not static
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 if (resolved_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
1120 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 char buf[200];
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1122 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
1123 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 }
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1127
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1128 if (PrintVtables && Verbose) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1129 ResourceMark rm(THREAD);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1130 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
1131 (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1132 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1133 Method::name_and_sig_as_C_string(resolved_klass(),
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1134 resolved_method->name(),
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1135 resolved_method->signature()),
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1136 resolved_method->method_holder()->internal_name()
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 resolved_method->access_flags().print_on(tty);
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1139 if (resolved_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1140 tty->print("default ");
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1141 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1142 if (resolved_method->is_overpass()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1143 tty->print("overpass");
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1144 }
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1145 tty->cr();
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1146 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1148
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 // throws runtime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 methodHandle resolved_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 Handle recv,
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 KlassHandle recv_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 bool check_null_and_abstract,
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1157
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 // setup default return values
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1159 int vtable_index = Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 methodHandle selected_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1161
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 assert(recv.is_null() || recv->is_oop(), "receiver is not an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
1163
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 // runtime method resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 if (check_null_and_abstract && recv.is_null()) { // check if receiver exists
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1168
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1169 // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 // 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
1172 assert(resolved_method->method_holder()->is_linked(), "must be linked");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 // 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
1175 if (resolved_method->method_holder()->is_interface()) { // miranda method
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1176 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
1177 resolved_method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 assert(vtable_index >= 0 , "we should have valid vtable index at this point");
a61af66fc99e Initial load
duke
parents:
diff changeset
1179
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1180 InstanceKlass* inst = InstanceKlass::cast(recv_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // at this point we are sure that resolved_method is virtual and not
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 // 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
1185 assert(!resolved_method->has_itable_index(), "");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 vtable_index = resolved_method->vtable_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 // We could get a negative vtable_index for final methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 // because as an optimization they are they are never put in the vtable,
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 // unless they override an existing method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 // If we do get a negative, it means the resolved method is the the selected
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 // 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
1192 if (vtable_index == Method::nonvirtual_vtable_index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 assert(resolved_method->can_be_statically_bound(), "cannot override this method");
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 selected_method = resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // recv_klass might be an arrayKlassOop but all vtables start at
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 // 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
1198 InstanceKlass* inst = (InstanceKlass*)recv_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1202
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 // check if method exists
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 if (selected_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1207 Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 // check if abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 if (check_null_and_abstract && selected_method->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1216 Method::name_and_sig_as_C_string(resolved_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 selected_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 selected_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1220
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1221 if (PrintVtables && Verbose) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1222 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1223 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
1224 (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
1225 (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
1226 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
1227 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1228 resolved_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1229 selected_method->method_holder()->internal_name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1230 vtable_index
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 selected_method->access_flags().print_on(tty);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1233 if (selected_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1234 tty->print("default ");
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1235 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1236 if (selected_method->is_overpass()) {
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1237 tty->print("overpass");
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1238 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1239 tty->cr();
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1240 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 // setup result
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1244
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 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
1246 Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 bool check_access, bool check_null_and_abstract, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 linktime_resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 runtime_resolve_interface_method(result, resolved_method, resolved_klass, recv, recv_klass, check_null_and_abstract, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1252
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 // throws linktime exceptions
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1254 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
1255 Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 // normal interface method resolution
13413
7a58803b5069 8026066: ICCE for invokeinterface static
acorn
parents: 13401
diff changeset
1257 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
1258
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1262
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 // throws runtime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 // check if receiver exists
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 if (check_null_and_abstract && recv.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1270
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1271 // check if private interface method
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1272 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
1273 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1274 char buf[200];
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1275 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
1276 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
1277 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1278 resolved_method->signature()));
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1279 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1280 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1281
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 // check if receiver klass implements the resolved interface
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 if (!recv_klass->is_subtype_of(resolved_klass())) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
1284 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 char buf[200];
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 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
1287 recv_klass()->external_name(),
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1288 resolved_klass()->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 }
17464
5832cdaf89c6 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 13436
diff changeset
1291
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 // do lookup based on receiver klass
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 methodHandle sel_method;
17464
5832cdaf89c6 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 13436
diff changeset
1294 // This search must match the linktime preparation search for itable initialization
5832cdaf89c6 8027804: JCK resolveMethod test fails expecting AbstractMethodError
hseigel
parents: 13436
diff changeset
1295 // to correctly enforce loader constraints for interface method inheritance
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 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
1297 resolved_method->name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1298 resolved_method->signature(), CHECK);
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1299 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
1300 // 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
1301 // 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
1302 // This needs further study.
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1303 sel_method = resolved_method;
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1304 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 // check if method exists
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 if (sel_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1309 Method::name_and_sig_as_C_string(recv_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 }
10128
41ed397cc0cd 8006267: InterfaceMethod_ref should allow invokestatic and invokespecial
bharadwaj
parents: 9082
diff changeset
1313 // check access
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1314 // 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
1315 if (!sel_method->is_public()) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1316 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1317 THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1318 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
1319 sel_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1320 sel_method->signature()));
10128
41ed397cc0cd 8006267: InterfaceMethod_ref should allow invokestatic and invokespecial
bharadwaj
parents: 9082
diff changeset
1321 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 // check if abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 if (check_null_and_abstract && sel_method->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1326 Method::name_and_sig_as_C_string(recv_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 sel_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 sel_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 }
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1330
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1331 if (TraceItables && Verbose) {
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1332 ResourceMark rm(THREAD);
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1333 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
1334 (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
1335 (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
1336 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
1337 resolved_method->name(),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1338 resolved_method->signature()),
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1339 sel_method->method_holder()->internal_name()
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 sel_method->access_flags().print_on(tty);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1342 if (sel_method->is_default_method()) {
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1343 tty->print("default ");
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1344 }
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12318
diff changeset
1345 if (sel_method->is_overpass()) {
12318
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1346 tty->print("overpass");
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1347 }
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1348 tty->cr();
36b97be47bde 8011311: Private interface methods. Default conflicts:ICCE. no erased_super_default.
acorn
parents: 12316
diff changeset
1349 }
13055
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1350 // setup result
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1351 if (!resolved_method->has_itable_index()) {
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1352 int vtable_index = resolved_method->vtable_index();
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1353 assert(vtable_index == sel_method->vtable_index(), "sanity check");
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1354 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
1355 } else {
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1356 int itable_index = resolved_method()->itable_index();
fce21ac5968d 8027229: ICCE expected for >=2 maximally specific default methods.
acorn
parents: 12945
diff changeset
1357 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
1358 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1360
a61af66fc99e Initial load
duke
parents:
diff changeset
1361
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1364 Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1365 Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 KlassHandle current_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 bool check_access) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 methodHandle method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 linktime_resolve_interface_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 return method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1378
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 methodHandle LinkResolver::linktime_resolve_virtual_method_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1381 Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1382 Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 KlassHandle current_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 bool check_access) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 methodHandle method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 linktime_resolve_virtual_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 return method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1395
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 methodHandle LinkResolver::resolve_virtual_call_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 KlassHandle receiver_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1399 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1400 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1411
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 methodHandle LinkResolver::resolve_interface_call_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 KlassHandle receiver_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1415 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1416 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 resolve_interface_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1427
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 int LinkResolver::resolve_virtual_vtable_index(
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 KlassHandle receiver_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1431 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1432 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 CLEAR_PENDING_EXCEPTION;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1439 return Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 return info.vtable_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1443
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 methodHandle LinkResolver::resolve_static_call_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1446 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1447 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 resolve_static_call(info, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1458
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1459 methodHandle LinkResolver::resolve_special_call_or_null(KlassHandle resolved_klass, Symbol* name, Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 resolve_special_call(info, resolved_klass, name, signature, current_klass, true, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1470
a61af66fc99e Initial load
duke
parents:
diff changeset
1471
a61af66fc99e Initial load
duke
parents:
diff changeset
1472
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 // ConstantPool entries
a61af66fc99e Initial load
duke
parents:
diff changeset
1475
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 switch (byte) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 case Bytecodes::_invokespecial : resolve_invokespecial (result, pool, index, CHECK); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 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
1481 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
1482 case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1487
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1488 void LinkResolver::resolve_pool(KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 // resolve klass
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 resolve_klass(resolved_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1492
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 // Get name, signature, and static klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1494 method_name = pool->name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1495 method_signature = pool->signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 current_klass = KlassHandle(THREAD, pool->pool_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1498
a61af66fc99e Initial load
duke
parents:
diff changeset
1499
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 void LinkResolver::resolve_invokestatic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1502 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1503 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 resolve_static_call(result, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1508
a61af66fc99e Initial load
duke
parents:
diff changeset
1509
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 void LinkResolver::resolve_invokespecial(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1512 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1513 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 resolve_special_call(result, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1518
a61af66fc99e Initial load
duke
parents:
diff changeset
1519
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 void LinkResolver::resolve_invokevirtual(CallInfo& result, Handle recv,
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 constantPoolHandle pool, int index,
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1523
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1525 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1526 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 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
1529 KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 resolve_virtual_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1532
a61af66fc99e Initial load
duke
parents:
diff changeset
1533
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1536 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1537 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 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
1540 KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1543
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1544
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1545 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
1546 assert(EnableInvokeDynamic, "");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1547 // 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
1548 KlassHandle resolved_klass;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1549 Symbol* method_name = NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1550 Symbol* method_signature = NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1551 KlassHandle current_klass;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1552 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
1553 if (TraceMethodHandles) {
d79859ff6535 8011952: Missing ResourceMarks in TraceMethodHandles
kmo
parents: 8840
diff changeset
1554 ResourceMark rm(THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1555 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
1556 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1557 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
1558 }
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1559
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1560 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
1561 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
1562 KlassHandle current_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1563 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1564 // 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
1565 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
1566 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
1567 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
1568 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
1569 Handle resolved_method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1570 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
1571 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
1572 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
1573 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
1574 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1575
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1576
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1577 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
1578 assert(EnableInvokeDynamic, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1579
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
1580 //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
1581 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
1582 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
1583 KlassHandle current_klass = KlassHandle(THREAD, pool->pool_holder());
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1584
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1585 // 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
1586 Handle bootstrap_specifier;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1587 // Check if CallSite has been bound already:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1588 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
1589 if (cpce->is_f1_null()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1590 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
1591 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
1592 assert(bsm_info != NULL, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1593 // 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
1594 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
1595 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1596 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
1597 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
1598 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
1599 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
1600 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
1601 return;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1602 }
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1603
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1604 if (TraceMethodHandles) {
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1605 ResourceMark rm(THREAD);
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1606 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
1607 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
1608 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
1609 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
1610 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1611
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1612 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
1613 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1614
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1615 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
1616 Handle bootstrap_specifier,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1617 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
1618 KlassHandle current_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1619 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1620 // 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
1621 // 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
1622 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
1623 Handle resolved_method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1624 methodHandle resolved_method =
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1625 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
1626 bootstrap_specifier,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1627 method_name, method_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1628 &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
1629 &resolved_method_type,
6729
d17383603741 7196120: NPG: JSR 2292 test fails because missing fix for 7188911
twisti
parents: 6725
diff changeset
1630 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
1631 if (HAS_PENDING_EXCEPTION) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1632 if (TraceMethodHandles) {
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17889
diff changeset
1633 tty->print_cr("invokedynamic throws BSME for " INTPTR_FORMAT, p2i((void *)PENDING_EXCEPTION));
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1634 PENDING_EXCEPTION->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1635 }
3744
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1636 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
1637 // 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
1638 return;
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1639 }
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1640 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
1641 // 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
1642 return;
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1643 }
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1644 // 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
1645 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
1646 CLEAR_PENDING_EXCEPTION;
6729
d17383603741 7196120: NPG: JSR 2292 test fails because missing fix for 7188911
twisti
parents: 6725
diff changeset
1647 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
1648 }
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
1649 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
1650 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1651
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1654
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1655 void CallInfo::print() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 ResourceMark rm;
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1657 const char* kindstr = "unknown";
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1658 switch (_call_kind) {
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1659 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
1660 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
1661 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
1662 }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 10128
diff changeset
1663 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
1664 _resolved_method.is_null() ? "(none)" : _resolved_method->name_and_sig_as_C_string());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1666
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 #endif