annotate src/share/vm/oops/methodOop.cpp @ 4181:319860ae697a

Simplify FrameMap: make offsets of spill slots and outgoing parameters independent so that they can be allocated at the same time, eliminating the separate phases. This makes the separate StackBlock unnecesary. Change CiStackSlot to use byte offsets instead of spill slot index. This makes CiTarget.spillSlotSize unnecessary.
author Christian Wimmer <Christian.Wimmer@Oracle.com>
date Mon, 02 Jan 2012 14:16:08 -0800
parents 04b9a2566eec
children 33df1aeaebbf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2021
diff changeset
2 * Copyright (c) 1997, 2011, 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: 1515
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1515
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: 1515
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: 1845
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
27 #include "code/debugInfoRec.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
28 #include "gc_interface/collectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
29 #include "interpreter/bytecodeStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
30 #include "interpreter/bytecodeTracer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
31 #include "interpreter/bytecodes.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
32 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
33 #include "interpreter/oopMapCache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
34 #include "memory/gcLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
35 #include "memory/generation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
36 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
37 #include "oops/klassOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
38 #include "oops/methodDataOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
39 #include "oops/methodOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
40 #include "oops/oop.inline.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
41 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
42 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
43 #include "prims/methodHandleWalk.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
44 #include "prims/nativeLookup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
45 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
46 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
47 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
48 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
49 #include "runtime/relocator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
50 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
51 #include "runtime/signature.hpp"
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
52 #include "utilities/quickSort.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
53 #include "utilities/xmlstream.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // Implementation of methodOopDesc
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 address methodOopDesc::get_i2c_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 assert(_adapter != NULL, "must have");
a61af66fc99e Initial load
duke
parents:
diff changeset
60 return _adapter->get_i2c_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
61 }
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 address methodOopDesc::get_c2i_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 assert(_adapter != NULL, "must have");
a61af66fc99e Initial load
duke
parents:
diff changeset
65 return _adapter->get_c2i_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
66 }
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 address methodOopDesc::get_c2i_unverified_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 assert(_adapter != NULL, "must have");
a61af66fc99e Initial load
duke
parents:
diff changeset
70 return _adapter->get_c2i_unverified_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 char* methodOopDesc::name_and_sig_as_C_string() {
a61af66fc99e Initial load
duke
parents:
diff changeset
74 return name_and_sig_as_C_string(Klass::cast(constants()->pool_holder()), name(), signature());
a61af66fc99e Initial load
duke
parents:
diff changeset
75 }
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 char* methodOopDesc::name_and_sig_as_C_string(char* buf, int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
78 return name_and_sig_as_C_string(Klass::cast(constants()->pool_holder()), name(), signature(), buf, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
79 }
a61af66fc99e Initial load
duke
parents:
diff changeset
80
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
81 char* methodOopDesc::name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
82 const char* klass_name = klass->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
83 int klass_name_len = (int)strlen(klass_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 int method_name_len = method_name->utf8_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
85 int len = klass_name_len + 1 + method_name_len + signature->utf8_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
86 char* dest = NEW_RESOURCE_ARRAY(char, len + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 strcpy(dest, klass_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 dest[klass_name_len] = '.';
a61af66fc99e Initial load
duke
parents:
diff changeset
89 strcpy(&dest[klass_name_len + 1], method_name->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
90 strcpy(&dest[klass_name_len + 1 + method_name_len], signature->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
91 dest[len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 return dest;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 }
a61af66fc99e Initial load
duke
parents:
diff changeset
94
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
95 char* methodOopDesc::name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature, char* buf, int size) {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
96 Symbol* klass_name = klass->name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97 klass_name->as_klass_external_name(buf, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
98 int len = (int)strlen(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 if (len < size - 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 buf[len++] = '.';
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 method_name->as_C_string(&(buf[len]), size - len);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 len = (int)strlen(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 signature->as_C_string(&(buf[len]), size - len);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 int methodOopDesc::fast_exception_handler_bci_for(KlassHandle ex_klass, int throw_bci, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index)
a61af66fc99e Initial load
duke
parents:
diff changeset
114 const int beg_bci_offset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 const int end_bci_offset = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 const int handler_bci_offset = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 const int klass_index_offset = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 const int entry_size = 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // access exception table
a61af66fc99e Initial load
duke
parents:
diff changeset
120 typeArrayHandle table (THREAD, constMethod()->exception_table());
a61af66fc99e Initial load
duke
parents:
diff changeset
121 int length = table->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
122 assert(length % entry_size == 0, "exception table format has changed");
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // iterate through all entries sequentially
a61af66fc99e Initial load
duke
parents:
diff changeset
124 constantPoolHandle pool(THREAD, constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
125 for (int i = 0; i < length; i += entry_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 int beg_bci = table->int_at(i + beg_bci_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 int end_bci = table->int_at(i + end_bci_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 assert(beg_bci <= end_bci, "inconsistent exception table");
a61af66fc99e Initial load
duke
parents:
diff changeset
129 if (beg_bci <= throw_bci && throw_bci < end_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // exception handler bci range covers throw_bci => investigate further
a61af66fc99e Initial load
duke
parents:
diff changeset
131 int handler_bci = table->int_at(i + handler_bci_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 int klass_index = table->int_at(i + klass_index_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 if (klass_index == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 return handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 } else if (ex_klass.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 return handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // we know the exception class => get the constraint class
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // this may require loading of the constraint class; if verification
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // fails or some other exception occurs, return handler_bci
a61af66fc99e Initial load
duke
parents:
diff changeset
141 klassOop k = pool->klass_at(klass_index, CHECK_(handler_bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
142 KlassHandle klass = KlassHandle(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 assert(klass.not_null(), "klass not loaded");
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (ex_klass->is_subtype_of(klass())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 return handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
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 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void methodOopDesc::mask_for(int bci, InterpreterOopMap* mask) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 Thread* myThread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
157 methodHandle h_this(myThread, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
158 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
159 bool has_capability = myThread->is_VM_thread() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
160 myThread->is_ConcurrentGC_thread() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
161 myThread->is_GC_task_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 if (!has_capability) {
a61af66fc99e Initial load
duke
parents:
diff changeset
164 if (!VerifyStack && !VerifyLastFrame) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // verify stack calls this outside VM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
166 warning("oopmap should only be accessed by the "
a61af66fc99e Initial load
duke
parents:
diff changeset
167 "VM, GC task or CMS threads (or during debugging)");
a61af66fc99e Initial load
duke
parents:
diff changeset
168 InterpreterOopMap local_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 instanceKlass::cast(method_holder())->mask_for(h_this, bci, &local_mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
170 local_mask.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
174 instanceKlass::cast(method_holder())->mask_for(h_this, bci, mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
175 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 int methodOopDesc::bci_from(address bcp) const {
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
180 assert(is_native() && bcp == code_base() || contains(bcp) || is_error_reported(), "bcp doesn't belong to this method");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
181 return bcp - code_base();
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Return (int)bcx if it appears to be a valid BCI.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // Return bci_from((address)bcx) if it appears to be a valid BCP.
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // Return -1 otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Used by profiling code, when invalid data is a possibility.
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // The caller is responsible for validating the methodOop itself.
a61af66fc99e Initial load
duke
parents:
diff changeset
190 int methodOopDesc::validate_bci_from_bcx(intptr_t bcx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // keep bci as -1 if not a valid bci
a61af66fc99e Initial load
duke
parents:
diff changeset
192 int bci = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
193 if (bcx == 0 || (address)bcx == code_base()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // code_size() may return 0 and we allow 0 here
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // the method may be native
a61af66fc99e Initial load
duke
parents:
diff changeset
196 bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
197 } else if (frame::is_bci(bcx)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 if (bcx < code_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 bci = (int)bcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201 } else if (contains((address)bcx)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 bci = (address)bcx - code_base();
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // Assert that if we have dodged any asserts, bci is negative.
a61af66fc99e Initial load
duke
parents:
diff changeset
205 assert(bci == -1 || bci == bci_from(bcp_from(bci)), "sane bci if >=0");
a61af66fc99e Initial load
duke
parents:
diff changeset
206 return bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 address methodOopDesc::bcp_from(int bci) const {
2935
9b8f30608e62 deoptimization action (invalidate, reprofile, ...)
Lukas Stadler <lukas.stadler@jku.at>
parents: 2478
diff changeset
210 #ifdef ASSERT
9b8f30608e62 deoptimization action (invalidate, reprofile, ...)
Lukas Stadler <lukas.stadler@jku.at>
parents: 2478
diff changeset
211 if (!((is_native() && bci == 0) || (!is_native() && 0 <= bci && bci < code_size()))) {
9b8f30608e62 deoptimization action (invalidate, reprofile, ...)
Lukas Stadler <lukas.stadler@jku.at>
parents: 2478
diff changeset
212 char buf[1024];
9b8f30608e62 deoptimization action (invalidate, reprofile, ...)
Lukas Stadler <lukas.stadler@jku.at>
parents: 2478
diff changeset
213 tty->print_cr("bci: %i, size: %i, method: %s", bci, code_size(), const_cast<methodOop>(this)->name_and_sig_as_C_string(buf, 1024));
9b8f30608e62 deoptimization action (invalidate, reprofile, ...)
Lukas Stadler <lukas.stadler@jku.at>
parents: 2478
diff changeset
214 }
9b8f30608e62 deoptimization action (invalidate, reprofile, ...)
Lukas Stadler <lukas.stadler@jku.at>
parents: 2478
diff changeset
215 #endif // ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
216 assert((is_native() && bci == 0) || (!is_native() && 0 <= bci && bci < code_size()), "illegal bci");
a61af66fc99e Initial load
duke
parents:
diff changeset
217 address bcp = code_base() + bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 assert(is_native() && bcp == code_base() || contains(bcp), "bcp doesn't belong to this method");
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return bcp;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 int methodOopDesc::object_size(bool is_native) {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // If native, then include pointers for native_function and signature_handler
a61af66fc99e Initial load
duke
parents:
diff changeset
225 int extra_bytes = (is_native) ? 2*sizeof(address*) : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
226 int extra_words = align_size_up(extra_bytes, BytesPerWord) / BytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 return align_object_size(header_size() + extra_words);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
231 Symbol* methodOopDesc::klass_name() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
232 klassOop k = method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
233 assert(k->is_klass(), "must be klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
234 instanceKlass* ik = (instanceKlass*) k->klass_part();
a61af66fc99e Initial load
duke
parents:
diff changeset
235 return ik->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 void methodOopDesc::set_interpreter_kind() {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 int kind = Interpreter::method_kind(methodOop(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
241 assert(kind != Interpreter::invalid,
a61af66fc99e Initial load
duke
parents:
diff changeset
242 "interpreter entry must be valid");
a61af66fc99e Initial load
duke
parents:
diff changeset
243 set_interpreter_kind(kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // Attempt to return method oop to original state. Clear any pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // (to objects outside the shared spaces). We won't be able to predict
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // where they should point in a new JVM. Further initialize some
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // entries now in order allow them to be write protected later.
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 void methodOopDesc::remove_unshareable_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 unlink_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
254 set_interpreter_kind();
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
258 bool methodOopDesc::was_executed_more_than(int n) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // Invocation counter is reset when the methodOop is compiled.
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // If the method has compiled code we therefore assume it has
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // be excuted more than n times.
a61af66fc99e Initial load
duke
parents:
diff changeset
262 if (is_accessor() || is_empty_method() || (code() != NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // interpreter doesn't bump invocation counter of trivial methods
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // compiler does not bump invocation counter of compiled methods
a61af66fc99e Initial load
duke
parents:
diff changeset
265 return true;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
266 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
267 else if (_invocation_counter.carry() || (method_data() != NULL && method_data()->invocation_counter()->carry())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // The carry bit is set when the counter overflows and causes
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // a compilation to occur. We don't know how many times
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // the counter has been reset, so we simply assume it has
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // been executed more than n times.
a61af66fc99e Initial load
duke
parents:
diff changeset
272 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 return invocation_count() > n;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 #ifndef PRODUCT
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
279 void methodOopDesc::print_invocation_count() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
280 if (is_static()) tty->print("static ");
a61af66fc99e Initial load
duke
parents:
diff changeset
281 if (is_final()) tty->print("final ");
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (is_synchronized()) tty->print("synchronized ");
a61af66fc99e Initial load
duke
parents:
diff changeset
283 if (is_native()) tty->print("native ");
a61af66fc99e Initial load
duke
parents:
diff changeset
284 method_holder()->klass_part()->name()->print_symbol_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
285 tty->print(".");
a61af66fc99e Initial load
duke
parents:
diff changeset
286 name()->print_symbol_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
287 signature()->print_symbol_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 if (WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // dump the size of the byte codes
a61af66fc99e Initial load
duke
parents:
diff changeset
291 tty->print(" {%d}", code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 tty->print_cr (" interpreter_invocation_count: %8d ", interpreter_invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
296 tty->print_cr (" invocation_counter: %8d ", invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
297 tty->print_cr (" backedge_counter: %8d ", backedge_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
298 if (CountCompiledCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 tty->print_cr (" compiled_invocation_count: %8d ", compiled_invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // Build a methodDataOop object to hold information about this method
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // collected in the interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
307 void methodOopDesc::build_interpreter_method_data(methodHandle method, TRAPS) {
2021
7cf1a74771e8 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 1972
diff changeset
308 // Do not profile method if current thread holds the pending list lock,
7cf1a74771e8 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 1972
diff changeset
309 // which avoids deadlock for acquiring the MethodData_lock.
7cf1a74771e8 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 1972
diff changeset
310 if (instanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) {
7cf1a74771e8 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 1972
diff changeset
311 return;
7cf1a74771e8 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 1972
diff changeset
312 }
7cf1a74771e8 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 1972
diff changeset
313
0
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // Grab a lock here to prevent multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // methodDataOops from being created.
a61af66fc99e Initial load
duke
parents:
diff changeset
316 MutexLocker ml(MethodData_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 if (method->method_data() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 methodDataOop method_data = oopFactory::new_methodData(method, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
319 method->set_method_data(method_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
320 if (PrintMethodData && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
322 tty->print("build_interpreter_method_data for ");
a61af66fc99e Initial load
duke
parents:
diff changeset
323 method->print_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
324 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // At the end of the run, the MDO, full of data, will be dumped.
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 void methodOopDesc::cleanup_inline_caches() {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // The current system doesn't use inline caches in the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // => nothing to do (keep this method around for future use)
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
336 int methodOopDesc::extra_stack_words() {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
337 // not an inline function, to avoid a header dependency on Interpreter
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1208
diff changeset
338 return extra_stack_entries() * Interpreter::stackElementSize;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
339 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
340
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
341
0
a61af66fc99e Initial load
duke
parents:
diff changeset
342 void methodOopDesc::compute_size_of_parameters(Thread *thread) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
343 ArgumentSizeComputer asc(signature());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
344 set_size_of_parameters(asc.size() + (is_static() ? 0 : 1));
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
348 void methodOopDesc::set_result_index(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
349 _result_index = Interpreter::BasicType_as_index(type);
a61af66fc99e Initial load
duke
parents:
diff changeset
350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
351 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 BasicType methodOopDesc::result_type() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
354 ResultTypeFinder rtf(signature());
a61af66fc99e Initial load
duke
parents:
diff changeset
355 return rtf.type();
a61af66fc99e Initial load
duke
parents:
diff changeset
356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 bool methodOopDesc::is_empty_method() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
360 return code_size() == 1
a61af66fc99e Initial load
duke
parents:
diff changeset
361 && *code_base() == Bytecodes::_return;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 bool methodOopDesc::is_vanilla_constructor() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // Returns true if this method is a vanilla constructor, i.e. an "<init>" "()V" method
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // which only calls the superclass vanilla constructor and possibly does stores of
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // zero constants to local fields:
a61af66fc99e Initial load
duke
parents:
diff changeset
369 //
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // aload_0
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // invokespecial
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // indexbyte1
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // indexbyte2
a61af66fc99e Initial load
duke
parents:
diff changeset
374 //
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // followed by an (optional) sequence of:
a61af66fc99e Initial load
duke
parents:
diff changeset
376 //
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // aload_0
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // aconst_null / iconst_0 / fconst_0 / dconst_0
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // putfield
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // indexbyte1
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // indexbyte2
a61af66fc99e Initial load
duke
parents:
diff changeset
382 //
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // followed by:
a61af66fc99e Initial load
duke
parents:
diff changeset
384 //
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // return
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 assert(name() == vmSymbols::object_initializer_name(), "Should only be called for default constructors");
a61af66fc99e Initial load
duke
parents:
diff changeset
388 assert(signature() == vmSymbols::void_method_signature(), "Should only be called for default constructors");
a61af66fc99e Initial load
duke
parents:
diff changeset
389 int size = code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // Check if size match
a61af66fc99e Initial load
duke
parents:
diff changeset
391 if (size == 0 || size % 5 != 0) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
392 address cb = code_base();
a61af66fc99e Initial load
duke
parents:
diff changeset
393 int last = size - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
394 if (cb[0] != Bytecodes::_aload_0 || cb[1] != Bytecodes::_invokespecial || cb[last] != Bytecodes::_return) {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // Does not call superclass default constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
396 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // Check optional sequence
a61af66fc99e Initial load
duke
parents:
diff changeset
399 for (int i = 4; i < last; i += 5) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 if (cb[i] != Bytecodes::_aload_0) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
401 if (!Bytecodes::is_zero_const(Bytecodes::cast(cb[i+1]))) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
402 if (cb[i+2] != Bytecodes::_putfield) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 bool methodOopDesc::compute_has_loops_flag() {
a61af66fc99e Initial load
duke
parents:
diff changeset
409 BytecodeStream bcs(methodOop(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
410 Bytecodes::Code bc;
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 while ((bc = bcs.next()) >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
413 switch( bc ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
414 case Bytecodes::_ifeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
415 case Bytecodes::_ifnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
416 case Bytecodes::_iflt:
a61af66fc99e Initial load
duke
parents:
diff changeset
417 case Bytecodes::_ifle:
a61af66fc99e Initial load
duke
parents:
diff changeset
418 case Bytecodes::_ifne:
a61af66fc99e Initial load
duke
parents:
diff changeset
419 case Bytecodes::_ifnonnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
420 case Bytecodes::_ifgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
421 case Bytecodes::_ifge:
a61af66fc99e Initial load
duke
parents:
diff changeset
422 case Bytecodes::_if_icmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
423 case Bytecodes::_if_icmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
424 case Bytecodes::_if_icmplt:
a61af66fc99e Initial load
duke
parents:
diff changeset
425 case Bytecodes::_if_icmpgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
426 case Bytecodes::_if_icmple:
a61af66fc99e Initial load
duke
parents:
diff changeset
427 case Bytecodes::_if_icmpge:
a61af66fc99e Initial load
duke
parents:
diff changeset
428 case Bytecodes::_if_acmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
429 case Bytecodes::_if_acmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
430 case Bytecodes::_goto:
a61af66fc99e Initial load
duke
parents:
diff changeset
431 case Bytecodes::_jsr:
a61af66fc99e Initial load
duke
parents:
diff changeset
432 if( bcs.dest() < bcs.next_bci() ) _access_flags.set_has_loops();
a61af66fc99e Initial load
duke
parents:
diff changeset
433 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 case Bytecodes::_goto_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
436 case Bytecodes::_jsr_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
437 if( bcs.dest_w() < bcs.next_bci() ) _access_flags.set_has_loops();
a61af66fc99e Initial load
duke
parents:
diff changeset
438 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441 _access_flags.set_loops_flag_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
442 return _access_flags.has_loops();
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 bool methodOopDesc::is_final_method() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // %%% Should return true for private methods also,
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // since there is no way to override them.
a61af66fc99e Initial load
duke
parents:
diff changeset
449 return is_final() || Klass::cast(method_holder())->is_final();
a61af66fc99e Initial load
duke
parents:
diff changeset
450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 bool methodOopDesc::is_strict_method() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
454 return is_strict();
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 bool methodOopDesc::can_be_statically_bound() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 if (is_final_method()) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
460 return vtable_index() == nonvirtual_vtable_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 bool methodOopDesc::is_accessor() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
465 if (code_size() != 5) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
466 if (size_of_parameters() != 1) return false;
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2021
diff changeset
467 if (java_code_at(0) != Bytecodes::_aload_0 ) return false;
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2021
diff changeset
468 if (java_code_at(1) != Bytecodes::_getfield) return false;
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2021
diff changeset
469 if (java_code_at(4) != Bytecodes::_areturn &&
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2021
diff changeset
470 java_code_at(4) != Bytecodes::_ireturn ) return false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
471 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 bool methodOopDesc::is_initializer() const {
2334
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
476 return name() == vmSymbols::object_initializer_name() || is_static_initializer();
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
477 }
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
478
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
479 bool methodOopDesc::has_valid_initializer_flags() const {
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
480 return (is_static() ||
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
481 instanceKlass::cast(method_holder())->major_version() < 51);
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
482 }
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
483
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
484 bool methodOopDesc::is_static_initializer() const {
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
485 // For classfiles version 51 or greater, ensure that the clinit method is
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
486 // static. Non-static methods with the name "<clinit>" are not static
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
487 // initializers. (older classfiles exempted for backward compatibility)
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
488 return name() == vmSymbols::class_initializer_name() &&
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
489 has_valid_initializer_flags();
0
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 objArrayHandle methodOopDesc::resolved_checked_exceptions_impl(methodOop this_oop, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 int length = this_oop->checked_exceptions_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
495 if (length == 0) { // common case
a61af66fc99e Initial load
duke
parents:
diff changeset
496 return objArrayHandle(THREAD, Universe::the_empty_class_klass_array());
a61af66fc99e Initial load
duke
parents:
diff changeset
497 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
498 methodHandle h_this(THREAD, this_oop);
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1039
diff changeset
499 objArrayOop m_oop = oopFactory::new_objArray(SystemDictionary::Class_klass(), length, CHECK_(objArrayHandle()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
500 objArrayHandle mirrors (THREAD, m_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
501 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
502 CheckedExceptionElement* table = h_this->checked_exceptions_start(); // recompute on each iteration, not gc safe
a61af66fc99e Initial load
duke
parents:
diff changeset
503 klassOop k = h_this->constants()->klass_at(table[i].class_cp_index, CHECK_(objArrayHandle()));
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1039
diff changeset
504 assert(Klass::cast(k)->is_subclass_of(SystemDictionary::Throwable_klass()), "invalid exception class");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
505 mirrors->obj_at_put(i, Klass::cast(k)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507 return mirrors;
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509 };
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 int methodOopDesc::line_number_from_bci(int bci) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
513 if (bci == SynchronizationEntryBCI) bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 assert(bci == 0 || 0 <= bci && bci < code_size(), "illegal bci");
a61af66fc99e Initial load
duke
parents:
diff changeset
515 int best_bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
516 int best_line = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 if (has_linenumber_table()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
519 // The line numbers are a short array of 2-tuples [start_pc, line_number].
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // Not necessarily sorted and not necessarily one-to-one.
a61af66fc99e Initial load
duke
parents:
diff changeset
521 CompressedLineNumberReadStream stream(compressed_linenumber_table());
a61af66fc99e Initial load
duke
parents:
diff changeset
522 while (stream.read_pair()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
523 if (stream.bci() == bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // perfect match
a61af66fc99e Initial load
duke
parents:
diff changeset
525 return stream.line();
a61af66fc99e Initial load
duke
parents:
diff changeset
526 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // update best_bci/line
a61af66fc99e Initial load
duke
parents:
diff changeset
528 if (stream.bci() < bci && stream.bci() >= best_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 best_bci = stream.bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
530 best_line = stream.line();
a61af66fc99e Initial load
duke
parents:
diff changeset
531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
532 }
a61af66fc99e Initial load
duke
parents:
diff changeset
533 }
a61af66fc99e Initial load
duke
parents:
diff changeset
534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
535 return best_line;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 bool methodOopDesc::is_klass_loaded_by_klass_index(int klass_index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
540 if( _constants->tag_at(klass_index).is_unresolved_klass() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
541 Thread *thread = Thread::current();
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
542 Symbol* klass_name = _constants->klass_name_at(klass_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
543 Handle loader(thread, instanceKlass::cast(method_holder())->class_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
544 Handle prot (thread, Klass::cast(method_holder())->protection_domain());
a61af66fc99e Initial load
duke
parents:
diff changeset
545 return SystemDictionary::find(klass_name, loader, prot, thread) != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
546 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
547 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552 bool methodOopDesc::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
553 int klass_index = _constants->klass_ref_index_at(refinfo_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
554 if (must_be_resolved) {
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // Make sure klass is resolved in constantpool.
a61af66fc99e Initial load
duke
parents:
diff changeset
556 if (constants()->tag_at(klass_index).is_unresolved_klass()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
558 return is_klass_loaded_by_klass_index(klass_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 void methodOopDesc::set_native_function(address function, bool post_event_flag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
563 assert(function != NULL, "use clear_native_function to unregister natives");
a61af66fc99e Initial load
duke
parents:
diff changeset
564 address* native_function = native_function_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // We can see racers trying to place the same native function into place. Once
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // is plenty.
a61af66fc99e Initial load
duke
parents:
diff changeset
568 address current = *native_function;
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (current == function) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
570 if (post_event_flag && JvmtiExport::should_post_native_method_bind() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
571 function != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // native_method_throw_unsatisfied_link_error_entry() should only
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // be passed when post_event_flag is false.
a61af66fc99e Initial load
duke
parents:
diff changeset
574 assert(function !=
a61af66fc99e Initial load
duke
parents:
diff changeset
575 SharedRuntime::native_method_throw_unsatisfied_link_error_entry(),
a61af66fc99e Initial load
duke
parents:
diff changeset
576 "post_event_flag mis-match");
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // post the bind event, and possible change the bind function
a61af66fc99e Initial load
duke
parents:
diff changeset
579 JvmtiExport::post_native_method_bind(this, &function);
a61af66fc99e Initial load
duke
parents:
diff changeset
580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
581 *native_function = function;
a61af66fc99e Initial load
duke
parents:
diff changeset
582 // This function can be called more than once. We must make sure that we always
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // use the latest registered method -> check if a stub already has been generated.
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // If so, we have to make it not_entrant.
a61af66fc99e Initial load
duke
parents:
diff changeset
585 nmethod* nm = code(); // Put it into local variable to guard against concurrent updates
a61af66fc99e Initial load
duke
parents:
diff changeset
586 if (nm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
587 nm->make_not_entrant();
a61af66fc99e Initial load
duke
parents:
diff changeset
588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 bool methodOopDesc::has_native_function() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
593 address func = native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
594 return (func != NULL && func != SharedRuntime::native_method_throw_unsatisfied_link_error_entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 void methodOopDesc::clear_native_function() {
a61af66fc99e Initial load
duke
parents:
diff changeset
599 set_native_function(
a61af66fc99e Initial load
duke
parents:
diff changeset
600 SharedRuntime::native_method_throw_unsatisfied_link_error_entry(),
a61af66fc99e Initial load
duke
parents:
diff changeset
601 !native_bind_event_is_interesting);
a61af66fc99e Initial load
duke
parents:
diff changeset
602 clear_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605
a61af66fc99e Initial load
duke
parents:
diff changeset
606 void methodOopDesc::set_signature_handler(address handler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
607 address* signature_handler = signature_handler_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
608 *signature_handler = handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 bool methodOopDesc::is_not_compilable(int comp_level) const {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
613 if (is_method_handle_invoke()) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
614 // compilers must recognize this method specially, or not at all
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
615 return true;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
616 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
617 if (number_of_breakpoints() > 0) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
618 return true;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
619 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
620 if (comp_level == CompLevel_any) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
621 return is_not_c1_compilable() || is_not_c2_compilable();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
623 if (is_c1_compile(comp_level)) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
624 return is_not_c1_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
625 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
626 if (is_c2_compile(comp_level)) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
627 return is_not_c2_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
628 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
629 return false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
631
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // call this when compiler finds that this method is not compilable
1208
cef333a48af6 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 1206
diff changeset
633 void methodOopDesc::set_not_compilable(int comp_level, bool report) {
cef333a48af6 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 1206
diff changeset
634 if (PrintCompilation && report) {
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
635 ttyLocker ttyl;
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
636 tty->print("made not compilable ");
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
637 this->print_short_name(tty);
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
638 int size = this->code_size();
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
639 if (size > 0)
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
640 tty->print(" (%d bytes)", size);
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
641 tty->cr();
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
642 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
643 if ((TraceDeoptimization || LogCompilation) && (xtty != NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
645 xtty->begin_elem("make_not_compilable thread='%d'", (int) os::current_thread_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
646 xtty->method(methodOop(this));
a61af66fc99e Initial load
duke
parents:
diff changeset
647 xtty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
648 xtty->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
649 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
650 if (comp_level == CompLevel_all) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
651 set_not_c1_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
652 set_not_c2_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
653 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
654 if (is_c1_compile(comp_level)) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
655 set_not_c1_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
656 } else
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
657 if (is_c2_compile(comp_level)) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
658 set_not_c2_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
659 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
660 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
661 CompilationPolicy::policy()->disable_compilation(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
662 }
a61af66fc99e Initial load
duke
parents:
diff changeset
663
a61af66fc99e Initial load
duke
parents:
diff changeset
664 // Revert to using the interpreter and clear out the nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
665 void methodOopDesc::clear_code() {
a61af66fc99e Initial load
duke
parents:
diff changeset
666
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // this may be NULL if c2i adapters have not been made yet
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // Only should happen at allocate time.
a61af66fc99e Initial load
duke
parents:
diff changeset
669 if (_adapter == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
670 _from_compiled_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
671 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
672 _from_compiled_entry = _adapter->get_c2i_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
674 OrderAccess::storestore();
a61af66fc99e Initial load
duke
parents:
diff changeset
675 _from_interpreted_entry = _i2i_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
676 OrderAccess::storestore();
a61af66fc99e Initial load
duke
parents:
diff changeset
677 _code = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
678 }
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // Called by class data sharing to remove any entry points (which are not shared)
a61af66fc99e Initial load
duke
parents:
diff changeset
681 void methodOopDesc::unlink_method() {
a61af66fc99e Initial load
duke
parents:
diff changeset
682 _code = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
683 _i2i_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
684 _from_interpreted_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
685 if (is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
686 *native_function_addr() = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
687 set_signature_handler(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
689 NOT_PRODUCT(set_compiled_invocation_count(0);)
a61af66fc99e Initial load
duke
parents:
diff changeset
690 invocation_counter()->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
691 backedge_counter()->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
692 _adapter = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
693 _from_compiled_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
694 assert(_method_data == NULL, "unexpected method data?");
a61af66fc99e Initial load
duke
parents:
diff changeset
695 set_method_data(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
696 set_interpreter_throwout_count(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
697 set_interpreter_invocation_count(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
699
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // Called when the method_holder is getting linked. Setup entrypoints so the method
a61af66fc99e Initial load
duke
parents:
diff changeset
701 // is ready to be called from interpreter, compiler, and vtables.
a61af66fc99e Initial load
duke
parents:
diff changeset
702 void methodOopDesc::link_method(methodHandle h_method, TRAPS) {
3404
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 2478
diff changeset
703 // If the code cache is full, we may reenter this function for the
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 2478
diff changeset
704 // leftover methods that weren't linked.
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 2478
diff changeset
705 if (_i2i_entry != NULL) return;
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 2478
diff changeset
706
0
a61af66fc99e Initial load
duke
parents:
diff changeset
707 assert(_adapter == NULL, "init'd to NULL" );
a61af66fc99e Initial load
duke
parents:
diff changeset
708 assert( _code == NULL, "nothing compiled yet" );
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // Setup interpreter entrypoint
a61af66fc99e Initial load
duke
parents:
diff changeset
711 assert(this == h_method(), "wrong h_method()" );
a61af66fc99e Initial load
duke
parents:
diff changeset
712 address entry = Interpreter::entry_for_method(h_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
713 assert(entry != NULL, "interpreter entry must be non-null");
a61af66fc99e Initial load
duke
parents:
diff changeset
714 // Sets both _i2i_entry and _from_interpreted_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
715 set_interpreter_entry(entry);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
716 if (is_native() && !is_method_handle_invoke()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
717 set_native_function(
a61af66fc99e Initial load
duke
parents:
diff changeset
718 SharedRuntime::native_method_throw_unsatisfied_link_error_entry(),
a61af66fc99e Initial load
duke
parents:
diff changeset
719 !native_bind_event_is_interesting);
a61af66fc99e Initial load
duke
parents:
diff changeset
720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 // Setup compiler entrypoint. This is made eagerly, so we do not need
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // special handling of vtables. An alternative is to make adapters more
a61af66fc99e Initial load
duke
parents:
diff changeset
724 // lazily by calling make_adapter() from from_compiled_entry() for the
a61af66fc99e Initial load
duke
parents:
diff changeset
725 // normal calls. For vtable calls life gets more complicated. When a
a61af66fc99e Initial load
duke
parents:
diff changeset
726 // call-site goes mega-morphic we need adapters in all methods which can be
a61af66fc99e Initial load
duke
parents:
diff changeset
727 // called from the vtable. We need adapters on such methods that get loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
728 // later. Ditto for mega-morphic itable calls. If this proves to be a
a61af66fc99e Initial load
duke
parents:
diff changeset
729 // problem we'll make these lazily later.
3419
deaa3ce90583 7049928: VM crashes with "assert(_adapter != NULL) failed: must have" at methodOop.cpp:63
coleenp
parents: 3404
diff changeset
730 (void) make_adapters(h_method, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
731
a61af66fc99e Initial load
duke
parents:
diff changeset
732 // ONLY USE the h_method now as make_adapter may have blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 }
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736 address methodOopDesc::make_adapters(methodHandle mh, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
737 // Adapters for compiled code are made eagerly here. They are fairly
a61af66fc99e Initial load
duke
parents:
diff changeset
738 // small (generally < 100 bytes) and quick to make (and cached and shared)
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // so making them eagerly shouldn't be too expensive.
a61af66fc99e Initial load
duke
parents:
diff changeset
740 AdapterHandlerEntry* adapter = AdapterHandlerLibrary::get_adapter(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
741 if (adapter == NULL ) {
1187
cf0685d550f1 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 1152
diff changeset
742 THROW_MSG_NULL(vmSymbols::java_lang_VirtualMachineError(), "out of space in CodeCache for adapters");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
743 }
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 mh->set_adapter_entry(adapter);
a61af66fc99e Initial load
duke
parents:
diff changeset
746 mh->_from_compiled_entry = adapter->get_c2i_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
747 return adapter->get_c2i_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
748 }
a61af66fc99e Initial load
duke
parents:
diff changeset
749
a61af66fc99e Initial load
duke
parents:
diff changeset
750 // The verified_code_entry() must be called when a invoke is resolved
a61af66fc99e Initial load
duke
parents:
diff changeset
751 // on this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753 // It returns the compiled code entry point, after asserting not null.
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // This function is called after potential safepoints so that nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
755 // or adapter that it points to is still live and valid.
a61af66fc99e Initial load
duke
parents:
diff changeset
756 // This function must not hit a safepoint!
a61af66fc99e Initial load
duke
parents:
diff changeset
757 address methodOopDesc::verified_code_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
758 debug_only(No_Safepoint_Verifier nsv;)
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
759 nmethod *code = (nmethod *)OrderAccess::load_ptr_acquire(&_code);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
760 if (code == NULL && UseCodeCacheFlushing) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
761 nmethod *saved_code = CodeCache::find_and_remove_saved_code(this);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
762 if (saved_code != NULL) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
763 methodHandle method(this);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
764 assert( ! saved_code->is_osr_method(), "should not get here for osr" );
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
765 set_code( method, saved_code );
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
766 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
767 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
768
0
a61af66fc99e Initial load
duke
parents:
diff changeset
769 assert(_from_compiled_entry != NULL, "must be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
770 return _from_compiled_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // Check that if an nmethod ref exists, it has a backlink to this or no backlink at all
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // (could be racing a deopt).
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // Not inline to avoid circular ref.
a61af66fc99e Initial load
duke
parents:
diff changeset
776 bool methodOopDesc::check_code() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // cached in a register or local. There's a race on the value of the field.
a61af66fc99e Initial load
duke
parents:
diff changeset
778 nmethod *code = (nmethod *)OrderAccess::load_ptr_acquire(&_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
779 return code == NULL || (code->method() == NULL) || (code->method() == (methodOop)this && !code->is_osr_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
781
a61af66fc99e Initial load
duke
parents:
diff changeset
782 // Install compiled code. Instantly it can execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
783 void methodOopDesc::set_code(methodHandle mh, nmethod *code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
784 assert( code, "use clear_code to remove code" );
a61af66fc99e Initial load
duke
parents:
diff changeset
785 assert( mh->check_code(), "" );
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787 guarantee(mh->adapter() != NULL, "Adapter blob must already exist!");
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 // These writes must happen in this order, because the interpreter will
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // directly jump to from_interpreted_entry which jumps to an i2c adapter
a61af66fc99e Initial load
duke
parents:
diff changeset
791 // which jumps to _from_compiled_entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
792 mh->_code = code; // Assign before allowing compiled code to exec
a61af66fc99e Initial load
duke
parents:
diff changeset
793
a61af66fc99e Initial load
duke
parents:
diff changeset
794 int comp_level = code->comp_level();
a61af66fc99e Initial load
duke
parents:
diff changeset
795 // In theory there could be a race here. In practice it is unlikely
a61af66fc99e Initial load
duke
parents:
diff changeset
796 // and not worth worrying about.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
797 if (comp_level > mh->highest_comp_level()) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
798 mh->set_highest_comp_level(comp_level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 OrderAccess::storestore();
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
802 #ifdef SHARK
1845
a222fcfba398 6990549: Zero and Shark fixes after 6978355 and 6953144
twisti
parents: 1793
diff changeset
803 mh->_from_interpreted_entry = code->insts_begin();
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
804 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
805 mh->_from_compiled_entry = code->verified_entry_point();
a61af66fc99e Initial load
duke
parents:
diff changeset
806 OrderAccess::storestore();
a61af66fc99e Initial load
duke
parents:
diff changeset
807 // Instantly compiled code can execute.
a61af66fc99e Initial load
duke
parents:
diff changeset
808 mh->_from_interpreted_entry = mh->get_i2c_entry();
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
809 #endif // SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812
a61af66fc99e Initial load
duke
parents:
diff changeset
813
a61af66fc99e Initial load
duke
parents:
diff changeset
814 bool methodOopDesc::is_overridden_in(klassOop k) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
815 instanceKlass* ik = instanceKlass::cast(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
816
a61af66fc99e Initial load
duke
parents:
diff changeset
817 if (ik->is_interface()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
818
a61af66fc99e Initial load
duke
parents:
diff changeset
819 // If method is an interface, we skip it - except if it
a61af66fc99e Initial load
duke
parents:
diff changeset
820 // is a miranda method
a61af66fc99e Initial load
duke
parents:
diff changeset
821 if (instanceKlass::cast(method_holder())->is_interface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // Check that method is not a miranda method
a61af66fc99e Initial load
duke
parents:
diff changeset
823 if (ik->lookup_method(name(), signature()) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
824 // No implementation exist - so miranda method
a61af66fc99e Initial load
duke
parents:
diff changeset
825 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
827 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
829
a61af66fc99e Initial load
duke
parents:
diff changeset
830 assert(ik->is_subclass_of(method_holder()), "should be subklass");
a61af66fc99e Initial load
duke
parents:
diff changeset
831 assert(ik->vtable() != NULL, "vtable should exist");
a61af66fc99e Initial load
duke
parents:
diff changeset
832 if (vtable_index() == nonvirtual_vtable_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
833 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
834 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
835 methodOop vt_m = ik->method_at_vtable(vtable_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
836 return vt_m != methodOop(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
839
a61af66fc99e Initial load
duke
parents:
diff changeset
840
48
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
841 // give advice about whether this methodOop should be cached or not
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
842 bool methodOopDesc::should_not_be_cached() const {
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
843 if (is_old()) {
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
844 // This method has been redefined. It is either EMCP or obsolete
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
845 // and we don't want to cache it because that would pin the method
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
846 // down and prevent it from being collectible if and when it
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
847 // finishes executing.
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
848 return true;
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
849 }
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
850
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
851 if (mark()->should_not_be_cached()) {
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
852 // It is either not safe or not a good idea to cache this
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
853 // method at this time because of the state of the embedded
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
854 // markOop. See markOop.cpp for the gory details.
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
855 return true;
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
856 }
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
857
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
858 // caching this method should be just fine
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
859 return false;
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
860 }
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
861
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
862 bool methodOopDesc::is_method_handle_invoke_name(vmSymbols::SID name_sid) {
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
863 switch (name_sid) {
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
864 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeExact_name):
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2357
diff changeset
865 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name):
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
866 return true;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
867 }
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2357
diff changeset
868 if (AllowInvokeGeneric
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2357
diff changeset
869 && name_sid == vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name))
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
870 return true;
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
871 return false;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
872 }
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
873
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
874 // Constant pool structure for invoke methods:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
875 enum {
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
876 _imcp_invoke_name = 1, // utf8: 'invokeExact' or 'invokeGeneric'
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
877 _imcp_invoke_signature, // utf8: (variable Symbol*)
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
878 _imcp_method_type_value, // string: (variable java/lang/invoke/MethodType, sic)
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
879 _imcp_limit
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
880 };
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
881
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
882 oop methodOopDesc::method_handle_type() const {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
883 if (!is_method_handle_invoke()) { assert(false, "caller resp."); return NULL; }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
884 oop mt = constants()->resolved_string_at(_imcp_method_type_value);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
885 assert(mt->klass() == SystemDictionary::MethodType_klass(), "");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
886 return mt;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
887 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
888
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
889 jint* methodOopDesc::method_type_offsets_chain() {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
890 static jint pchase[] = { -1, -1, -1 };
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
891 if (pchase[0] == -1) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
892 jint step0 = in_bytes(constants_offset());
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
893 jint step1 = (constantPoolOopDesc::header_size() + _imcp_method_type_value) * HeapWordSize;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
894 // do this in reverse to avoid races:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
895 OrderAccess::release_store(&pchase[1], step1);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
896 OrderAccess::release_store(&pchase[0], step0);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
897 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
898 return pchase;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
899 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
900
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1142
diff changeset
901 //------------------------------------------------------------------------------
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1142
diff changeset
902 // methodOopDesc::is_method_handle_adapter
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1142
diff changeset
903 //
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1142
diff changeset
904 // Tests if this method is an internal adapter frame from the
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1142
diff changeset
905 // MethodHandleCompiler.
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
906 // Must be consistent with MethodHandleCompiler::get_method_oop().
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1142
diff changeset
907 bool methodOopDesc::is_method_handle_adapter() const {
1662
e0ba4e04c839 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 1552
diff changeset
908 if (is_synthetic() &&
e0ba4e04c839 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 1552
diff changeset
909 !is_native() && // has code from MethodHandleCompiler
e0ba4e04c839 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 1552
diff changeset
910 is_method_handle_invoke_name(name()) &&
e0ba4e04c839 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 1552
diff changeset
911 MethodHandleCompiler::klass_is_method_handle_adapter_holder(method_holder())) {
e0ba4e04c839 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 1552
diff changeset
912 assert(!is_method_handle_invoke(), "disjoint");
e0ba4e04c839 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 1552
diff changeset
913 return true;
e0ba4e04c839 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 1552
diff changeset
914 } else {
e0ba4e04c839 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 1552
diff changeset
915 return false;
e0ba4e04c839 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 1552
diff changeset
916 }
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1142
diff changeset
917 }
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1142
diff changeset
918
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
919 methodHandle methodOopDesc::make_invoke_method(KlassHandle holder,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
920 Symbol* name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
921 Symbol* signature,
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
922 Handle method_type, TRAPS) {
3891
ac8738449b6f 7082949: JSR 292: missing ResourceMark in methodOopDesc::make_invoke_method
never
parents: 3795
diff changeset
923 ResourceMark rm;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
924 methodHandle empty;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
925
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
926 assert(holder() == SystemDictionary::MethodHandle_klass(),
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
927 "must be a JSR 292 magic type");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
928
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
929 if (TraceMethodHandles) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
930 tty->print("Creating invoke method for ");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
931 signature->print_value();
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
932 tty->cr();
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
933 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
934
2478
328926869b15 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 2460
diff changeset
935 // invariant: cp->symbol_at_put is preceded by a refcount increment (more usually a lookup)
328926869b15 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 2460
diff changeset
936 name->increment_refcount();
328926869b15 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 2460
diff changeset
937 signature->increment_refcount();
328926869b15 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 2460
diff changeset
938
3461
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
939 // record non-BCP method types in the constant pool
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
940 GrowableArray<KlassHandle>* extra_klasses = NULL;
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
941 for (int i = -1, len = java_lang_invoke_MethodType::ptype_count(method_type()); i < len; i++) {
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
942 oop ptype = (i == -1
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
943 ? java_lang_invoke_MethodType::rtype(method_type())
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
944 : java_lang_invoke_MethodType::ptype(method_type(), i));
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
945 klassOop klass = check_non_bcp_klass(java_lang_Class::as_klassOop(ptype));
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
946 if (klass != NULL) {
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
947 if (extra_klasses == NULL)
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
948 extra_klasses = new GrowableArray<KlassHandle>(len+1);
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
949 bool dup = false;
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
950 for (int j = 0; j < extra_klasses->length(); j++) {
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
951 if (extra_klasses->at(j) == klass) { dup = true; break; }
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
952 }
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
953 if (!dup)
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
954 extra_klasses->append(KlassHandle(THREAD, klass));
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
955 }
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
956 }
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
957
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
958 int extra_klass_count = (extra_klasses == NULL ? 0 : extra_klasses->length());
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
959 int cp_length = _imcp_limit + extra_klass_count;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
960 constantPoolHandle cp;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
961 {
3461
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
962 constantPoolOop cp_oop = oopFactory::new_constantPool(cp_length, IsSafeConc, CHECK_(empty));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
963 cp = constantPoolHandle(THREAD, cp_oop);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
964 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
965 cp->symbol_at_put(_imcp_invoke_name, name);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
966 cp->symbol_at_put(_imcp_invoke_signature, signature);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
967 cp->string_at_put(_imcp_method_type_value, Universe::the_null_string());
3461
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
968 for (int j = 0; j < extra_klass_count; j++) {
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
969 KlassHandle klass = extra_klasses->at(j);
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
970 cp->klass_at_put(_imcp_limit + j, klass());
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
971 }
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
972 cp->set_preresolution();
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
973 cp->set_pool_holder(holder());
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
974
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
975 // set up the fancy stuff:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
976 cp->pseudo_string_at_put(_imcp_method_type_value, method_type());
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
977 methodHandle m;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
978 {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
979 int flags_bits = (JVM_MH_INVOKE_BITS | JVM_ACC_PUBLIC | JVM_ACC_FINAL);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
980 methodOop m_oop = oopFactory::new_method(0, accessFlags_from(flags_bits),
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
981 0, 0, 0, IsSafeConc, CHECK_(empty));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
982 m = methodHandle(THREAD, m_oop);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
983 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
984 m->set_constants(cp());
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
985 m->set_name_index(_imcp_invoke_name);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
986 m->set_signature_index(_imcp_invoke_signature);
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
987 assert(is_method_handle_invoke_name(m->name()), "");
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
988 assert(m->signature() == signature, "");
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
989 assert(m->is_method_handle_invoke(), "");
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
990 #ifdef CC_INTERP
2256
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 2177
diff changeset
991 ResultTypeFinder rtf(signature);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
992 m->set_result_index(rtf.type());
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
993 #endif
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
994 m->compute_size_of_parameters(THREAD);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
995 m->set_exception_table(Universe::the_empty_int_array());
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
996 m->init_intrinsic_id();
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
997 assert(m->intrinsic_id() == vmIntrinsics::_invokeExact ||
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
998 m->intrinsic_id() == vmIntrinsics::_invokeGeneric, "must be an invoker");
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
999
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1000 // Finally, set up its entry points.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1001 assert(m->method_handle_type() == method_type(), "");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1002 assert(m->can_be_statically_bound(), "");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1003 m->set_vtable_index(methodOopDesc::nonvirtual_vtable_index);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1004 m->link_method(m, CHECK_(empty));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1005
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1006 #ifdef ASSERT
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1007 // Make sure the pointer chase works.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1008 address p = (address) m();
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1009 for (jint* pchase = method_type_offsets_chain(); (*pchase) != -1; pchase++) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1010 p = *(address*)(p + (*pchase));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1011 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1012 assert((oop)p == method_type(), "pointer chase is correct");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1013 #endif
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1014
1039
987e948ebbc8 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 856
diff changeset
1015 if (TraceMethodHandles && (Verbose || WizardMode))
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1016 m->print_on(tty);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1017
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1018 return m;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1019 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1020
3461
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
1021 klassOop methodOopDesc::check_non_bcp_klass(klassOop klass) {
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
1022 if (klass != NULL && Klass::cast(klass)->class_loader() != NULL) {
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
1023 if (Klass::cast(klass)->oop_is_objArray())
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
1024 klass = objArrayKlass::cast(klass)->bottom_klass();
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
1025 return klass;
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
1026 }
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
1027 return NULL;
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3419
diff changeset
1028 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1029
48
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
1030
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 methodHandle methodOopDesc:: clone_with_new_data(methodHandle m, u_char* new_code, int new_code_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 u_char* new_compressed_linenumber_table, int new_compressed_linenumber_size, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 // Code below does not work for native methods - they should never get rewritten anyway
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 assert(!m->is_native(), "cannot rewrite native methods");
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 // Allocate new methodOop
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 AccessFlags flags = m->access_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 int checked_exceptions_len = m->checked_exceptions_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 int localvariable_len = m->localvariable_table_length();
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1039 // Allocate newm_oop with the is_conc_safe parameter set
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1040 // to IsUnsafeConc to indicate that newm_oop is not yet
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1041 // safe for concurrent processing by a GC.
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1042 methodOop newm_oop = oopFactory::new_method(new_code_length,
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1043 flags,
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1044 new_compressed_linenumber_size,
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1045 localvariable_len,
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1046 checked_exceptions_len,
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1047 IsUnsafeConc,
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1048 CHECK_(methodHandle()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 methodHandle newm (THREAD, newm_oop);
2226
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1050 NOT_PRODUCT(int nmsz = newm->is_parsable() ? newm->size() : -1;)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 int new_method_size = newm->method_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // Create a shallow copy of methodOopDesc part, but be careful to preserve the new constMethodOop
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 constMethodOop newcm = newm->constMethod();
2226
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1054 NOT_PRODUCT(int ncmsz = newcm->is_parsable() ? newcm->size() : -1;)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 int new_const_method_size = newm->constMethod()->object_size();
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1056
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 memcpy(newm(), m(), sizeof(methodOopDesc));
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // Create shallow copy of constMethodOopDesc, but be careful to preserve the methodOop
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1059 // is_conc_safe is set to false because that is the value of
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1060 // is_conc_safe initialzied into newcm and the copy should
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1061 // not overwrite that value. During the window during which it is
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1062 // tagged as unsafe, some extra work could be needed during precleaning
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1063 // or concurrent marking but those phases will be correct. Setting and
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1064 // resetting is done in preference to a careful copying into newcm to
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1065 // avoid having to know the precise layout of a constMethodOop.
2226
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1066 m->constMethod()->set_is_conc_safe(oopDesc::IsUnsafeConc);
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1067 assert(m->constMethod()->is_parsable(), "Should remain parsable");
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1068
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1069 // NOTE: this is a reachable object that transiently signals "conc_unsafe"
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1070 // However, no allocations are done during this window
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1071 // during which it is tagged conc_unsafe, so we are assured that any concurrent
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1072 // thread will not wait forever for the object to revert to "conc_safe".
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1073 // Further, any such conc_unsafe object will indicate a stable size
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1074 // through the transition.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 memcpy(newcm, m->constMethod(), sizeof(constMethodOopDesc));
2226
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1076 m->constMethod()->set_is_conc_safe(oopDesc::IsSafeConc);
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1077 assert(m->constMethod()->is_parsable(), "Should remain parsable");
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1078
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // Reset correct method/const method, method size, and parameter info
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 newcm->set_method(newm());
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 newm->set_constMethod(newcm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 assert(newcm->method() == newm(), "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 newm->constMethod()->set_code_size(new_code_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 newm->constMethod()->set_constMethod_size(new_const_method_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 newm->set_method_size(new_method_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 assert(newm->code_size() == new_code_length, "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 assert(newm->checked_exceptions_length() == checked_exceptions_len, "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 assert(newm->localvariable_table_length() == localvariable_len, "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // Copy new byte codes
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 memcpy(newm->code_base(), new_code, new_code_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // Copy line number table
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 if (new_compressed_linenumber_size > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 memcpy(newm->compressed_linenumber_table(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 new_compressed_linenumber_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 new_compressed_linenumber_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // Copy checked_exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 if (checked_exceptions_len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 memcpy(newm->checked_exceptions_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 m->checked_exceptions_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 checked_exceptions_len * sizeof(CheckedExceptionElement));
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 // Copy local variable number table
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 if (localvariable_len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 memcpy(newm->localvariable_table_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 m->localvariable_table_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 localvariable_len * sizeof(LocalVariableTableElement));
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 }
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1109
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1110 // Only set is_conc_safe to true when changes to newcm are
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1111 // complete.
2226
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1112 assert(!newm->is_parsable() || nmsz < 0 || newm->size() == nmsz, "newm->size() inconsistency");
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1113 assert(!newcm->is_parsable() || ncmsz < 0 || newcm->size() == ncmsz, "newcm->size() inconsistency");
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1114 newcm->set_is_conc_safe(true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 return newm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1117
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1118 vmSymbols::SID methodOopDesc::klass_id_for_intrinsics(klassOop holder) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // if loader is not the default loader (i.e., != NULL), we can't know the intrinsics
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 // because we are not loading from core libraries
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1121 if (instanceKlass::cast(holder)->class_loader() != NULL)
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1122 return vmSymbols::NO_SID; // regardless of name, no intrinsics here
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1123
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 // see if the klass name is well-known:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1125 Symbol* klass_name = instanceKlass::cast(holder)->name();
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1126 return vmSymbols::find_sid(klass_name);
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1127 }
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1128
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1129 void methodOopDesc::init_intrinsic_id() {
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1130 assert(_intrinsic_id == vmIntrinsics::_none, "do this just once");
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1131 const uintptr_t max_id_uint = right_n_bits((int)(sizeof(_intrinsic_id) * BitsPerByte));
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1132 assert((uintptr_t)vmIntrinsics::ID_LIMIT <= max_id_uint, "else fix size");
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
1133 assert(intrinsic_id_size_in_bytes() == sizeof(_intrinsic_id), "");
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1134
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1135 // the klass name is well-known:
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1136 vmSymbols::SID klass_id = klass_id_for_intrinsics(method_holder());
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1137 assert(klass_id != vmSymbols::NO_SID, "caller responsibility");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1138
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // ditto for method and signature:
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 vmSymbols::SID name_id = vmSymbols::find_sid(name());
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
1141 if (name_id == vmSymbols::NO_SID) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 vmSymbols::SID sig_id = vmSymbols::find_sid(signature());
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
1143 if (klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle)
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
1144 && sig_id == vmSymbols::NO_SID) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 jshort flags = access_flags().as_short();
a61af66fc99e Initial load
duke
parents:
diff changeset
1146
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1147 vmIntrinsics::ID id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1148 if (id != vmIntrinsics::_none) {
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1149 set_intrinsic_id(id);
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1150 return;
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1151 }
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1152
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 // A few slightly irregular cases:
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 switch (klass_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_StrictMath):
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 // Second chance: check in regular Math.
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 switch (name_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 case vmSymbols::VM_SYMBOL_ENUM_NAME(min_name):
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 case vmSymbols::VM_SYMBOL_ENUM_NAME(max_name):
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 case vmSymbols::VM_SYMBOL_ENUM_NAME(sqrt_name):
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 // pretend it is the corresponding method in the non-strict class:
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 klass_id = vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_Math);
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1163 id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 }
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1166 break;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1167
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1168 // Signature-polymorphic methods: MethodHandle.invoke*, InvokeDynamic.*.
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
1169 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle):
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1170 if (is_static() || !is_native()) break;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1171 switch (name_id) {
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1172 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeGeneric_name):
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2357
diff changeset
1173 if (!AllowInvokeGeneric) break;
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2357
diff changeset
1174 case vmSymbols::VM_SYMBOL_ENUM_NAME(invoke_name):
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
1175 id = vmIntrinsics::_invokeGeneric;
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
1176 break;
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
1177 case vmSymbols::VM_SYMBOL_ENUM_NAME(invokeExact_name):
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
1178 id = vmIntrinsics::_invokeExact;
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
1179 break;
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1180 }
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1181 break;
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
1182 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_InvokeDynamic):
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1183 if (!is_static() || !is_native()) break;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1184 id = vmIntrinsics::_invokeDynamic;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1185 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1187
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1188 if (id != vmIntrinsics::_none) {
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1189 // Set up its iid. It is an alias method.
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1190 set_intrinsic_id(id);
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1191 return;
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1192 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1194
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 // These two methods are static since a GC may move the methodOopDesc
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 bool methodOopDesc::load_signature_classes(methodHandle m, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 bool sig_is_loaded = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 Handle class_loader(THREAD, instanceKlass::cast(m->method_holder())->class_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 Handle protection_domain(THREAD, Klass::cast(m->method_holder())->protection_domain());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1200 ResourceMark rm(THREAD);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1201 Symbol* signature = m->signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 for(SignatureStream ss(signature); !ss.is_done(); ss.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 if (ss.is_object()) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1204 Symbol* sym = ss.as_symbol(CHECK_(false));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1205 Symbol* name = sym;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 klassOop klass = SystemDictionary::resolve_or_null(name, class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 protection_domain, THREAD);
104
541929da62d2 6624474: Server compiler generates unexpected LinkageError
rasbold
parents: 48
diff changeset
1208 // We are loading classes eagerly. If a ClassNotFoundException or
541929da62d2 6624474: Server compiler generates unexpected LinkageError
rasbold
parents: 48
diff changeset
1209 // a LinkageError was generated, be sure to ignore it.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 if (HAS_PENDING_EXCEPTION) {
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1039
diff changeset
1211 if (PENDING_EXCEPTION->is_a(SystemDictionary::ClassNotFoundException_klass()) ||
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1039
diff changeset
1212 PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 if( klass == NULL) { sig_is_loaded = false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 return sig_is_loaded;
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1223
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 bool methodOopDesc::has_unloaded_classes_in_signature(methodHandle m, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 Handle class_loader(THREAD, instanceKlass::cast(m->method_holder())->class_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 Handle protection_domain(THREAD, Klass::cast(m->method_holder())->protection_domain());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1227 ResourceMark rm(THREAD);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1228 Symbol* signature = m->signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 for(SignatureStream ss(signature); !ss.is_done(); ss.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 if (ss.type() == T_OBJECT) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1231 Symbol* name = ss.as_symbol_or_null();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1232 if (name == NULL) return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 klassOop klass = SystemDictionary::find(name, class_loader, protection_domain, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 if (klass == NULL) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1239
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 // Exposed so field engineers can debug VM
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 void methodOopDesc::print_short_name(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 #ifdef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 st->print(" %s::", method_holder()->klass_part()->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 st->print(" %s::", method_holder()->klass_part()->internal_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 name()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 if (WizardMode) signature()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1251
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 static void reorder_based_on_method_index(objArrayOop methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 objArrayOop annotations,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1255 GrowableArray<oop>* temp_array) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 if (annotations == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1259
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 int length = methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 // Copy to temp array
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1263 temp_array->clear();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1264 for (i = 0; i < length; i++) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1265 temp_array->append(annotations->obj_at(i));
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1266 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1267
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 // Copy back using old method indices
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 for (i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 methodOop m = (methodOop) methods->obj_at(i);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1271 annotations->obj_at_put(i, temp_array->at(m->method_idnum()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1274
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1275 // Comparer for sorting an object array containing
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1276 // methodOops.
3929
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1277 // Used non-template method_comparator methods since
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1278 // Visual Studio 2003 compiler generates incorrect
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1279 // optimized code for it.
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1280 static int method_comparator_narrowOop(narrowOop a, narrowOop b) {
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1281 methodOop m = (methodOop)oopDesc::decode_heap_oop_not_null(a);
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1282 methodOop n = (methodOop)oopDesc::decode_heap_oop_not_null(b);
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1283 return m->name()->fast_compare(n->name());
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1284 }
3929
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1285 static int method_comparator_oop(oop a, oop b) {
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1286 methodOop m = (methodOop)a;
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1287 methodOop n = (methodOop)b;
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1288 return m->name()->fast_compare(n->name());
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1289 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1290
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 void methodOopDesc::sort_methods(objArrayOop methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 objArrayOop methods_annotations,
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 objArrayOop methods_parameter_annotations,
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 objArrayOop methods_default_annotations,
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 bool idempotent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 int length = methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 if (length > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 bool do_annotations = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 if (methods_annotations != NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 methods_parameter_annotations != NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 methods_default_annotations != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 do_annotations = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 if (do_annotations) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 // Remember current method ordering so we can reorder annotations
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 methodOop m = (methodOop) methods->obj_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 m->set_method_idnum(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 }
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1312 {
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1313 No_Safepoint_Verifier nsv;
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1314 if (UseCompressedOops) {
3929
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1315 QuickSort::sort<narrowOop>((narrowOop*)(methods->base()), length, method_comparator_narrowOop, idempotent);
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1316 } else {
3929
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1317 QuickSort::sort<oop>((oop*)(methods->base()), length, method_comparator_oop, idempotent);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 }
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1319 if (UseConcMarkSweepGC) {
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1320 // For CMS we need to dirty the cards for the array
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1321 BarrierSet* bs = Universe::heap()->barrier_set();
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1322 assert(bs->has_write_ref_array_opt(), "Barrier set must have ref array opt");
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1323 bs->write_ref_array(methods->base(), length);
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1324 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1326
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 // Sort annotations if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 assert(methods_annotations == NULL || methods_annotations->length() == methods->length(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 assert(methods_parameter_annotations == NULL || methods_parameter_annotations->length() == methods->length(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 assert(methods_default_annotations == NULL || methods_default_annotations->length() == methods->length(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 if (do_annotations) {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1332 ResourceMark rm;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 // Allocate temporary storage
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1334 GrowableArray<oop>* temp_array = new GrowableArray<oop>(length);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 reorder_based_on_method_index(methods, methods_annotations, temp_array);
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 reorder_based_on_method_index(methods, methods_parameter_annotations, temp_array);
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 reorder_based_on_method_index(methods, methods_default_annotations, temp_array);
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1339
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 // Reset method ordering
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 methodOop m = (methodOop) methods->obj_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 m->set_method_idnum(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1347
a61af66fc99e Initial load
duke
parents:
diff changeset
1348
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 //-----------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 // Non-product code
a61af66fc99e Initial load
duke
parents:
diff changeset
1351
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 class SignatureTypePrinter : public SignatureTypeNames {
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 outputStream* _st;
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 bool _use_separator;
a61af66fc99e Initial load
duke
parents:
diff changeset
1357
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 void type_name(const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 if (_use_separator) _st->print(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 _st->print(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 _use_separator = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1363
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 public:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1365 SignatureTypePrinter(Symbol* signature, outputStream* st) : SignatureTypeNames(signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 _st = st;
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 _use_separator = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1369
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 void print_parameters() { _use_separator = false; iterate_parameters(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 void print_returntype() { _use_separator = false; iterate_returntype(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1373
a61af66fc99e Initial load
duke
parents:
diff changeset
1374
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 void methodOopDesc::print_name(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 SignatureTypePrinter sig(signature(), st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 st->print("%s ", is_static() ? "static" : "virtual");
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 sig.print_returntype();
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 st->print(" %s.", method_holder()->klass_part()->internal_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 name()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 st->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 sig.print_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 st->print(")");
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1387
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 void methodOopDesc::print_codes_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 print_codes_on(0, code_size(), st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1392
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 void methodOopDesc::print_codes_on(int from, int to, outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 methodHandle mh (thread, (methodOop)this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 BytecodeStream s(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 s.set_interval(from, to);
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 BytecodeTracer::set_closure(BytecodeTracer::std_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 while (s.next() >= 0) BytecodeTracer::trace(mh, s.bcp(), st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 #endif // not PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1403
a61af66fc99e Initial load
duke
parents:
diff changeset
1404
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 // Simple compression of line number tables. We use a regular compressed stream, except that we compress deltas
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 // between (bci,line) pairs since they are smaller. If (bci delta, line delta) fits in (5-bit unsigned, 3-bit unsigned)
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 // we save it as one byte, otherwise we write a 0xFF escape character and use regular compression. 0x0 is used
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 // as end-of-stream terminator.
a61af66fc99e Initial load
duke
parents:
diff changeset
1409
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 void CompressedLineNumberWriteStream::write_pair_regular(int bci_delta, int line_delta) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 // bci and line number does not compress into single byte.
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 // Write out escape character and use regular compression for bci and line number.
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 write_byte((jubyte)0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 write_signed_int(bci_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 write_signed_int(line_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1417
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 // See comment in methodOop.hpp which explains why this exists.
2233
15d6977f04b0 7017824: Add support for creating 64-bit Visual Studio projects
sla
parents: 2177
diff changeset
1419 #if defined(_M_AMD64) && _MSC_VER >= 1400
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 #pragma optimize("", off)
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 void CompressedLineNumberWriteStream::write_pair(int bci, int line) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 write_pair_inline(bci, line);
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 #pragma optimize("", on)
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1426
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 CompressedLineNumberReadStream::CompressedLineNumberReadStream(u_char* buffer) : CompressedReadStream(buffer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 _bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 _line = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1431
a61af66fc99e Initial load
duke
parents:
diff changeset
1432
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 bool CompressedLineNumberReadStream::read_pair() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 jubyte next = read_byte();
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 // Check for terminator
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 if (next == 0) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 if (next == 0xFF) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 // Escape character, regular compression used
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 _bci += read_signed_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 _line += read_signed_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 // Single byte compression used
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 _bci += next >> 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 _line += next & 0x7;
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1448
a61af66fc99e Initial load
duke
parents:
diff changeset
1449
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2021
diff changeset
1450 Bytecodes::Code methodOopDesc::orig_bytecode_at(int bci) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 BreakpointInfo* bp = instanceKlass::cast(method_holder())->breakpoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 for (; bp != NULL; bp = bp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 if (bp->match(this, bci)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 return bp->orig_bytecode();
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 return Bytecodes::_shouldnotreachhere;
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1460
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 void methodOopDesc::set_orig_bytecode_at(int bci, Bytecodes::Code code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 assert(code != Bytecodes::_breakpoint, "cannot patch breakpoints this way");
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 BreakpointInfo* bp = instanceKlass::cast(method_holder())->breakpoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 for (; bp != NULL; bp = bp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 if (bp->match(this, bci)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 bp->set_orig_bytecode(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 // and continue, in case there is more than one
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1471
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 void methodOopDesc::set_breakpoint(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 instanceKlass* ik = instanceKlass::cast(method_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 BreakpointInfo *bp = new BreakpointInfo(this, bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 bp->set_next(ik->breakpoints());
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 ik->set_breakpoints(bp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 // do this last:
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 bp->set(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1480
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 static void clear_matches(methodOop m, int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 instanceKlass* ik = instanceKlass::cast(m->method_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 BreakpointInfo* prev_bp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 BreakpointInfo* next_bp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 for (BreakpointInfo* bp = ik->breakpoints(); bp != NULL; bp = next_bp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 next_bp = bp->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 // bci value of -1 is used to delete all breakpoints in method m (ex: clear_all_breakpoint).
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 if (bci >= 0 ? bp->match(m, bci) : bp->match(m)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 // do this first:
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 bp->clear(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 // unhook it
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 if (prev_bp != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 prev_bp->set_next(next_bp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 ik->set_breakpoints(next_bp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 delete bp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 // When class is redefined JVMTI sets breakpoint in all versions of EMCP methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 // at same location. So we have multiple matching (method_index and bci)
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 // BreakpointInfo nodes in BreakpointInfo list. We should just delete one
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 // breakpoint for clear_breakpoint request and keep all other method versions
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 // BreakpointInfo for future clear_breakpoint request.
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 // bcivalue of -1 is used to clear all breakpoints (see clear_all_breakpoints)
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 // which is being called when class is unloaded. We delete all the Breakpoint
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 // information for all versions of method. We may not correctly restore the original
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 // bytecode in all method versions, but that is ok. Because the class is being unloaded
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 // so these methods won't be used anymore.
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 if (bci >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 // This one is a keeper.
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 prev_bp = bp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1516
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 void methodOopDesc::clear_breakpoint(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 assert(bci >= 0, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 clear_matches(this, bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1521
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 void methodOopDesc::clear_all_breakpoints() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 clear_matches(this, -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1525
a61af66fc99e Initial load
duke
parents:
diff changeset
1526
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1527 int methodOopDesc::invocation_count() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1528 if (TieredCompilation) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1529 const methodDataOop mdo = method_data();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1530 if (invocation_counter()->carry() || ((mdo != NULL) ? mdo->invocation_counter()->carry() : false)) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1531 return InvocationCounter::count_limit;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1532 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1533 return invocation_counter()->count() + ((mdo != NULL) ? mdo->invocation_counter()->count() : 0);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1534 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1535 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1536 return invocation_counter()->count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1537 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1538 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1539
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1540 int methodOopDesc::backedge_count() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1541 if (TieredCompilation) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1542 const methodDataOop mdo = method_data();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1543 if (backedge_counter()->carry() || ((mdo != NULL) ? mdo->backedge_counter()->carry() : false)) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1544 return InvocationCounter::count_limit;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1545 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1546 return backedge_counter()->count() + ((mdo != NULL) ? mdo->backedge_counter()->count() : 0);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1547 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1548 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1549 return backedge_counter()->count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1550 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1551 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1552
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1553 int methodOopDesc::highest_comp_level() const {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1554 methodDataOop mdo = method_data();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1555 if (mdo != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1556 return mdo->highest_comp_level();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1557 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1558 return CompLevel_none;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1559 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1560 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1561
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1562 int methodOopDesc::highest_osr_comp_level() const {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1563 methodDataOop mdo = method_data();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1564 if (mdo != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1565 return mdo->highest_osr_comp_level();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1566 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1567 return CompLevel_none;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1568 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1569 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1570
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1571 void methodOopDesc::set_highest_comp_level(int level) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1572 methodDataOop mdo = method_data();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1573 if (mdo != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1574 mdo->set_highest_comp_level(level);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1575 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1576 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1577
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1578 void methodOopDesc::set_highest_osr_comp_level(int level) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1579 methodDataOop mdo = method_data();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1580 if (mdo != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1581 mdo->set_highest_osr_comp_level(level);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1582 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1583 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1584
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 BreakpointInfo::BreakpointInfo(methodOop m, int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 _bci = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 _name_index = m->name_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 _signature_index = m->signature_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 _orig_bytecode = (Bytecodes::Code) *m->bcp_from(_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 if (_orig_bytecode == Bytecodes::_breakpoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 _orig_bytecode = m->orig_bytecode_at(_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1594
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 void BreakpointInfo::set(methodOop method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 Bytecodes::Code code = (Bytecodes::Code) *method->bcp_from(_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 if (code == Bytecodes::_breakpoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 code = method->orig_bytecode_at(_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 assert(orig_bytecode() == code, "original bytecode must be the same");
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 *method->bcp_from(_bci) = Bytecodes::_breakpoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 method->incr_number_of_breakpoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 SystemDictionary::notice_modification();
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 // Deoptimize all dependents on this method
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 methodHandle mh(thread, method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 Universe::flush_dependents_on_method(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1615
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 void BreakpointInfo::clear(methodOop method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 *method->bcp_from(_bci) = orig_bytecode();
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 assert(method->number_of_breakpoints() > 0, "must not go negative");
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 method->decr_number_of_breakpoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 }