annotate src/share/vm/interpreter/linkResolver.cpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents f6b0eb4e44cf
children 4735d2c84362 77443715ec55
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2 * Copyright (c) 1997, 2012, 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"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
27 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
28 #include "compiler/compileBroker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
29 #include "gc_interface/collectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
30 #include "interpreter/bytecode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
31 #include "interpreter/interpreterRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
32 #include "interpreter/linkResolver.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
33 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
34 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
35 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
36 #include "oops/objArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
37 #include "prims/methodHandles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
38 #include "prims/nativeLookup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
39 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
40 #include "runtime/fieldDescriptor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
41 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
42 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
43 #include "runtime/reflection.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
44 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
45 #include "runtime/vmThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
46 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
47 # include "thread_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
48 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
49 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
50 # include "thread_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
51 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
52 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
53 # include "thread_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
54 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3837
diff changeset
55 #ifdef TARGET_OS_FAMILY_bsd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3837
diff changeset
56 # include "thread_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3837
diff changeset
57 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // Implementation of FieldAccessInfo
a61af66fc99e Initial load
duke
parents:
diff changeset
61
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
62 void FieldAccessInfo::set(KlassHandle klass, Symbol* name, int field_index, int field_offset,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
63 BasicType field_type, AccessFlags access_flags) {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 _klass = klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 _name = name;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 _field_index = field_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 _field_offset = field_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 _field_type = field_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 _access_flags = access_flags;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 }
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // Implementation of CallInfo
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 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
78 int vtable_index = Method::nonvirtual_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79 set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, vtable_index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 void CallInfo::set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // This is only called for interface methods. If the resolved_method
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // comes from java/lang/Object, it can be the subject of a virtual call, so
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // we should pick the vtable index from the resolved method.
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Other than that case, there is no valid vtable index to specify.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
88 int vtable_index = Method::invalid_vtable_index;
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
89 if (resolved_method->method_holder() == SystemDictionary::Object_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
90 assert(resolved_method->vtable_index() == selected_method->vtable_index(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
91 vtable_index = resolved_method->vtable_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 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
97 assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, "valid index");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98 set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
99 assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
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
102 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
103 if (resolved_method.is_null()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
104 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
105 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
106 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
107 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
108 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
109 "linkMethod must return one of these");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
110 int vtable_index = Method::nonvirtual_vtable_index;
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1552
diff changeset
111 assert(resolved_method->vtable_index() == vtable_index, "");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
112 set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, 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
113 _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
114 _resolved_method_type = resolved_method_type;
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1552
diff changeset
115 }
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1552
diff changeset
116
0
a61af66fc99e Initial load
duke
parents:
diff changeset
117 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
a61af66fc99e Initial load
duke
parents:
diff changeset
119 _resolved_klass = resolved_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 _selected_klass = selected_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 _resolved_method = resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 _selected_method = selected_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 _vtable_index = vtable_index;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
124 _resolved_appendix = Handle();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1660
diff changeset
125 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
126 // 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
127
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1660
diff changeset
128 // Note: with several active threads, the must_be_compiled may be true
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1660
diff changeset
129 // while can_be_compiled is false; remove assert
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1660
diff changeset
130 // assert(CompilationPolicy::can_be_compiled(selected_method), "cannot compile");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131 if (THREAD->is_Compiler_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // don't force compilation, resolve was on behalf of compiler
a61af66fc99e Initial load
duke
parents:
diff changeset
133 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
135 if (InstanceKlass::cast(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
136 // '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
137 // 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
138 // 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
139 // 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
140 // in CompileBroker::compile_method.
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
141 // 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
142 // even before classes are initialized.
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
143 return;
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1059
diff changeset
144 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
145 CompileBroker::compile_method(selected_method, InvocationEntryBci,
3837
43f9d800f276 7066339: Tiered: policy should make consistent decisions about osr levels
iveresov
parents: 3785
diff changeset
146 CompilationPolicy::policy()->initial_compile_level(),
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1660
diff changeset
147 methodHandle(), 0, "must_be_compiled", CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Klass resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 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
156 if (!Reflection::verify_class_access(ref_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
157 sel_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
158 true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
159 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
160 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
161 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
162 vmSymbols::java_lang_IllegalAccessError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
163 "tried to access class %s from class %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
164 sel_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
165 ref_klass->external_name()
a61af66fc99e Initial load
duke
parents:
diff changeset
166 );
a61af66fc99e Initial load
duke
parents:
diff changeset
167 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 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
172 Klass* result_oop = pool->klass_ref_at(index, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
173 result = KlassHandle(THREAD, result_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 void LinkResolver::resolve_klass_no_update(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
177 Klass* result_oop =
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
178 ConstantPool::klass_ref_at_if_loaded_check(pool, index, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
179 result = KlassHandle(THREAD, result_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Method resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
185 //
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // According to JVM spec. $5.4.3c & $5.4.3d
a61af66fc99e Initial load
duke
parents:
diff changeset
187
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
188 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
189 Method* result_oop = klass->uncached_lookup_method(name, signature);
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2359
diff changeset
190 if (EnableInvokeDynamic && result_oop != NULL) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
191 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
192 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
193 // 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
194 return;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1142
diff changeset
195 }
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1142
diff changeset
196 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
197 result = methodHandle(THREAD, result_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // returns first instance method
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
201 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
202 Method* result_oop = klass->uncached_lookup_method(name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
203 result = methodHandle(THREAD, result_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 while (!result.is_null() && result->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 klass = KlassHandle(THREAD, Klass::cast(result->method_holder())->super());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
206 result = methodHandle(THREAD, klass->uncached_lookup_method(name, signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
211 int LinkResolver::vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
212 ResourceMark rm(THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
213 klassVtable *vt = InstanceKlass::cast(klass())->vtable();
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
214 return vt->index_of_miranda(name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
217 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
218 InstanceKlass *ik = InstanceKlass::cast(klass());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
219 result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
222 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
223 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
224 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
225 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
226 Handle *method_type_result,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
227 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
228 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
229 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
230 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
231 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
232 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
233 }
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2359
diff changeset
234 if (EnableInvokeDynamic &&
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1142
diff changeset
235 klass() == SystemDictionary::MethodHandle_klass() &&
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
236 iid != vmIntrinsics::_none) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
237 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
238 // 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
239 // 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
240 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
241 TempNewSymbol basic_signature =
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
242 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
243 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
244 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
245 name->as_C_string(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
246 full_signature->as_C_string(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
247 basic_signature->as_C_string());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
248 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
249 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
250 basic_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
251 CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
252 if (result.not_null()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
253 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
254 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
255 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
256 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
257 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
258 result->print_on(tty);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
259 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
260 return;
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1552
diff changeset
261 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
262 } else if (iid == vmIntrinsics::_invokeGeneric
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
263 && !THREAD->is_Compiler_thread()
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
264 && appendix_result_or_null != NULL) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
265 // 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
266 // 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
267 if (!MethodHandles::enabled()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
268 // 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
269 Klass* natives = SystemDictionary::MethodHandleNatives_klass();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
270 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
271 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
272 Handle(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
273 Handle(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
274 true,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
275 CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
276 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
277 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
278
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
279 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
280 Handle method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
281 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
282 full_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
283 current_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
284 &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
285 &method_type,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
286 CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
287 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
288 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
289 result->print_on(tty);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
290 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
291 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
292 else appendix->print_on(tty);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
293 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
294 if (result.not_null()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
295 #ifdef ASSERT
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
296 TempNewSymbol basic_signature =
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
297 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
298 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
299 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
300 // +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
301 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
302 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
303 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
304 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
305 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
306 result->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
307 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
308 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
309 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
310 #endif //ASSERT
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
311
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
312 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
313 (*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
314 (*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
315 return;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
316 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
317 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
318 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
319 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
320
0
a61af66fc99e Initial load
duke
parents:
diff changeset
321 void LinkResolver::check_method_accessability(KlassHandle ref_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
322 KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
323 KlassHandle sel_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
324 methodHandle sel_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
325 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 AccessFlags flags = sel_method->access_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Special case: arrays always override "clone". JVMS 2.15.
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // If the resolved klass is an array class, and the declaring class
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // is java.lang.Object and the method is "clone", set the flags
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // to public.
a61af66fc99e Initial load
duke
parents:
diff changeset
333 //
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // We'll check for the method name first, as that's most likely
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // to be false (so we'll short-circuit out of these tests).
a61af66fc99e Initial load
duke
parents:
diff changeset
336 if (sel_method->name() == vmSymbols::clone_name() &&
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
337 sel_klass() == SystemDictionary::Object_klass() &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
338 resolved_klass->oop_is_array()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // We need to change "protected" to "public".
a61af66fc99e Initial load
duke
parents:
diff changeset
340 assert(flags.is_protected(), "clone not protected?");
a61af66fc99e Initial load
duke
parents:
diff changeset
341 jint new_flags = flags.as_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
342 new_flags = new_flags & (~JVM_ACC_PROTECTED);
a61af66fc99e Initial load
duke
parents:
diff changeset
343 new_flags = new_flags | JVM_ACC_PUBLIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
344 flags.set_flags(new_flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
346 // assert(extra_arg_result_or_null != NULL, "must be able to return extra argument");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
348 if (!Reflection::verify_field_access(ref_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
349 resolved_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
350 sel_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
351 flags,
a61af66fc99e Initial load
duke
parents:
diff changeset
352 true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
355 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
356 vmSymbols::java_lang_IllegalAccessError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
357 "tried to access method %s.%s%s from class %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
358 sel_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
359 sel_method->name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
360 sel_method->signature()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
361 ref_klass->external_name()
a61af66fc99e Initial load
duke
parents:
diff changeset
362 );
a61af66fc99e Initial load
duke
parents:
diff changeset
363 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
366
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
367 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
368 Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
369
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // resolve klass
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
371 if (code == Bytecodes::_invokedynamic) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
372 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
373 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
374 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
375 KlassHandle current_klass(THREAD, pool->pool_holder());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
376 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
377 return;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
378 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
379
0
a61af66fc99e Initial load
duke
parents:
diff changeset
380 resolve_klass(resolved_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
381
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
382 Symbol* method_name = pool->name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
383 Symbol* method_signature = pool->signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
384 KlassHandle current_klass(THREAD, pool->pool_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
385
3785
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
386 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
387 || (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
388 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
389 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
390 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
391 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
392 return;
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
393 }
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
394 }
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3744
diff changeset
395
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
396 if (code == Bytecodes::_invokeinterface) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
397 resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
398 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
399 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
400 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 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
404 Symbol* method_name, Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
405 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // 1. check if klass is not interface
a61af66fc99e Initial load
duke
parents:
diff changeset
408 if (resolved_klass->is_interface()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
409 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410 char buf[200];
a61af66fc99e Initial load
duke
parents:
diff changeset
411 jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
412 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
414
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
415 Handle nested_exception;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
416
0
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // 2. lookup method in resolved klass and its super klasses
a61af66fc99e Initial load
duke
parents:
diff changeset
418 lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 if (resolved_method.is_null()) { // not found in the class hierarchy
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // 3. lookup method in all the interfaces implemented by the resolved klass
a61af66fc99e Initial load
duke
parents:
diff changeset
422 lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 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
425 // 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
426 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
427 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
428 if (HAS_PENDING_EXCEPTION) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
429 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
430 CLEAR_PENDING_EXCEPTION;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
431 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
432 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
433
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
434 if (resolved_method.is_null()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // 4. method lookup failed
a61af66fc99e Initial load
duke
parents:
diff changeset
436 ResourceMark rm(THREAD);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
437 THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
438 Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
439 method_name,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
440 method_signature),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
441 nested_exception);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // 5. check if method is concrete
a61af66fc99e Initial load
duke
parents:
diff changeset
446 if (resolved_method->is_abstract() && !resolved_klass->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
448 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
449 Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
450 method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
451 method_signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // 6. access checks, access checking may be turned off when calling from within the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
455 if (check_access) {
a61af66fc99e Initial load
duke
parents:
diff changeset
456 assert(current_klass.not_null() , "current_klass should not be null");
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // check if method can be accessed by the referring class
a61af66fc99e Initial load
duke
parents:
diff changeset
459 check_method_accessability(current_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
460 resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
461 KlassHandle(THREAD, resolved_method->method_holder()),
a61af66fc99e Initial load
duke
parents:
diff changeset
462 resolved_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
463 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // check loader constraints
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
466 Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
467 Handle class_loader (THREAD, InstanceKlass::cast(resolved_method->method_holder())->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
468 {
a61af66fc99e Initial load
duke
parents:
diff changeset
469 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
470 char* failed_type_name =
a61af66fc99e Initial load
duke
parents:
diff changeset
471 SystemDictionary::check_signature_loaders(method_signature, loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
472 class_loader, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
473 if (failed_type_name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 const char* msg = "loader constraint violation: when resolving method"
a61af66fc99e Initial load
duke
parents:
diff changeset
475 " \"%s\" the class loader (instance of %s) of the current class, %s,"
a61af66fc99e Initial load
duke
parents:
diff changeset
476 " and the class loader (instance of %s) for resolved class, %s, have"
a61af66fc99e Initial load
duke
parents:
diff changeset
477 " different Class objects for the type %s used in the signature";
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
478 char* sig = Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),method_name,method_signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
479 const char* loader1 = SystemDictionary::loader_name(loader());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
480 char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
481 const char* loader2 = SystemDictionary::loader_name(class_loader());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
482 char* resolved = InstanceKlass::cast(resolved_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
483 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
a61af66fc99e Initial load
duke
parents:
diff changeset
484 strlen(current) + strlen(loader2) + strlen(resolved) +
a61af66fc99e Initial load
duke
parents:
diff changeset
485 strlen(failed_type_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
486 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
487 jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
a61af66fc99e Initial load
duke
parents:
diff changeset
488 resolved, failed_type_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
490 }
a61af66fc99e Initial load
duke
parents:
diff changeset
491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495 void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
496 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
497 Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
498 Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
499 KlassHandle current_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
500 bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // check if klass is interface
a61af66fc99e Initial load
duke
parents:
diff changeset
503 if (!resolved_klass->is_interface()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
504 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
505 char buf[200];
a61af66fc99e Initial load
duke
parents:
diff changeset
506 jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", Klass::cast(resolved_klass())->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
507 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // lookup method in this interface or its super, java.lang.Object
a61af66fc99e Initial load
duke
parents:
diff changeset
511 lookup_instance_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 if (resolved_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // lookup method in all the super-interfaces
a61af66fc99e Initial load
duke
parents:
diff changeset
515 lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
516 if (resolved_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // no method found
a61af66fc99e Initial load
duke
parents:
diff changeset
518 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
520 Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
521 method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
522 method_signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526 if (check_access) {
a61af66fc99e Initial load
duke
parents:
diff changeset
527 HandleMark hm(THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
528 Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
529 Handle class_loader (THREAD, InstanceKlass::cast(resolved_method->method_holder())->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
530 {
a61af66fc99e Initial load
duke
parents:
diff changeset
531 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
532 char* failed_type_name =
a61af66fc99e Initial load
duke
parents:
diff changeset
533 SystemDictionary::check_signature_loaders(method_signature, loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
534 class_loader, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 if (failed_type_name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 const char* msg = "loader constraint violation: when resolving "
a61af66fc99e Initial load
duke
parents:
diff changeset
537 "interface method \"%s\" the class loader (instance of %s) of the "
a61af66fc99e Initial load
duke
parents:
diff changeset
538 "current class, %s, and the class loader (instance of %s) for "
a61af66fc99e Initial load
duke
parents:
diff changeset
539 "resolved class, %s, have different Class objects for the type %s "
a61af66fc99e Initial load
duke
parents:
diff changeset
540 "used in the signature";
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
541 char* sig = Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),method_name,method_signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
542 const char* loader1 = SystemDictionary::loader_name(loader());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
543 char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544 const char* loader2 = SystemDictionary::loader_name(class_loader());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
545 char* resolved = InstanceKlass::cast(resolved_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
a61af66fc99e Initial load
duke
parents:
diff changeset
547 strlen(current) + strlen(loader2) + strlen(resolved) +
a61af66fc99e Initial load
duke
parents:
diff changeset
548 strlen(failed_type_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
549 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
550 jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
a61af66fc99e Initial load
duke
parents:
diff changeset
551 resolved, failed_type_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
552 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
557
a61af66fc99e Initial load
duke
parents:
diff changeset
558 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // Field resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 void LinkResolver::check_field_accessability(KlassHandle ref_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
562 KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
563 KlassHandle sel_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
564 fieldDescriptor& fd,
a61af66fc99e Initial load
duke
parents:
diff changeset
565 TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
566 if (!Reflection::verify_field_access(ref_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
567 resolved_klass(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
568 sel_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
569 fd.access_flags(),
a61af66fc99e Initial load
duke
parents:
diff changeset
570 true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
571 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
572 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
573 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
574 vmSymbols::java_lang_IllegalAccessError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575 "tried to access field %s.%s from class %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
576 sel_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
577 fd.name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
578 ref_klass->external_name()
a61af66fc99e Initial load
duke
parents:
diff changeset
579 );
a61af66fc99e Initial load
duke
parents:
diff changeset
580 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584 void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
585 resolve_field(result, pool, index, byte, check_only, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, bool update_pool, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
a61af66fc99e Initial load
duke
parents:
diff changeset
590 byte == Bytecodes::_getfield || byte == Bytecodes::_putfield, "bad bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 bool is_put = (byte == Bytecodes::_putfield || byte == Bytecodes::_putstatic);
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // resolve specified klass
a61af66fc99e Initial load
duke
parents:
diff changeset
596 KlassHandle resolved_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
597 if (update_pool) {
a61af66fc99e Initial load
duke
parents:
diff changeset
598 resolve_klass(resolved_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
599 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
600 resolve_klass_no_update(resolved_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // Load these early in case the resolve of the containing klass fails
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
603 Symbol* field = pool->name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
604 Symbol* sig = pool->signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // Check if there's a resolved klass containing the field
a61af66fc99e Initial load
duke
parents:
diff changeset
606 if( resolved_klass.is_null() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
607 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
608 THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // Resolve instance field
a61af66fc99e Initial load
duke
parents:
diff changeset
612 fieldDescriptor fd; // find_field initializes fd if found
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
613 KlassHandle sel_klass(THREAD, InstanceKlass::cast(resolved_klass())->find_field(field, sig, &fd));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // check if field exists; i.e., if a klass containing the field def has been selected
a61af66fc99e Initial load
duke
parents:
diff changeset
615 if (sel_klass.is_null()){
a61af66fc99e Initial load
duke
parents:
diff changeset
616 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
617 THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
619
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // check access
a61af66fc99e Initial load
duke
parents:
diff changeset
621 KlassHandle ref_klass(THREAD, pool->pool_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
622 check_field_accessability(ref_klass, resolved_klass, sel_klass, fd, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // check for errors
a61af66fc99e Initial load
duke
parents:
diff changeset
625 if (is_static != fd.is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
626 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
627 char msg[200];
a61af66fc99e Initial load
duke
parents:
diff changeset
628 jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", Klass::cast(resolved_klass())->external_name(), fd.name()->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
629 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
631
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // Final fields can only be accessed from its own class.
a61af66fc99e Initial load
duke
parents:
diff changeset
633 if (is_put && fd.access_flags().is_final() && sel_klass() != pool->pool_holder()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
634 THROW(vmSymbols::java_lang_IllegalAccessError());
a61af66fc99e Initial load
duke
parents:
diff changeset
635 }
a61af66fc99e Initial load
duke
parents:
diff changeset
636
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // initialize resolved_klass if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // note 1: the klass which declared the field must be initialized (i.e, sel_klass)
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
a61af66fc99e Initial load
duke
parents:
diff changeset
640 //
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // note 2: we don't want to force initialization if we are just checking
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // if the field access is legal; e.g., during compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
643 if (is_static && !check_only) {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 sel_klass->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 {
a61af66fc99e Initial load
duke
parents:
diff changeset
648 HandleMark hm(THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
649 Handle ref_loader (THREAD, InstanceKlass::cast(ref_klass())->class_loader());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
650 Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
651 Symbol* signature_ref = pool->signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
652 {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
654 char* failed_type_name =
a61af66fc99e Initial load
duke
parents:
diff changeset
655 SystemDictionary::check_signature_loaders(signature_ref,
a61af66fc99e Initial load
duke
parents:
diff changeset
656 ref_loader, sel_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
657 false,
a61af66fc99e Initial load
duke
parents:
diff changeset
658 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
659 if (failed_type_name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 const char* msg = "loader constraint violation: when resolving field"
a61af66fc99e Initial load
duke
parents:
diff changeset
661 " \"%s\" the class loader (instance of %s) of the referring class, "
a61af66fc99e Initial load
duke
parents:
diff changeset
662 "%s, and the class loader (instance of %s) for the field's resolved "
a61af66fc99e Initial load
duke
parents:
diff changeset
663 "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
664 char* field_name = field->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
665 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
666 char* sel = InstanceKlass::cast(sel_klass())->name()->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
667 const char* loader2 = SystemDictionary::loader_name(sel_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
668 size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) +
a61af66fc99e Initial load
duke
parents:
diff changeset
669 strlen(sel) + strlen(loader2) + strlen(failed_type_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
670 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
671 jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
a61af66fc99e Initial load
duke
parents:
diff changeset
672 failed_type_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
673 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // return information. note that the klass is set to the actual klass containing the
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // field, otherwise access of static fields in superclasses will not work.
a61af66fc99e Initial load
duke
parents:
diff changeset
680 KlassHandle holder (THREAD, fd.field_holder());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
681 Symbol* name = fd.name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
682 result.set(holder, name, fd.index(), fd.offset(), fd.field_type(), fd.access_flags());
a61af66fc99e Initial load
duke
parents:
diff changeset
683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685
a61af66fc99e Initial load
duke
parents:
diff changeset
686 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
687 // Invoke resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
688 //
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // Naming conventions:
a61af66fc99e Initial load
duke
parents:
diff changeset
690 //
a61af66fc99e Initial load
duke
parents:
diff changeset
691 // resolved_method the specified method (i.e., static receiver specified via constant pool index)
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // sel_method the selected method (selected via run-time lookup; e.g., based on dynamic receiver class)
a61af66fc99e Initial load
duke
parents:
diff changeset
693 // resolved_klass the specified klass (i.e., specified via constant pool index)
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // recv_klass the receiver klass
a61af66fc99e Initial load
duke
parents:
diff changeset
695
a61af66fc99e Initial load
duke
parents:
diff changeset
696
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
697 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
698 Symbol* method_signature, KlassHandle current_klass,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
699 bool check_access, bool initialize_class, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
701 linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
702 resolved_klass = KlassHandle(THREAD, Klass::cast(resolved_method->method_holder()));
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // Initialize klass (this should only happen if everything is ok)
a61af66fc99e Initial load
duke
parents:
diff changeset
705 if (initialize_class && resolved_klass->should_be_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 resolved_klass->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
707 linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
708 }
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // setup result
a61af66fc99e Initial load
duke
parents:
diff changeset
711 result.set_static(resolved_klass, resolved_method, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
712 }
a61af66fc99e Initial load
duke
parents:
diff changeset
713
a61af66fc99e Initial load
duke
parents:
diff changeset
714 // throws linktime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
715 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
716 Symbol* method_name, Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
717 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
720 assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 // check if static
a61af66fc99e Initial load
duke
parents:
diff changeset
723 if (!resolved_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
724 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
725 char buf[200];
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
726 jio_snprintf(buf, sizeof(buf), "Expected static method %s", Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
727 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
728 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
729 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
730 }
a61af66fc99e Initial load
duke
parents:
diff changeset
731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
734 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
735 Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
736 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
737 linktime_resolve_special_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
738 runtime_resolve_special_method(result, resolved_method, resolved_klass, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
740
a61af66fc99e Initial load
duke
parents:
diff changeset
741 // throws linktime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
742 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
743 Symbol* method_name, Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
744 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
745
a61af66fc99e Initial load
duke
parents:
diff changeset
746 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
747
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // check if method name is <init>, that it is found in same klass as static type
a61af66fc99e Initial load
duke
parents:
diff changeset
749 if (resolved_method->name() == vmSymbols::object_initializer_name() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
750 resolved_method->method_holder() != resolved_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
751 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
752 Exceptions::fthrow(
a61af66fc99e Initial load
duke
parents:
diff changeset
753 THREAD_AND_LOCATION,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
754 vmSymbols::java_lang_NoSuchMethodError(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
755 "%s: method %s%s not found",
a61af66fc99e Initial load
duke
parents:
diff changeset
756 resolved_klass->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
757 resolved_method->name()->as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
758 resolved_method->signature()->as_C_string()
a61af66fc99e Initial load
duke
parents:
diff changeset
759 );
a61af66fc99e Initial load
duke
parents:
diff changeset
760 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 // check if not static
a61af66fc99e Initial load
duke
parents:
diff changeset
764 if (resolved_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
765 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
766 char buf[200];
a61af66fc99e Initial load
duke
parents:
diff changeset
767 jio_snprintf(buf, sizeof(buf),
a61af66fc99e Initial load
duke
parents:
diff changeset
768 "Expecting non-static method %s",
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
769 Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
770 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
771 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
772 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
775
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // throws runtime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
777 void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
778 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // resolved method is selected method unless we have an old-style lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
781 methodHandle sel_method(THREAD, resolved_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 // check if this is an old-style super call and do a new lookup if so
a61af66fc99e Initial load
duke
parents:
diff changeset
784 { KlassHandle method_klass = KlassHandle(THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
785 resolved_method->method_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787 if (check_access &&
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // a) check if ACC_SUPER flag is set for the current class
a61af66fc99e Initial load
duke
parents:
diff changeset
789 current_klass->is_super() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // b) check if the method class is a superclass of the current class (superclass relation is not reflexive!)
a61af66fc99e Initial load
duke
parents:
diff changeset
791 current_klass->is_subtype_of(method_klass()) && current_klass() != method_klass() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
792 // c) check if the method is not <init>
a61af66fc99e Initial load
duke
parents:
diff changeset
793 resolved_method->name() != vmSymbols::object_initializer_name()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
794 // Lookup super method
a61af66fc99e Initial load
duke
parents:
diff changeset
795 KlassHandle super_klass(THREAD, current_klass->super());
a61af66fc99e Initial load
duke
parents:
diff changeset
796 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
797 resolved_method->name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
798 resolved_method->signature(), CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
799 // check if found
a61af66fc99e Initial load
duke
parents:
diff changeset
800 if (sel_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
801 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
802 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
803 Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
804 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
805 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
806 }
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // check if not static
a61af66fc99e Initial load
duke
parents:
diff changeset
811 if (sel_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
812 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
813 char buf[200];
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
814 jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
815 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
816 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
817 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
818 }
a61af66fc99e Initial load
duke
parents:
diff changeset
819
a61af66fc99e Initial load
duke
parents:
diff changeset
820 // check if abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
821 if (sel_method->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
822 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
823 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
824 Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
825 sel_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
826 sel_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
827 }
a61af66fc99e Initial load
duke
parents:
diff changeset
828
a61af66fc99e Initial load
duke
parents:
diff changeset
829 // setup result
a61af66fc99e Initial load
duke
parents:
diff changeset
830 result.set_static(resolved_klass, sel_method, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 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
834 Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
835 bool check_access, bool check_null_and_abstract, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
836 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
837 linktime_resolve_virtual_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
838 runtime_resolve_virtual_method(result, resolved_method, resolved_klass, recv, receiver_klass, check_null_and_abstract, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
840
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // throws linktime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
842 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
843 Symbol* method_name, Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
844 KlassHandle current_klass, bool check_access, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
845 // normal method resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
846 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
849 assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // check if not static
a61af66fc99e Initial load
duke
parents:
diff changeset
852 if (resolved_method->is_static()) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
853 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
854 char buf[200];
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
855 jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
856 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
857 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
858 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
859 }
a61af66fc99e Initial load
duke
parents:
diff changeset
860 }
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // throws runtime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
863 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
a61af66fc99e Initial load
duke
parents:
diff changeset
864 methodHandle resolved_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
865 KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
866 Handle recv,
a61af66fc99e Initial load
duke
parents:
diff changeset
867 KlassHandle recv_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
868 bool check_null_and_abstract,
a61af66fc99e Initial load
duke
parents:
diff changeset
869 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 // setup default return values
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
872 int vtable_index = Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
873 methodHandle selected_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 assert(recv.is_null() || recv->is_oop(), "receiver is not an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 // runtime method resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
878 if (check_null_and_abstract && recv.is_null()) { // check if receiver exists
a61af66fc99e Initial load
duke
parents:
diff changeset
879 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
880 }
a61af66fc99e Initial load
duke
parents:
diff changeset
881
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
882 // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
0
a61af66fc99e Initial load
duke
parents:
diff changeset
883 // has not been rewritten, and the vtable initialized.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
884 assert(InstanceKlass::cast(resolved_method->method_holder())->is_linked(), "must be linked");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
885
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
886 // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
0
a61af66fc99e Initial load
duke
parents:
diff changeset
887 // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since
a61af66fc99e Initial load
duke
parents:
diff changeset
888 // a missing receiver might result in a bogus lookup.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
889 assert(InstanceKlass::cast(resolved_method->method_holder())->is_linked(), "must be linked");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // 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
892 if (resolved_method->method_holder()->is_interface()) { // miranda method
0
a61af66fc99e Initial load
duke
parents:
diff changeset
893 vtable_index = vtable_index_of_miranda_method(resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
894 resolved_method->name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
895 resolved_method->signature(), CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
896 assert(vtable_index >= 0 , "we should have valid vtable index at this point");
a61af66fc99e Initial load
duke
parents:
diff changeset
897
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
898 InstanceKlass* inst = InstanceKlass::cast(recv_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
899 selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
900 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // at this point we are sure that resolved_method is virtual and not
a61af66fc99e Initial load
duke
parents:
diff changeset
902 // a miranda method; therefore, it must have a valid vtable index.
a61af66fc99e Initial load
duke
parents:
diff changeset
903 vtable_index = resolved_method->vtable_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
904 // We could get a negative vtable_index for final methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // because as an optimization they are they are never put in the vtable,
a61af66fc99e Initial load
duke
parents:
diff changeset
906 // unless they override an existing method.
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // If we do get a negative, it means the resolved method is the the selected
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // 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
909 if (vtable_index == Method::nonvirtual_vtable_index) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
910 assert(resolved_method->can_be_statically_bound(), "cannot override this method");
a61af66fc99e Initial load
duke
parents:
diff changeset
911 selected_method = resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
912 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // recv_klass might be an arrayKlassOop but all vtables start at
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // 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
915 InstanceKlass* inst = (InstanceKlass*)recv_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
916 selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // check if method exists
a61af66fc99e Initial load
duke
parents:
diff changeset
921 if (selected_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
922 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
923 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
924 Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
925 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
926 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
927 }
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929 // check if abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
930 if (check_null_and_abstract && selected_method->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
932 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
933 Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
934 selected_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
935 selected_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938 // setup result
a61af66fc99e Initial load
duke
parents:
diff changeset
939 result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
940 }
a61af66fc99e Initial load
duke
parents:
diff changeset
941
a61af66fc99e Initial load
duke
parents:
diff changeset
942 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
943 Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
944 bool check_access, bool check_null_and_abstract, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
945 methodHandle resolved_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
946 linktime_resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
947 runtime_resolve_interface_method(result, resolved_method, resolved_klass, recv, recv_klass, check_null_and_abstract, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
949
a61af66fc99e Initial load
duke
parents:
diff changeset
950 // throws linktime exceptions
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
951 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
952 Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // normal interface method resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
954 resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
955
a61af66fc99e Initial load
duke
parents:
diff changeset
956 assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
957 assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
a61af66fc99e Initial load
duke
parents:
diff changeset
958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
959
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // throws runtime exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
961 void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
962 Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
963 // check if receiver exists
a61af66fc99e Initial load
duke
parents:
diff changeset
964 if (check_null_and_abstract && recv.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
965 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
966 }
a61af66fc99e Initial load
duke
parents:
diff changeset
967
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // check if receiver klass implements the resolved interface
a61af66fc99e Initial load
duke
parents:
diff changeset
969 if (!recv_klass->is_subtype_of(resolved_klass())) {
3324
acf5e660c71a 6728025: LinkResolver is missing some ResourceMarks
jcoomes
parents: 2460
diff changeset
970 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
971 char buf[200];
a61af66fc99e Initial load
duke
parents:
diff changeset
972 jio_snprintf(buf, sizeof(buf), "Class %s does not implement the requested interface %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
973 (Klass::cast(recv_klass()))->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
974 (Klass::cast(resolved_klass()))->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
975 THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
976 }
a61af66fc99e Initial load
duke
parents:
diff changeset
977 // do lookup based on receiver klass
a61af66fc99e Initial load
duke
parents:
diff changeset
978 methodHandle sel_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
979 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
980 resolved_method->name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
981 resolved_method->signature(), CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
982 // check if method exists
a61af66fc99e Initial load
duke
parents:
diff changeset
983 if (sel_method.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
984 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
985 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
986 Method::name_and_sig_as_C_string(Klass::cast(recv_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
987 resolved_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
988 resolved_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
990 // check if public
a61af66fc99e Initial load
duke
parents:
diff changeset
991 if (!sel_method->is_public()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
992 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
993 THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
994 Method::name_and_sig_as_C_string(Klass::cast(recv_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
995 sel_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
996 sel_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
997 }
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // check if abstract
a61af66fc99e Initial load
duke
parents:
diff changeset
999 if (check_null_and_abstract && sel_method->is_abstract()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1002 Method::name_and_sig_as_C_string(Klass::cast(recv_klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 sel_method->name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 sel_method->signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 // setup result
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 result.set_interface(resolved_klass, recv_klass, resolved_method, sel_method, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1009
a61af66fc99e Initial load
duke
parents:
diff changeset
1010
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1013 Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1014 Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 KlassHandle current_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 bool check_access) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 methodHandle method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 linktime_resolve_interface_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 return method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 methodHandle LinkResolver::linktime_resolve_virtual_method_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1030 Symbol* method_name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1031 Symbol* method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 KlassHandle current_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 bool check_access) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 methodHandle method_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 linktime_resolve_virtual_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 return method_result;
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 methodHandle LinkResolver::resolve_virtual_call_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 KlassHandle receiver_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1048 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1049 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1060
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 methodHandle LinkResolver::resolve_interface_call_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 KlassHandle receiver_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1064 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1065 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 resolve_interface_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 int LinkResolver::resolve_virtual_vtable_index(
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 KlassHandle receiver_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1080 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1081 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 CLEAR_PENDING_EXCEPTION;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1088 return Method::invalid_vtable_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 return info.vtable_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1092
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 methodHandle LinkResolver::resolve_static_call_or_null(
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 KlassHandle resolved_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1095 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1096 Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 resolve_static_call(info, resolved_klass, name, signature, current_klass, true, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1107
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1108 methodHandle LinkResolver::resolve_special_call_or_null(KlassHandle resolved_klass, Symbol* name, Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 KlassHandle current_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 resolve_special_call(info, resolved_klass, name, signature, current_klass, true, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 return methodHandle();
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1119
a61af66fc99e Initial load
duke
parents:
diff changeset
1120
a61af66fc99e Initial load
duke
parents:
diff changeset
1121
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 // ConstantPool entries
a61af66fc99e Initial load
duke
parents:
diff changeset
1124
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 switch (byte) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 case Bytecodes::_invokespecial : resolve_invokespecial (result, pool, index, CHECK); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 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
1130 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
1131 case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1136
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1137 void LinkResolver::resolve_pool(KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // resolve klass
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 resolve_klass(resolved_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 // Get name, signature, and static klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1143 method_name = pool->name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1144 method_signature = pool->signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 current_klass = KlassHandle(THREAD, pool->pool_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
a61af66fc99e Initial load
duke
parents:
diff changeset
1148
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 void LinkResolver::resolve_invokestatic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1151 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1152 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 resolve_static_call(result, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1157
a61af66fc99e Initial load
duke
parents:
diff changeset
1158
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 void LinkResolver::resolve_invokespecial(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1161 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1162 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 resolve_special_call(result, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1167
a61af66fc99e Initial load
duke
parents:
diff changeset
1168
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 void LinkResolver::resolve_invokevirtual(CallInfo& result, Handle recv,
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 constantPoolHandle pool, int index,
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1172
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1174 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1175 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 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
1178 KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 resolve_virtual_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1181
a61af66fc99e Initial load
duke
parents:
diff changeset
1182
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 KlassHandle resolved_klass;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1185 Symbol* method_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
1186 Symbol* method_signature = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 KlassHandle current_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 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
1189 KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1192
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1193
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1194 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
1195 assert(EnableInvokeDynamic, "");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1196 // 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
1197 KlassHandle resolved_klass;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1198 Symbol* method_name = NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1199 Symbol* method_signature = NULL;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1200 KlassHandle current_klass;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1201 resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1202 if (TraceMethodHandles)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1203 tty->print_cr("resolve_invokehandle %s %s", 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
1204 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
1205 }
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1206
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1207 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
1208 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
1209 KlassHandle current_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1210 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1211 // 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
1212 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
1213 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
1214 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
1215 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
1216 Handle resolved_method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1217 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
1218 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
1219 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
1220 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
1221 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1222
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1223
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1224 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
1225 assert(EnableInvokeDynamic, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1226 pool->set_invokedynamic(); // mark header to flag active call sites
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1227
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
1228 //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
1229 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
1230 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
1231 KlassHandle current_klass = KlassHandle(THREAD, pool->pool_holder());
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1232
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1233 // 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
1234 Handle bootstrap_specifier;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1235 // Check if CallSite has been bound already:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1236 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
1237 if (cpce->is_f1_null()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1238 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
1239 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
1240 assert(bsm_info != NULL, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1241 // 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
1242 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
1243 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1244 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
1245 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
1246 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
1247 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
1248 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
1249 return;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1250 }
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1251
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1252 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1253 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
1254 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
1255 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
1256 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
1257 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1258
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1259 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
1260 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1261
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1262 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
1263 Handle bootstrap_specifier,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1264 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
1265 KlassHandle current_klass,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1266 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1267 // 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
1268 // 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
1269 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
1270 Handle resolved_method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1271 methodHandle resolved_method =
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1272 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
1273 bootstrap_specifier,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1274 method_name, method_signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1275 &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
1276 &resolved_method_type,
6729
d17383603741 7196120: NPG: JSR 2292 test fails because missing fix for 7188911
twisti
parents: 6725
diff changeset
1277 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
1278 if (HAS_PENDING_EXCEPTION) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1279 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1280 tty->print_cr("invokedynamic throws BSME for "INTPTR_FORMAT, PENDING_EXCEPTION);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1281 PENDING_EXCEPTION->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 3960
diff changeset
1282 }
3744
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1283 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
1284 // 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
1285 return;
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1286 }
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1287 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
1288 // 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
1289 return;
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1290 }
60b8287df30e 7049415: Failure of resolution of sym.reference to the c.s.s. should be wrapped in BootstrapMethodError
jrose
parents: 3324
diff changeset
1291 // 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
1292 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
1293 CLEAR_PENDING_EXCEPTION;
6729
d17383603741 7196120: NPG: JSR 2292 test fails because missing fix for 7188911
twisti
parents: 6725
diff changeset
1294 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
1295 }
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
1296 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
1297 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1298
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1301
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 void FieldAccessInfo::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 tty->print_cr("Field %s@%d", name()->as_C_string(), field_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1306
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 #endif