annotate src/share/vm/oops/methodOop.cpp @ 3917:eca1193ca245

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