annotate src/share/vm/oops/method.cpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents 9191895df19d
children d8ce2825b193 c3e799c37717
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
4873
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 3929
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 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"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
36 #include "memory/metadataFactory.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
37 #include "memory/oopFactory.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
38 #include "oops/methodData.hpp"
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
39 #include "oops/method.hpp"
1972
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"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
43 #include "prims/jvmtiRedefineClasses.hpp"
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
44 #include "prims/methodHandles.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
45 #include "prims/nativeLookup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
46 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
47 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
48 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
49 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
50 #include "runtime/relocator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
51 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
52 #include "runtime/signature.hpp"
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
53 #include "utilities/quickSort.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1845
diff changeset
54 #include "utilities/xmlstream.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
57 // Implementation of Method
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
58
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
59 Method* Method::allocate(ClassLoaderData* loader_data,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
60 int byte_code_size,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
61 AccessFlags access_flags,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
62 int compressed_line_number_size,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
63 int localvariable_table_length,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
64 int exception_table_length,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
65 int checked_exceptions_length,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
66 TRAPS) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
67 assert(!access_flags.is_native() || byte_code_size == 0,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
68 "native methods should not contain byte codes");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
69 ConstMethod* cm = ConstMethod::allocate(loader_data,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
70 byte_code_size,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
71 compressed_line_number_size,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
72 localvariable_table_length,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
73 exception_table_length,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
74 checked_exceptions_length,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
75 CHECK_NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
76
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
77 int size = Method::size(access_flags.is_native());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
78
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
79 return new (loader_data, size, false, THREAD) Method(cm, access_flags, size);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
80 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
81
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
82 Method::Method(ConstMethod* xconst,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
83 AccessFlags access_flags, int size) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
84 No_Safepoint_Verifier no_safepoint;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
85 set_constMethod(xconst);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
86 set_access_flags(access_flags);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
87 set_method_size(size);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
88 set_name_index(0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
89 set_signature_index(0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
90 #ifdef CC_INTERP
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
91 set_result_index(T_VOID);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
92 #endif
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
93 set_constants(NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
94 set_max_stack(0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
95 set_max_locals(0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
96 set_intrinsic_id(vmIntrinsics::_none);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
97 set_jfr_towrite(false);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
98 set_method_data(NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
99 set_interpreter_throwout_count(0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
100 set_vtable_index(Method::garbage_vtable_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
101
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
102 // Fix and bury in Method*
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
103 set_interpreter_entry(NULL); // sets i2i entry and from_int
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
104 set_adapter_entry(NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
105 clear_code(); // from_c/from_i get set to c2i/i2i
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
106
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
107 if (access_flags.is_native()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
108 clear_native_function();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
109 set_signature_handler(NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
110 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
111
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
112 NOT_PRODUCT(set_compiled_invocation_count(0);)
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
113 set_interpreter_invocation_count(0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
114 invocation_counter()->init();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
115 backedge_counter()->init();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
116 clear_number_of_breakpoints();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
117
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
118 #ifdef TIERED
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
119 set_rate(0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
120 set_prev_event_count(0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
121 set_prev_time(0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
122 #endif
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
123 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
124
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
125 // Release Method*. The nmethod will be gone when we get here because
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
126 // we've walked the code cache.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
127 void Method::deallocate_contents(ClassLoaderData* loader_data) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
128 MetadataFactory::free_metadata(loader_data, constMethod());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
129 set_constMethod(NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
130 MetadataFactory::free_metadata(loader_data, method_data());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
131 set_method_data(NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
132 // The nmethod will be gone when we get here.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
133 if (code() != NULL) _code = NULL;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
134 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
135
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
136 address Method::get_i2c_entry() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
137 assert(_adapter != NULL, "must have");
a61af66fc99e Initial load
duke
parents:
diff changeset
138 return _adapter->get_i2c_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
141 address Method::get_c2i_entry() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
142 assert(_adapter != NULL, "must have");
a61af66fc99e Initial load
duke
parents:
diff changeset
143 return _adapter->get_c2i_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
146 address Method::get_c2i_unverified_entry() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
147 assert(_adapter != NULL, "must have");
a61af66fc99e Initial load
duke
parents:
diff changeset
148 return _adapter->get_c2i_unverified_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
150
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
151 char* Method::name_and_sig_as_C_string() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
152 return name_and_sig_as_C_string(Klass::cast(constants()->pool_holder()), name(), signature());
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
155 char* Method::name_and_sig_as_C_string(char* buf, int size) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
156 return name_and_sig_as_C_string(Klass::cast(constants()->pool_holder()), name(), signature(), buf, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
159 char* Method::name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160 const char* klass_name = klass->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
161 int klass_name_len = (int)strlen(klass_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 int method_name_len = method_name->utf8_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
163 int len = klass_name_len + 1 + method_name_len + signature->utf8_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
164 char* dest = NEW_RESOURCE_ARRAY(char, len + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 strcpy(dest, klass_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
166 dest[klass_name_len] = '.';
a61af66fc99e Initial load
duke
parents:
diff changeset
167 strcpy(&dest[klass_name_len + 1], method_name->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
168 strcpy(&dest[klass_name_len + 1 + method_name_len], signature->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
169 dest[len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
170 return dest;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
173 char* Method::name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature, char* buf, int size) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
174 Symbol* klass_name = klass->name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
175 klass_name->as_klass_external_name(buf, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 int len = (int)strlen(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 if (len < size - 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 buf[len++] = '.';
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 method_name->as_C_string(&(buf[len]), size - len);
a61af66fc99e Initial load
duke
parents:
diff changeset
182 len = (int)strlen(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 signature->as_C_string(&(buf[len]), size - len);
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
190 int Method::fast_exception_handler_bci_for(KlassHandle ex_klass, int throw_bci, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // exception table holds quadruple entries of the form (beg_bci, end_bci, handler_bci, klass_index)
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // access exception table
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
193 ExceptionTable table(this);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
194 int length = table.length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // iterate through all entries sequentially
a61af66fc99e Initial load
duke
parents:
diff changeset
196 constantPoolHandle pool(THREAD, constants());
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
197 for (int i = 0; i < length; i ++) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
198 //reacquire the table in case a GC happened
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
199 ExceptionTable table(this);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
200 int beg_bci = table.start_pc(i);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
201 int end_bci = table.end_pc(i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
202 assert(beg_bci <= end_bci, "inconsistent exception table");
a61af66fc99e Initial load
duke
parents:
diff changeset
203 if (beg_bci <= throw_bci && throw_bci < end_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // exception handler bci range covers throw_bci => investigate further
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
205 int handler_bci = table.handler_pc(i);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
206 int klass_index = table.catch_type_index(i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (klass_index == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 return handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
209 } else if (ex_klass.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // we know the exception class => get the constraint class
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // this may require loading of the constraint class; if verification
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // fails or some other exception occurs, return handler_bci
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
215 Klass* k = pool->klass_at(klass_index, CHECK_(handler_bci));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
216 KlassHandle klass = KlassHandle(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 assert(klass.not_null(), "klass not loaded");
a61af66fc99e Initial load
duke
parents:
diff changeset
218 if (ex_klass->is_subtype_of(klass())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
228 void Method::mask_for(int bci, InterpreterOopMap* mask) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 Thread* myThread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
231 methodHandle h_this(myThread, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
232 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
233 bool has_capability = myThread->is_VM_thread() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
234 myThread->is_ConcurrentGC_thread() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
235 myThread->is_GC_task_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 if (!has_capability) {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 if (!VerifyStack && !VerifyLastFrame) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // verify stack calls this outside VM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
240 warning("oopmap should only be accessed by the "
a61af66fc99e Initial load
duke
parents:
diff changeset
241 "VM, GC task or CMS threads (or during debugging)");
a61af66fc99e Initial load
duke
parents:
diff changeset
242 InterpreterOopMap local_mask;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
243 InstanceKlass::cast(method_holder())->mask_for(h_this, bci, &local_mask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
244 local_mask.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247 #endif
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
248 InstanceKlass::cast(method_holder())->mask_for(h_this, bci, mask);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
253 int Method::bci_from(address bcp) const {
6791
8d3cc6612bd1 7197033: missing ResourceMark for assert in Method::bci_from()
kvn
parents: 6735
diff changeset
254 #ifdef ASSERT
8d3cc6612bd1 7197033: missing ResourceMark for assert in Method::bci_from()
kvn
parents: 6735
diff changeset
255 { ResourceMark rm;
6145
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4873
diff changeset
256 assert(is_native() && bcp == code_base() || contains(bcp) || is_error_reported(),
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4873
diff changeset
257 err_msg("bcp doesn't belong to this method: bcp: " INTPTR_FORMAT ", method: %s", bcp, name_and_sig_as_C_string()));
6791
8d3cc6612bd1 7197033: missing ResourceMark for assert in Method::bci_from()
kvn
parents: 6735
diff changeset
258 }
8d3cc6612bd1 7197033: missing ResourceMark for assert in Method::bci_from()
kvn
parents: 6735
diff changeset
259 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
260 return bcp - code_base();
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // Return (int)bcx if it appears to be a valid BCI.
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // Return bci_from((address)bcx) if it appears to be a valid BCP.
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // Return -1 otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // Used by profiling code, when invalid data is a possibility.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
268 // The caller is responsible for validating the Method* itself.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
269 int Method::validate_bci_from_bcx(intptr_t bcx) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // keep bci as -1 if not a valid bci
a61af66fc99e Initial load
duke
parents:
diff changeset
271 int bci = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 if (bcx == 0 || (address)bcx == code_base()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // code_size() may return 0 and we allow 0 here
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // the method may be native
a61af66fc99e Initial load
duke
parents:
diff changeset
275 bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 } else if (frame::is_bci(bcx)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 if (bcx < code_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 bci = (int)bcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 } else if (contains((address)bcx)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 bci = (address)bcx - code_base();
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // Assert that if we have dodged any asserts, bci is negative.
a61af66fc99e Initial load
duke
parents:
diff changeset
284 assert(bci == -1 || bci == bci_from(bcp_from(bci)), "sane bci if >=0");
a61af66fc99e Initial load
duke
parents:
diff changeset
285 return bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
288 address Method::bcp_from(int bci) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
289 assert((is_native() && bci == 0) || (!is_native() && 0 <= bci && bci < code_size()), "illegal bci");
a61af66fc99e Initial load
duke
parents:
diff changeset
290 address bcp = code_base() + bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 assert(is_native() && bcp == code_base() || contains(bcp), "bcp doesn't belong to this method");
a61af66fc99e Initial load
duke
parents:
diff changeset
292 return bcp;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
296 int Method::size(bool is_native) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // If native, then include pointers for native_function and signature_handler
a61af66fc99e Initial load
duke
parents:
diff changeset
298 int extra_bytes = (is_native) ? 2*sizeof(address*) : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 int extra_words = align_size_up(extra_bytes, BytesPerWord) / BytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 return align_object_size(header_size() + extra_words);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
304 Symbol* Method::klass_name() const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
305 Klass* k = method_holder();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 assert(k->is_klass(), "must be klass");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
307 InstanceKlass* ik = (InstanceKlass*) k;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
308 return ik->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
312 void Method::set_interpreter_kind() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
313 int kind = Interpreter::method_kind(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
314 assert(kind != Interpreter::invalid,
a61af66fc99e Initial load
duke
parents:
diff changeset
315 "interpreter entry must be valid");
a61af66fc99e Initial load
duke
parents:
diff changeset
316 set_interpreter_kind(kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // Attempt to return method oop to original state. Clear any pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // (to objects outside the shared spaces). We won't be able to predict
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // where they should point in a new JVM. Further initialize some
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // entries now in order allow them to be write protected later.
a61af66fc99e Initial load
duke
parents:
diff changeset
324
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
325 void Method::remove_unshareable_info() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
326 unlink_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
327 set_interpreter_kind();
a61af66fc99e Initial load
duke
parents:
diff changeset
328 }
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
331 bool Method::was_executed_more_than(int n) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
332 // Invocation counter is reset when the Method* is compiled.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // If the method has compiled code we therefore assume it has
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // be excuted more than n times.
a61af66fc99e Initial load
duke
parents:
diff changeset
335 if (is_accessor() || is_empty_method() || (code() != NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // interpreter doesn't bump invocation counter of trivial methods
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // compiler does not bump invocation counter of compiled methods
a61af66fc99e Initial load
duke
parents:
diff changeset
338 return true;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
339 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
340 else if (_invocation_counter.carry() || (method_data() != NULL && method_data()->invocation_counter()->carry())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // The carry bit is set when the counter overflows and causes
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // a compilation to occur. We don't know how many times
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // the counter has been reset, so we simply assume it has
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // been executed more than n times.
a61af66fc99e Initial load
duke
parents:
diff changeset
345 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
346 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 return invocation_count() > n;
a61af66fc99e Initial load
duke
parents:
diff changeset
348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 #ifndef PRODUCT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
352 void Method::print_invocation_count() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
353 if (is_static()) tty->print("static ");
a61af66fc99e Initial load
duke
parents:
diff changeset
354 if (is_final()) tty->print("final ");
a61af66fc99e Initial load
duke
parents:
diff changeset
355 if (is_synchronized()) tty->print("synchronized ");
a61af66fc99e Initial load
duke
parents:
diff changeset
356 if (is_native()) tty->print("native ");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
357 method_holder()->name()->print_symbol_on(tty);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
358 tty->print(".");
a61af66fc99e Initial load
duke
parents:
diff changeset
359 name()->print_symbol_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
360 signature()->print_symbol_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 if (WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // dump the size of the byte codes
a61af66fc99e Initial load
duke
parents:
diff changeset
364 tty->print(" {%d}", code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
366 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 tty->print_cr (" interpreter_invocation_count: %8d ", interpreter_invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
369 tty->print_cr (" invocation_counter: %8d ", invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
370 tty->print_cr (" backedge_counter: %8d ", backedge_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
371 if (CountCompiledCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
372 tty->print_cr (" compiled_invocation_count: %8d ", compiled_invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
377
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
378 // Build a MethodData* object to hold information about this method
0
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // collected in the interpreter.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
380 void Method::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
381 // 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
382 // which avoids deadlock for acquiring the MethodData_lock.
6735
aed758eda82a 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 6725
diff changeset
383 if (InstanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) {
2021
7cf1a74771e8 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 1972
diff changeset
384 return;
7cf1a74771e8 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 1972
diff changeset
385 }
7cf1a74771e8 6988439: Parallel Class Loading test deadlock involving MethodData_lock and Pending List Lock
coleenp
parents: 1972
diff changeset
386
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // Grab a lock here to prevent multiple
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
388 // MethodData*s from being created.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
389 MutexLocker ml(MethodData_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
390 if (method->method_data() == NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
391 ClassLoaderData* loader_data = method->method_holder()->class_loader_data();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
392 MethodData* method_data = MethodData::allocate(loader_data, method, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
393 method->set_method_data(method_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
394 if (PrintMethodData && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
396 tty->print("build_interpreter_method_data for ");
a61af66fc99e Initial load
duke
parents:
diff changeset
397 method->print_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // At the end of the run, the MDO, full of data, will be dumped.
a61af66fc99e Initial load
duke
parents:
diff changeset
400 }
a61af66fc99e Initial load
duke
parents:
diff changeset
401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
404 void Method::cleanup_inline_caches() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // The current system doesn't use inline caches in the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // => nothing to do (keep this method around for future use)
a61af66fc99e Initial load
duke
parents:
diff changeset
407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
410 int Method::extra_stack_words() {
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
411 // not an inline function, to avoid a header dependency on Interpreter
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1208
diff changeset
412 return extra_stack_entries() * Interpreter::stackElementSize;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
413 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
414
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
415
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
416 void Method::compute_size_of_parameters(Thread *thread) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
417 ArgumentSizeComputer asc(signature());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
418 set_size_of_parameters(asc.size() + (is_static() ? 0 : 1));
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 #ifdef CC_INTERP
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
422 void Method::set_result_index(BasicType type) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
423 _result_index = Interpreter::BasicType_as_index(type);
a61af66fc99e Initial load
duke
parents:
diff changeset
424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
425 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
426
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
427 BasicType Method::result_type() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
428 ResultTypeFinder rtf(signature());
a61af66fc99e Initial load
duke
parents:
diff changeset
429 return rtf.type();
a61af66fc99e Initial load
duke
parents:
diff changeset
430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
433 bool Method::is_empty_method() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
434 return code_size() == 1
a61af66fc99e Initial load
duke
parents:
diff changeset
435 && *code_base() == Bytecodes::_return;
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
439 bool Method::is_vanilla_constructor() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // Returns true if this method is a vanilla constructor, i.e. an "<init>" "()V" method
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // which only calls the superclass vanilla constructor and possibly does stores of
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // zero constants to local fields:
a61af66fc99e Initial load
duke
parents:
diff changeset
443 //
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // aload_0
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // invokespecial
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // indexbyte1
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // indexbyte2
a61af66fc99e Initial load
duke
parents:
diff changeset
448 //
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // followed by an (optional) sequence of:
a61af66fc99e Initial load
duke
parents:
diff changeset
450 //
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // aload_0
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // aconst_null / iconst_0 / fconst_0 / dconst_0
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // putfield
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // indexbyte1
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // indexbyte2
a61af66fc99e Initial load
duke
parents:
diff changeset
456 //
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // followed by:
a61af66fc99e Initial load
duke
parents:
diff changeset
458 //
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // return
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 assert(name() == vmSymbols::object_initializer_name(), "Should only be called for default constructors");
a61af66fc99e Initial load
duke
parents:
diff changeset
462 assert(signature() == vmSymbols::void_method_signature(), "Should only be called for default constructors");
a61af66fc99e Initial load
duke
parents:
diff changeset
463 int size = code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // Check if size match
a61af66fc99e Initial load
duke
parents:
diff changeset
465 if (size == 0 || size % 5 != 0) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
466 address cb = code_base();
a61af66fc99e Initial load
duke
parents:
diff changeset
467 int last = size - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
468 if (cb[0] != Bytecodes::_aload_0 || cb[1] != Bytecodes::_invokespecial || cb[last] != Bytecodes::_return) {
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // Does not call superclass default constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
470 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // Check optional sequence
a61af66fc99e Initial load
duke
parents:
diff changeset
473 for (int i = 4; i < last; i += 5) {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 if (cb[i] != Bytecodes::_aload_0) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 if (!Bytecodes::is_zero_const(Bytecodes::cast(cb[i+1]))) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 if (cb[i+2] != Bytecodes::_putfield) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
478 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
482 bool Method::compute_has_loops_flag() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
483 BytecodeStream bcs(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
484 Bytecodes::Code bc;
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 while ((bc = bcs.next()) >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 switch( bc ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
488 case Bytecodes::_ifeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
489 case Bytecodes::_ifnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
490 case Bytecodes::_iflt:
a61af66fc99e Initial load
duke
parents:
diff changeset
491 case Bytecodes::_ifle:
a61af66fc99e Initial load
duke
parents:
diff changeset
492 case Bytecodes::_ifne:
a61af66fc99e Initial load
duke
parents:
diff changeset
493 case Bytecodes::_ifnonnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
494 case Bytecodes::_ifgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
495 case Bytecodes::_ifge:
a61af66fc99e Initial load
duke
parents:
diff changeset
496 case Bytecodes::_if_icmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
497 case Bytecodes::_if_icmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
498 case Bytecodes::_if_icmplt:
a61af66fc99e Initial load
duke
parents:
diff changeset
499 case Bytecodes::_if_icmpgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
500 case Bytecodes::_if_icmple:
a61af66fc99e Initial load
duke
parents:
diff changeset
501 case Bytecodes::_if_icmpge:
a61af66fc99e Initial load
duke
parents:
diff changeset
502 case Bytecodes::_if_acmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
503 case Bytecodes::_if_acmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
504 case Bytecodes::_goto:
a61af66fc99e Initial load
duke
parents:
diff changeset
505 case Bytecodes::_jsr:
a61af66fc99e Initial load
duke
parents:
diff changeset
506 if( bcs.dest() < bcs.next_bci() ) _access_flags.set_has_loops();
a61af66fc99e Initial load
duke
parents:
diff changeset
507 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 case Bytecodes::_goto_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
510 case Bytecodes::_jsr_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
511 if( bcs.dest_w() < bcs.next_bci() ) _access_flags.set_has_loops();
a61af66fc99e Initial load
duke
parents:
diff changeset
512 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515 _access_flags.set_loops_flag_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
516 return _access_flags.has_loops();
a61af66fc99e Initial load
duke
parents:
diff changeset
517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
520 bool Method::is_final_method() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // %%% Should return true for private methods also,
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // since there is no way to override them.
a61af66fc99e Initial load
duke
parents:
diff changeset
523 return is_final() || Klass::cast(method_holder())->is_final();
a61af66fc99e Initial load
duke
parents:
diff changeset
524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
527 bool Method::is_strict_method() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
528 return is_strict();
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
532 bool Method::can_be_statically_bound() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
533 if (is_final_method()) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
534 return vtable_index() == nonvirtual_vtable_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
538 bool Method::is_accessor() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
539 if (code_size() != 5) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
540 if (size_of_parameters() != 1) return false;
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2021
diff changeset
541 if (java_code_at(0) != Bytecodes::_aload_0 ) return false;
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2021
diff changeset
542 if (java_code_at(1) != Bytecodes::_getfield) return false;
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2021
diff changeset
543 if (java_code_at(4) != Bytecodes::_areturn &&
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 2021
diff changeset
544 java_code_at(4) != Bytecodes::_ireturn ) return false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
545 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
546 }
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
549 bool Method::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
550 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
551 }
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
552
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
553 bool Method::has_valid_initializer_flags() const {
2334
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
554 return (is_static() ||
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
555 InstanceKlass::cast(method_holder())->major_version() < 51);
2334
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
556 }
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
557
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
558 bool Method::is_static_initializer() const {
2334
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2264
diff changeset
559 // 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
560 // 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
561 // 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
562 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
563 has_valid_initializer_flags();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
567 objArrayHandle Method::resolved_checked_exceptions_impl(Method* this_oop, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
568 int length = this_oop->checked_exceptions_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (length == 0) { // common case
a61af66fc99e Initial load
duke
parents:
diff changeset
570 return objArrayHandle(THREAD, Universe::the_empty_class_klass_array());
a61af66fc99e Initial load
duke
parents:
diff changeset
571 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
572 methodHandle h_this(THREAD, this_oop);
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1039
diff changeset
573 objArrayOop m_oop = oopFactory::new_objArray(SystemDictionary::Class_klass(), length, CHECK_(objArrayHandle()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
574 objArrayHandle mirrors (THREAD, m_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
575 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 CheckedExceptionElement* table = h_this->checked_exceptions_start(); // recompute on each iteration, not gc safe
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
577 Klass* 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
578 assert(Klass::cast(k)->is_subclass_of(SystemDictionary::Throwable_klass()), "invalid exception class");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
579 mirrors->obj_at_put(i, Klass::cast(k)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
581 return mirrors;
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
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
586 int Method::line_number_from_bci(int bci) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
587 if (bci == SynchronizationEntryBCI) bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 assert(bci == 0 || 0 <= bci && bci < code_size(), "illegal bci");
a61af66fc99e Initial load
duke
parents:
diff changeset
589 int best_bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
590 int best_line = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 if (has_linenumber_table()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
593 // The line numbers are a short array of 2-tuples [start_pc, line_number].
a61af66fc99e Initial load
duke
parents:
diff changeset
594 // Not necessarily sorted and not necessarily one-to-one.
a61af66fc99e Initial load
duke
parents:
diff changeset
595 CompressedLineNumberReadStream stream(compressed_linenumber_table());
a61af66fc99e Initial load
duke
parents:
diff changeset
596 while (stream.read_pair()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
597 if (stream.bci() == bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // perfect match
a61af66fc99e Initial load
duke
parents:
diff changeset
599 return stream.line();
a61af66fc99e Initial load
duke
parents:
diff changeset
600 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // update best_bci/line
a61af66fc99e Initial load
duke
parents:
diff changeset
602 if (stream.bci() < bci && stream.bci() >= best_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 best_bci = stream.bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
604 best_line = stream.line();
a61af66fc99e Initial load
duke
parents:
diff changeset
605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
609 return best_line;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 }
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
613 bool Method::is_klass_loaded_by_klass_index(int klass_index) const {
6123
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 4873
diff changeset
614 if( constants()->tag_at(klass_index).is_unresolved_klass() ) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
615 Thread *thread = Thread::current();
6123
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 4873
diff changeset
616 Symbol* klass_name = constants()->klass_name_at(klass_index);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
617 Handle loader(thread, InstanceKlass::cast(method_holder())->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
618 Handle prot (thread, Klass::cast(method_holder())->protection_domain());
a61af66fc99e Initial load
duke
parents:
diff changeset
619 return SystemDictionary::find(klass_name, loader, prot, thread) != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
620 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
621 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623 }
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
626 bool Method::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
6123
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 4873
diff changeset
627 int klass_index = constants()->klass_ref_index_at(refinfo_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
628 if (must_be_resolved) {
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // Make sure klass is resolved in constantpool.
a61af66fc99e Initial load
duke
parents:
diff changeset
630 if (constants()->tag_at(klass_index).is_unresolved_klass()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
631 }
a61af66fc99e Initial load
duke
parents:
diff changeset
632 return is_klass_loaded_by_klass_index(klass_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
633 }
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
636 void Method::set_native_function(address function, bool post_event_flag) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
637 assert(function != NULL, "use clear_native_function to unregister natives");
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
638 assert(!is_method_handle_intrinsic() || function == SharedRuntime::native_method_throw_unsatisfied_link_error_entry(), "");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
639 address* native_function = native_function_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // We can see racers trying to place the same native function into place. Once
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // is plenty.
a61af66fc99e Initial load
duke
parents:
diff changeset
643 address current = *native_function;
a61af66fc99e Initial load
duke
parents:
diff changeset
644 if (current == function) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
645 if (post_event_flag && JvmtiExport::should_post_native_method_bind() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
646 function != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // native_method_throw_unsatisfied_link_error_entry() should only
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // be passed when post_event_flag is false.
a61af66fc99e Initial load
duke
parents:
diff changeset
649 assert(function !=
a61af66fc99e Initial load
duke
parents:
diff changeset
650 SharedRuntime::native_method_throw_unsatisfied_link_error_entry(),
a61af66fc99e Initial load
duke
parents:
diff changeset
651 "post_event_flag mis-match");
a61af66fc99e Initial load
duke
parents:
diff changeset
652
a61af66fc99e Initial load
duke
parents:
diff changeset
653 // post the bind event, and possible change the bind function
a61af66fc99e Initial load
duke
parents:
diff changeset
654 JvmtiExport::post_native_method_bind(this, &function);
a61af66fc99e Initial load
duke
parents:
diff changeset
655 }
a61af66fc99e Initial load
duke
parents:
diff changeset
656 *native_function = function;
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // This function can be called more than once. We must make sure that we always
a61af66fc99e Initial load
duke
parents:
diff changeset
658 // use the latest registered method -> check if a stub already has been generated.
a61af66fc99e Initial load
duke
parents:
diff changeset
659 // If so, we have to make it not_entrant.
a61af66fc99e Initial load
duke
parents:
diff changeset
660 nmethod* nm = code(); // Put it into local variable to guard against concurrent updates
a61af66fc99e Initial load
duke
parents:
diff changeset
661 if (nm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 nm->make_not_entrant();
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
667 bool Method::has_native_function() const {
6267
977007096840 7187290: nightly failures after JSR 292 lazy method handle update
twisti
parents: 6266
diff changeset
668 if (is_method_handle_intrinsic())
977007096840 7187290: nightly failures after JSR 292 lazy method handle update
twisti
parents: 6266
diff changeset
669 return false; // special-cased in SharedRuntime::generate_native_wrapper
0
a61af66fc99e Initial load
duke
parents:
diff changeset
670 address func = native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
671 return (func != NULL && func != SharedRuntime::native_method_throw_unsatisfied_link_error_entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
673
a61af66fc99e Initial load
duke
parents:
diff changeset
674
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
675 void Method::clear_native_function() {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
676 // Note: is_method_handle_intrinsic() is allowed here.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
677 set_native_function(
a61af66fc99e Initial load
duke
parents:
diff changeset
678 SharedRuntime::native_method_throw_unsatisfied_link_error_entry(),
a61af66fc99e Initial load
duke
parents:
diff changeset
679 !native_bind_event_is_interesting);
a61af66fc99e Initial load
duke
parents:
diff changeset
680 clear_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
683 address Method::critical_native_function() {
4873
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 3929
diff changeset
684 methodHandle mh(this);
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 3929
diff changeset
685 return NativeLookup::lookup_critical_entry(mh);
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 3929
diff changeset
686 }
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 3929
diff changeset
687
0
a61af66fc99e Initial load
duke
parents:
diff changeset
688
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
689 void Method::set_signature_handler(address handler) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
690 address* signature_handler = signature_handler_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
691 *signature_handler = handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
693
a61af66fc99e Initial load
duke
parents:
diff changeset
694
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
695 void Method::print_made_not_compilable(int comp_level, bool is_osr, bool report) {
1208
cef333a48af6 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 1206
diff changeset
696 if (PrintCompilation && report) {
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
697 ttyLocker ttyl;
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
698 tty->print("made not %scompilable on ", is_osr ? "OSR " : "");
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
699 if (comp_level == CompLevel_all) {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
700 tty->print("all levels ");
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
701 } else {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
702 tty->print("levels ");
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
703 for (int i = (int)CompLevel_none; i <= comp_level; i++) {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
704 tty->print("%d ", i);
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
705 }
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
706 }
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
707 this->print_short_name(tty);
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
708 int size = this->code_size();
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
709 if (size > 0)
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
710 tty->print(" (%d bytes)", size);
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
711 tty->cr();
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1202
diff changeset
712 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
713 if ((TraceDeoptimization || LogCompilation) && (xtty != NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 ttyLocker ttyl;
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
715 xtty->begin_elem("make_not_%scompilable thread='%d'", is_osr ? "osr_" : "", (int) os::current_thread_id());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
716 xtty->method(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
717 xtty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
718 xtty->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
720 }
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
721
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
722 bool Method::is_not_compilable(int comp_level) const {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
723 if (number_of_breakpoints() > 0)
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
724 return true;
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
725 if (is_method_handle_intrinsic())
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
726 return !is_synthetic(); // the generated adapters must be compiled
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
727 if (comp_level == CompLevel_any)
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
728 return is_not_c1_compilable() || is_not_c2_compilable();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
729 if (is_c1_compile(comp_level))
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
730 return is_not_c1_compilable();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
731 if (is_c2_compile(comp_level))
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
732 return is_not_c2_compilable();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
733 return false;
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
734 }
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
735
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
736 // call this when compiler finds that this method is not compilable
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
737 void Method::set_not_compilable(int comp_level, bool report) {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
738 print_made_not_compilable(comp_level, /*is_osr*/ false, report);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
739 if (comp_level == CompLevel_all) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
740 set_not_c1_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
741 set_not_c2_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
742 } else {
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
743 if (is_c1_compile(comp_level))
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
744 set_not_c1_compilable();
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
745 if (is_c2_compile(comp_level))
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
746 set_not_c2_compilable();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
747 }
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
748 CompilationPolicy::policy()->disable_compilation(this);
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
749 }
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
750
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
751 bool Method::is_not_osr_compilable(int comp_level) const {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
752 if (is_not_compilable(comp_level))
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
753 return true;
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
754 if (comp_level == CompLevel_any)
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
755 return is_not_c1_osr_compilable() || is_not_c2_osr_compilable();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
756 if (is_c1_compile(comp_level))
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
757 return is_not_c1_osr_compilable();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
758 if (is_c2_compile(comp_level))
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
759 return is_not_c2_osr_compilable();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
760 return false;
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
761 }
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
762
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
763 void Method::set_not_osr_compilable(int comp_level, bool report) {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
764 print_made_not_compilable(comp_level, /*is_osr*/ true, report);
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
765 if (comp_level == CompLevel_all) {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
766 set_not_c1_osr_compilable();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
767 set_not_c2_osr_compilable();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
768 } else {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
769 if (is_c1_compile(comp_level))
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
770 set_not_c1_osr_compilable();
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
771 if (is_c2_compile(comp_level))
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6791
diff changeset
772 set_not_c2_osr_compilable();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
773 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
774 CompilationPolicy::policy()->disable_compilation(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
775 }
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // Revert to using the interpreter and clear out the nmethod
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
778 void Method::clear_code() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // this may be NULL if c2i adapters have not been made yet
a61af66fc99e Initial load
duke
parents:
diff changeset
781 // Only should happen at allocate time.
a61af66fc99e Initial load
duke
parents:
diff changeset
782 if (_adapter == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
783 _from_compiled_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
785 _from_compiled_entry = _adapter->get_c2i_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
786 }
a61af66fc99e Initial load
duke
parents:
diff changeset
787 OrderAccess::storestore();
a61af66fc99e Initial load
duke
parents:
diff changeset
788 _from_interpreted_entry = _i2i_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
789 OrderAccess::storestore();
a61af66fc99e Initial load
duke
parents:
diff changeset
790 _code = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
792
a61af66fc99e Initial load
duke
parents:
diff changeset
793 // Called by class data sharing to remove any entry points (which are not shared)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
794 void Method::unlink_method() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
795 _code = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
796 _i2i_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
797 _from_interpreted_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
798 if (is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
799 *native_function_addr() = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
800 set_signature_handler(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
802 NOT_PRODUCT(set_compiled_invocation_count(0);)
a61af66fc99e Initial load
duke
parents:
diff changeset
803 invocation_counter()->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
804 backedge_counter()->reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
805 _adapter = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
806 _from_compiled_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
807 assert(_method_data == NULL, "unexpected method data?");
a61af66fc99e Initial load
duke
parents:
diff changeset
808 set_method_data(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
809 set_interpreter_throwout_count(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
810 set_interpreter_invocation_count(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
812
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // Called when the method_holder is getting linked. Setup entrypoints so the method
a61af66fc99e Initial load
duke
parents:
diff changeset
814 // is ready to be called from interpreter, compiler, and vtables.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
815 void Method::link_method(methodHandle h_method, TRAPS) {
3748
d3b9f2be46ab 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 2478
diff changeset
816 // 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
817 // leftover methods that weren't linked.
d3b9f2be46ab 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 2478
diff changeset
818 if (_i2i_entry != NULL) return;
d3b9f2be46ab 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 2478
diff changeset
819
0
a61af66fc99e Initial load
duke
parents:
diff changeset
820 assert(_adapter == NULL, "init'd to NULL" );
a61af66fc99e Initial load
duke
parents:
diff changeset
821 assert( _code == NULL, "nothing compiled yet" );
a61af66fc99e Initial load
duke
parents:
diff changeset
822
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // Setup interpreter entrypoint
a61af66fc99e Initial load
duke
parents:
diff changeset
824 assert(this == h_method(), "wrong h_method()" );
a61af66fc99e Initial load
duke
parents:
diff changeset
825 address entry = Interpreter::entry_for_method(h_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
826 assert(entry != NULL, "interpreter entry must be non-null");
a61af66fc99e Initial load
duke
parents:
diff changeset
827 // Sets both _i2i_entry and _from_interpreted_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
828 set_interpreter_entry(entry);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
829 if (is_native() && !is_method_handle_intrinsic()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
830 set_native_function(
a61af66fc99e Initial load
duke
parents:
diff changeset
831 SharedRuntime::native_method_throw_unsatisfied_link_error_entry(),
a61af66fc99e Initial load
duke
parents:
diff changeset
832 !native_bind_event_is_interesting);
a61af66fc99e Initial load
duke
parents:
diff changeset
833 }
a61af66fc99e Initial load
duke
parents:
diff changeset
834
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // Setup compiler entrypoint. This is made eagerly, so we do not need
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // special handling of vtables. An alternative is to make adapters more
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // lazily by calling make_adapter() from from_compiled_entry() for the
a61af66fc99e Initial load
duke
parents:
diff changeset
838 // normal calls. For vtable calls life gets more complicated. When a
a61af66fc99e Initial load
duke
parents:
diff changeset
839 // call-site goes mega-morphic we need adapters in all methods which can be
a61af66fc99e Initial load
duke
parents:
diff changeset
840 // called from the vtable. We need adapters on such methods that get loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // later. Ditto for mega-morphic itable calls. If this proves to be a
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // 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
843 (void) make_adapters(h_method, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
844
a61af66fc99e Initial load
duke
parents:
diff changeset
845 // ONLY USE the h_method now as make_adapter may have blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
848
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
849 address Method::make_adapters(methodHandle mh, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // Adapters for compiled code are made eagerly here. They are fairly
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // small (generally < 100 bytes) and quick to make (and cached and shared)
a61af66fc99e Initial load
duke
parents:
diff changeset
852 // so making them eagerly shouldn't be too expensive.
a61af66fc99e Initial load
duke
parents:
diff changeset
853 AdapterHandlerEntry* adapter = AdapterHandlerLibrary::get_adapter(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
854 if (adapter == NULL ) {
1187
cf0685d550f1 6911204: generated adapters with large signatures can fill up the code cache
never
parents: 1152
diff changeset
855 THROW_MSG_NULL(vmSymbols::java_lang_VirtualMachineError(), "out of space in CodeCache for adapters");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
856 }
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858 mh->set_adapter_entry(adapter);
a61af66fc99e Initial load
duke
parents:
diff changeset
859 mh->_from_compiled_entry = adapter->get_c2i_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
860 return adapter->get_c2i_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
861 }
a61af66fc99e Initial load
duke
parents:
diff changeset
862
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // The verified_code_entry() must be called when a invoke is resolved
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // on this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 // It returns the compiled code entry point, after asserting not null.
a61af66fc99e Initial load
duke
parents:
diff changeset
867 // This function is called after potential safepoints so that nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
868 // or adapter that it points to is still live and valid.
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // This function must not hit a safepoint!
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
870 address Method::verified_code_entry() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
871 debug_only(No_Safepoint_Verifier nsv;)
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
872 nmethod *code = (nmethod *)OrderAccess::load_ptr_acquire(&_code);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
873 if (code == NULL && UseCodeCacheFlushing) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
874 nmethod *saved_code = CodeCache::find_and_remove_saved_code(this);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
875 if (saved_code != NULL) {
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
876 methodHandle method(this);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
877 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
878 set_code( method, saved_code );
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
879 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
880 }
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1187
diff changeset
881
0
a61af66fc99e Initial load
duke
parents:
diff changeset
882 assert(_from_compiled_entry != NULL, "must be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
883 return _from_compiled_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 }
a61af66fc99e Initial load
duke
parents:
diff changeset
885
a61af66fc99e Initial load
duke
parents:
diff changeset
886 // 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
887 // (could be racing a deopt).
a61af66fc99e Initial load
duke
parents:
diff changeset
888 // Not inline to avoid circular ref.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
889 bool Method::check_code() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // cached in a register or local. There's a race on the value of the field.
a61af66fc99e Initial load
duke
parents:
diff changeset
891 nmethod *code = (nmethod *)OrderAccess::load_ptr_acquire(&_code);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
892 return code == NULL || (code->method() == NULL) || (code->method() == (Method*)this && !code->is_osr_method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
893 }
a61af66fc99e Initial load
duke
parents:
diff changeset
894
a61af66fc99e Initial load
duke
parents:
diff changeset
895 // Install compiled code. Instantly it can execute.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
896 void Method::set_code(methodHandle mh, nmethod *code) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
897 assert( code, "use clear_code to remove code" );
a61af66fc99e Initial load
duke
parents:
diff changeset
898 assert( mh->check_code(), "" );
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 guarantee(mh->adapter() != NULL, "Adapter blob must already exist!");
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 // These writes must happen in this order, because the interpreter will
a61af66fc99e Initial load
duke
parents:
diff changeset
903 // directly jump to from_interpreted_entry which jumps to an i2c adapter
a61af66fc99e Initial load
duke
parents:
diff changeset
904 // which jumps to _from_compiled_entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
905 mh->_code = code; // Assign before allowing compiled code to exec
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 int comp_level = code->comp_level();
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // In theory there could be a race here. In practice it is unlikely
a61af66fc99e Initial load
duke
parents:
diff changeset
909 // and not worth worrying about.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
910 if (comp_level > mh->highest_comp_level()) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
911 mh->set_highest_comp_level(comp_level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
912 }
a61af66fc99e Initial load
duke
parents:
diff changeset
913
a61af66fc99e Initial load
duke
parents:
diff changeset
914 OrderAccess::storestore();
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents: 1662
diff changeset
915 #ifdef SHARK
1845
a222fcfba398 6990549: Zero and Shark fixes after 6978355 and 6953144
twisti
parents: 1793
diff changeset
916 mh->_from_interpreted_entry = code->insts_begin();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
917 #else //!SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
918 mh->_from_compiled_entry = code->verified_entry_point();
a61af66fc99e Initial load
duke
parents:
diff changeset
919 OrderAccess::storestore();
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // Instantly compiled code can execute.
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
921 if (!mh->is_method_handle_intrinsic())
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
922 mh->_from_interpreted_entry = mh->get_i2c_entry();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
923 #endif //!SHARK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
925
a61af66fc99e Initial load
duke
parents:
diff changeset
926
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
927 bool Method::is_overridden_in(Klass* k) const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
928 InstanceKlass* ik = InstanceKlass::cast(k);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
929
a61af66fc99e Initial load
duke
parents:
diff changeset
930 if (ik->is_interface()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932 // If method is an interface, we skip it - except if it
a61af66fc99e Initial load
duke
parents:
diff changeset
933 // is a miranda method
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
934 if (InstanceKlass::cast(method_holder())->is_interface()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
935 // Check that method is not a miranda method
a61af66fc99e Initial load
duke
parents:
diff changeset
936 if (ik->lookup_method(name(), signature()) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
937 // No implementation exist - so miranda method
a61af66fc99e Initial load
duke
parents:
diff changeset
938 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
939 }
a61af66fc99e Initial load
duke
parents:
diff changeset
940 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
941 }
a61af66fc99e Initial load
duke
parents:
diff changeset
942
a61af66fc99e Initial load
duke
parents:
diff changeset
943 assert(ik->is_subclass_of(method_holder()), "should be subklass");
a61af66fc99e Initial load
duke
parents:
diff changeset
944 assert(ik->vtable() != NULL, "vtable should exist");
a61af66fc99e Initial load
duke
parents:
diff changeset
945 if (vtable_index() == nonvirtual_vtable_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
946 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
947 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
948 Method* vt_m = ik->method_at_vtable(vtable_index());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
949 return vt_m != this;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
950 }
a61af66fc99e Initial load
duke
parents:
diff changeset
951 }
a61af66fc99e Initial load
duke
parents:
diff changeset
952
a61af66fc99e Initial load
duke
parents:
diff changeset
953
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
954 // give advice about whether this Method* should be cached or not
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
955 bool Method::should_not_be_cached() const {
48
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
956 if (is_old()) {
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
957 // 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
958 // 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
959 // 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
960 // finishes executing.
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
961 return true;
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
962 }
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
963
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
964 // 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
965 return false;
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
966 }
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
967
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
968 // Constant pool structure for invoke methods:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
969 enum {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
970 _imcp_invoke_name = 1, // utf8: 'invokeExact', etc.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
971 _imcp_invoke_signature, // utf8: (variable Symbol*)
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
972 _imcp_limit
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
973 };
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
974
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
975 // Test if this method is an MH adapter frame generated by Java code.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
976 // Cf. java/lang/invoke/InvokerBytecodeGenerator
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
977 bool Method::is_compiled_lambda_form() const {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
978 return intrinsic_id() == vmIntrinsics::_compiledLambdaForm;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
979 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
980
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
981 // Test if this method is an internal MH primitive method.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
982 bool Method::is_method_handle_intrinsic() const {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
983 vmIntrinsics::ID iid = intrinsic_id();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
984 return (MethodHandles::is_signature_polymorphic(iid) &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
985 MethodHandles::is_signature_polymorphic_intrinsic(iid));
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1142
diff changeset
986 }
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1142
diff changeset
987
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
988 bool Method::has_member_arg() const {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
989 vmIntrinsics::ID iid = intrinsic_id();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
990 return (MethodHandles::is_signature_polymorphic(iid) &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
991 MethodHandles::has_member_arg(iid));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
992 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
993
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
994 // Make an instance of a signature-polymorphic internal MH primitive.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
995 methodHandle Method::make_method_handle_intrinsic(vmIntrinsics::ID iid,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
996 Symbol* signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
997 TRAPS) {
3891
ac8738449b6f 7082949: JSR 292: missing ResourceMark in methodOopDesc::make_invoke_method
never
parents: 3795
diff changeset
998 ResourceMark rm;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
999 methodHandle empty;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1000
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1001 KlassHandle holder = SystemDictionary::MethodHandle_klass();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1002 Symbol* name = MethodHandles::signature_polymorphic_intrinsic_name(iid);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1003 assert(iid == MethodHandles::signature_polymorphic_name_id(name), "");
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1004 if (TraceMethodHandles) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1005 tty->print_cr("make_method_handle_intrinsic MH.%s%s", name->as_C_string(), signature->as_C_string());
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1006 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1007
2478
328926869b15 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 2460
diff changeset
1008 // 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
1009 name->increment_refcount();
328926869b15 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 2460
diff changeset
1010 signature->increment_refcount();
328926869b15 6987991: JSR 292 phpreboot test/testtracefun2.phpr segfaults
jrose
parents: 2460
diff changeset
1011
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1012 int cp_length = _imcp_limit;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1013 ClassLoaderData* loader_data = holder->class_loader_data();
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1014 constantPoolHandle cp;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1015 {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1016 ConstantPool* cp_oop = ConstantPool::allocate(loader_data, cp_length, CHECK_(empty));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1017 cp = constantPoolHandle(THREAD, cp_oop);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1018 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1019 cp->set_pool_holder(holder());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1020 cp->symbol_at_put(_imcp_invoke_name, name);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1021 cp->symbol_at_put(_imcp_invoke_signature, signature);
3785
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3749
diff changeset
1022 cp->set_preresolution();
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1023
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1024 // decide on access bits: public or not?
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1025 int flags_bits = (JVM_ACC_NATIVE | JVM_ACC_SYNTHETIC | JVM_ACC_FINAL);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1026 bool must_be_static = MethodHandles::is_signature_polymorphic_static(iid);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1027 if (must_be_static) flags_bits |= JVM_ACC_STATIC;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1028 assert((flags_bits & JVM_ACC_PUBLIC) == 0, "do not expose these methods");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1029
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1030 methodHandle m;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1031 {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1032 Method* m_oop = Method::allocate(loader_data, 0, accessFlags_from(flags_bits),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1033 0, 0, 0, 0, CHECK_(empty));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1034 m = methodHandle(THREAD, m_oop);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1035 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1036 m->set_constants(cp());
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1037 m->set_name_index(_imcp_invoke_name);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1038 m->set_signature_index(_imcp_invoke_signature);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1039 assert(MethodHandles::is_signature_polymorphic_name(m->name()), "");
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1040 assert(m->signature() == signature, "");
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1041 #ifdef CC_INTERP
2256
173926398291 7018673: Zero: 6953144, 6990754 and 7009756 made some changes which broke Zero
twisti
parents: 2177
diff changeset
1042 ResultTypeFinder rtf(signature);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1043 m->set_result_index(rtf.type());
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1044 #endif
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1045 m->compute_size_of_parameters(THREAD);
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
1046 m->init_intrinsic_id();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1047 assert(m->is_method_handle_intrinsic(), "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1048 #ifdef ASSERT
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1049 if (!MethodHandles::is_signature_polymorphic(m->intrinsic_id())) m->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1050 assert(MethodHandles::is_signature_polymorphic(m->intrinsic_id()), "must be an invoker");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1051 assert(m->intrinsic_id() == iid, "correctly predicted iid");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1052 #endif //ASSERT
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1053
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1054 // Finally, set up its entry points.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1055 assert(m->can_be_statically_bound(), "");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1056 m->set_vtable_index(Method::nonvirtual_vtable_index);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1057 m->link_method(m, CHECK_(empty));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1058
1039
987e948ebbc8 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 856
diff changeset
1059 if (TraceMethodHandles && (Verbose || WizardMode))
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1060 m->print_on(tty);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1061
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1062 return m;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1063 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1064
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1065 Klass* Method::check_non_bcp_klass(Klass* klass) {
3785
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3749
diff changeset
1066 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
1067 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
1068 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
1069 return klass;
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3749
diff changeset
1070 }
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3749
diff changeset
1071 return NULL;
ddd894528dbc 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 3749
diff changeset
1072 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 579
diff changeset
1073
48
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
1074
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1075 methodHandle Method::clone_with_new_data(methodHandle m, u_char* new_code, int new_code_length,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 u_char* new_compressed_linenumber_table, int new_compressed_linenumber_size, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 // Code below does not work for native methods - they should never get rewritten anyway
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 assert(!m->is_native(), "cannot rewrite native methods");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1079 // Allocate new Method*
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 AccessFlags flags = m->access_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 int checked_exceptions_len = m->checked_exceptions_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 int localvariable_len = m->localvariable_table_length();
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1083 int exception_table_len = m->exception_table_length();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1084
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1085 ClassLoaderData* loader_data = m()->method_holder()->class_loader_data();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1086 Method* newm_oop = Method::allocate(loader_data,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1087 new_code_length,
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1088 flags,
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1089 new_compressed_linenumber_size,
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1090 localvariable_len,
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1091 exception_table_len,
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1092 checked_exceptions_len,
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1093 CHECK_(methodHandle()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 methodHandle newm (THREAD, newm_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 int new_method_size = newm->method_size();
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1096
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1097 // Create a shallow copy of Method part, but be careful to preserve the new ConstMethod*
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1098 ConstMethod* newcm = newm->constMethod();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1099 int new_const_method_size = newm->constMethod()->size();
2226
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1100
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1101 memcpy(newm(), m(), sizeof(Method));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1102
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1103 // Create shallow copy of ConstMethod.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1104 memcpy(newcm, m->constMethod(), sizeof(ConstMethod));
2226
c5a923563727 6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents: 2177
diff changeset
1105
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // Reset correct method/const method, method size, and parameter info
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 newm->set_constMethod(newcm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 newm->constMethod()->set_code_size(new_code_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 newm->constMethod()->set_constMethod_size(new_const_method_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 newm->set_method_size(new_method_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 assert(newm->code_size() == new_code_length, "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 assert(newm->checked_exceptions_length() == checked_exceptions_len, "check");
6216
161ae369407d 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 6213
diff changeset
1113 assert(newm->exception_table_length() == exception_table_len, "check");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 assert(newm->localvariable_table_length() == localvariable_len, "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 // Copy new byte codes
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 memcpy(newm->code_base(), new_code, new_code_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 // Copy line number table
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 if (new_compressed_linenumber_size > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 memcpy(newm->compressed_linenumber_table(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 new_compressed_linenumber_table,
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 new_compressed_linenumber_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 // Copy checked_exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 if (checked_exceptions_len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 memcpy(newm->checked_exceptions_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 m->checked_exceptions_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 checked_exceptions_len * sizeof(CheckedExceptionElement));
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 }
6216
161ae369407d 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 6213
diff changeset
1129 // Copy exception table
161ae369407d 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 6213
diff changeset
1130 if (exception_table_len > 0) {
161ae369407d 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 6213
diff changeset
1131 memcpy(newm->exception_table_start(),
161ae369407d 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 6213
diff changeset
1132 m->exception_table_start(),
161ae369407d 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 6213
diff changeset
1133 exception_table_len * sizeof(ExceptionTableElement));
161ae369407d 7181632: nsk classLoad001_14 failure and CompileTheWorld crash after 7178145.
jiangli
parents: 6213
diff changeset
1134 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 // Copy local variable number table
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 if (localvariable_len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 memcpy(newm->localvariable_table_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 m->localvariable_table_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 localvariable_len * sizeof(LocalVariableTableElement));
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1141 // Copy stackmap table
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1142 if (m->has_stackmap_table()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1143 int code_attribute_length = m->stackmap_data()->length();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1144 Array<u1>* stackmap_data =
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1145 MetadataFactory::new_array<u1>(loader_data, code_attribute_length, 0, CHECK_NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1146 memcpy((void*)stackmap_data->adr_at(0),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1147 (void*)m->stackmap_data()->adr_at(0), code_attribute_length);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1148 newm->set_stackmap_data(stackmap_data);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1149 }
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
1150
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 return newm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1153
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1154 vmSymbols::SID Method::klass_id_for_intrinsics(Klass* holder) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 // if loader is not the default loader (i.e., != NULL), we can't know the intrinsics
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 // because we are not loading from core libraries
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1157 if (InstanceKlass::cast(holder)->class_loader() != NULL)
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1158 return vmSymbols::NO_SID; // regardless of name, no intrinsics here
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1159
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 // see if the klass name is well-known:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1161 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
1162 return vmSymbols::find_sid(klass_name);
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1163 }
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1164
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1165 void Method::init_intrinsic_id() {
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1166 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
1167 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
1168 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
1169 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
1170
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1171 // the klass name is well-known:
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1172 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
1173 assert(klass_id != vmSymbols::NO_SID, "caller responsibility");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1174
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 // ditto for method and signature:
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 vmSymbols::SID name_id = vmSymbols::find_sid(name());
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1177 if (klass_id != vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1178 && name_id == vmSymbols::NO_SID)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1179 return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 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
1181 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
1182 && sig_id == vmSymbols::NO_SID) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 jshort flags = access_flags().as_short();
a61af66fc99e Initial load
duke
parents:
diff changeset
1184
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1185 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
1186 if (id != vmIntrinsics::_none) {
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1187 set_intrinsic_id(id);
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1188 return;
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1189 }
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1190
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 // A few slightly irregular cases:
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 switch (klass_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_StrictMath):
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 // Second chance: check in regular Math.
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 switch (name_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 case vmSymbols::VM_SYMBOL_ENUM_NAME(min_name):
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 case vmSymbols::VM_SYMBOL_ENUM_NAME(max_name):
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 case vmSymbols::VM_SYMBOL_ENUM_NAME(sqrt_name):
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 // pretend it is the corresponding method in the non-strict class:
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 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
1201 id = vmIntrinsics::find_id(klass_id, name_id, sig_id, flags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 }
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1204 break;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1205
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1206 // 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
1207 case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_MethodHandle):
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1208 if (!is_native()) break;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1209 id = MethodHandles::signature_polymorphic_name_id(method_holder(), name());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1210 if (is_static() != MethodHandles::is_signature_polymorphic_static(id))
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1211 id = vmIntrinsics::_none;
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
1212 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1214
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1215 if (id != vmIntrinsics::_none) {
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1216 // 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
1217 set_intrinsic_id(id);
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1218 return;
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
1219 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1221
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1222 // These two methods are static since a GC may move the Method
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1223 bool Method::load_signature_classes(methodHandle m, TRAPS) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1224 if (THREAD->is_Compiler_thread()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1225 // There is nothing useful this routine can do from within the Compile thread.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1226 // Hopefully, the signature contains only well-known classes.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1227 // We could scan for this and return true/false, but the caller won't care.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1228 return false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1229 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 bool sig_is_loaded = true;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1231 Handle class_loader(THREAD, InstanceKlass::cast(m->method_holder())->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 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
1233 ResourceMark rm(THREAD);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1234 Symbol* signature = m->signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 for(SignatureStream ss(signature); !ss.is_done(); ss.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 if (ss.is_object()) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1237 Symbol* sym = ss.as_symbol(CHECK_(false));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1238 Symbol* name = sym;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1239 Klass* klass = SystemDictionary::resolve_or_null(name, class_loader,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 protection_domain, THREAD);
104
541929da62d2 6624474: Server compiler generates unexpected LinkageError
rasbold
parents: 48
diff changeset
1241 // We are loading classes eagerly. If a ClassNotFoundException or
541929da62d2 6624474: Server compiler generates unexpected LinkageError
rasbold
parents: 48
diff changeset
1242 // a LinkageError was generated, be sure to ignore it.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 if (HAS_PENDING_EXCEPTION) {
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1039
diff changeset
1244 if (PENDING_EXCEPTION->is_a(SystemDictionary::ClassNotFoundException_klass()) ||
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1039
diff changeset
1245 PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 if( klass == NULL) { sig_is_loaded = false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 return sig_is_loaded;
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1256
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1257 bool Method::has_unloaded_classes_in_signature(methodHandle m, TRAPS) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1258 Handle class_loader(THREAD, InstanceKlass::cast(m->method_holder())->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 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
1260 ResourceMark rm(THREAD);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1261 Symbol* signature = m->signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 for(SignatureStream ss(signature); !ss.is_done(); ss.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 if (ss.type() == T_OBJECT) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1264 Symbol* name = ss.as_symbol_or_null();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1265 if (name == NULL) return true;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1266 Klass* klass = SystemDictionary::find(name, class_loader, protection_domain, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 if (klass == NULL) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1272
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 // Exposed so field engineers can debug VM
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1274 void Method::print_short_name(outputStream* st) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 #ifdef PRODUCT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1277 st->print(" %s::", method_holder()->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 #else
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1279 st->print(" %s::", method_holder()->internal_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 name()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 if (WizardMode) signature()->print_symbol_on(st);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1283 else if (MethodHandles::is_signature_polymorphic(intrinsic_id()))
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6216
diff changeset
1284 MethodHandles::print_as_basic_type_signature_on(st, signature(), true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1286
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1288 static void reorder_based_on_method_index(Array<Method*>* methods,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1289 Array<AnnotationArray*>* annotations,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1290 GrowableArray<AnnotationArray*>* temp_array) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 if (annotations == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1294
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 int length = methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 // Copy to temp array
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1298 temp_array->clear();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1299 for (i = 0; i < length; i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1300 temp_array->append(annotations->at(i));
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1301 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1302
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 // Copy back using old method indices
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 for (i = 0; i < length; i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1305 Method* m = methods->at(i);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1306 annotations->at_put(i, temp_array->at(m->method_idnum()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1309
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1310 // Comparer for sorting an object array containing
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1311 // Method*s.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1312 static int method_comparator(Method* a, Method* b) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1313 return a->name()->fast_compare(b->name());
3929
f94227b6117b 7090259: Fix hotspot sources to build with old compilers
kvn
parents: 3891
diff changeset
1314 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1315
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 // This is only done during class loading, so it is OK to assume method_idnum matches the methods() array
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1317 void Method::sort_methods(Array<Method*>* methods,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1318 Array<AnnotationArray*>* methods_annotations,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1319 Array<AnnotationArray*>* methods_parameter_annotations,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1320 Array<AnnotationArray*>* methods_default_annotations,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 bool idempotent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 int length = methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 if (length > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 bool do_annotations = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 if (methods_annotations != NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 methods_parameter_annotations != NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 methods_default_annotations != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 do_annotations = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 if (do_annotations) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 // Remember current method ordering so we can reorder annotations
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 for (int i = 0; i < length; i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1333 Method* m = methods->at(i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 m->set_method_idnum(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 }
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1337 {
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 2478
diff changeset
1338 No_Safepoint_Verifier nsv;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1339 QuickSort::sort<Method*>(methods->data(), length, method_comparator, idempotent);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1341
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 // Sort annotations if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 assert(methods_annotations == NULL || methods_annotations->length() == methods->length(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 assert(methods_parameter_annotations == NULL || methods_parameter_annotations->length() == methods->length(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 assert(methods_default_annotations == NULL || methods_default_annotations->length() == methods->length(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 if (do_annotations) {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 104
diff changeset
1347 ResourceMark rm;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 // Allocate temporary storage
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1349 GrowableArray<AnnotationArray*>* temp_array = new GrowableArray<AnnotationArray*>(length);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 reorder_based_on_method_index(methods, methods_annotations, temp_array);
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 reorder_based_on_method_index(methods, methods_parameter_annotations, temp_array);
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 reorder_based_on_method_index(methods, methods_default_annotations, temp_array);
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1354
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 // Reset method ordering
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 for (int i = 0; i < length; i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1357 Method* m = methods->at(i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 m->set_method_idnum(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1362
a61af66fc99e Initial load
duke
parents:
diff changeset
1363
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 //-----------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 // Non-product code
a61af66fc99e Initial load
duke
parents:
diff changeset
1366
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 class SignatureTypePrinter : public SignatureTypeNames {
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 outputStream* _st;
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 bool _use_separator;
a61af66fc99e Initial load
duke
parents:
diff changeset
1372
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 void type_name(const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 if (_use_separator) _st->print(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 _st->print(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 _use_separator = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1378
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 public:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
1380 SignatureTypePrinter(Symbol* signature, outputStream* st) : SignatureTypeNames(signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 _st = st;
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 _use_separator = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1384
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 void print_parameters() { _use_separator = false; iterate_parameters(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 void print_returntype() { _use_separator = false; iterate_returntype(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1390 void Method::print_name(outputStream* st) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 SignatureTypePrinter sig(signature(), st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 st->print("%s ", is_static() ? "static" : "virtual");
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 sig.print_returntype();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1396 st->print(" %s.", method_holder()->internal_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 name()->print_symbol_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 st->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 sig.print_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 st->print(")");
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1402
a61af66fc99e Initial load
duke
parents:
diff changeset
1403
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1404 void Method::print_codes_on(outputStream* st) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 print_codes_on(0, code_size(), st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1407
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1408 void Method::print_codes_on(int from, int to, outputStream* st) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 ResourceMark rm(thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1411 methodHandle mh (thread, (Method*)this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 BytecodeStream s(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 s.set_interval(from, to);
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 BytecodeTracer::set_closure(BytecodeTracer::std_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 while (s.next() >= 0) BytecodeTracer::trace(mh, s.bcp(), st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 #endif // not PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1418
a61af66fc99e Initial load
duke
parents:
diff changeset
1419
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 // Simple compression of line number tables. We use a regular compressed stream, except that we compress deltas
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 // 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
1422 // 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
1423 // as end-of-stream terminator.
a61af66fc99e Initial load
duke
parents:
diff changeset
1424
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 void CompressedLineNumberWriteStream::write_pair_regular(int bci_delta, int line_delta) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 // bci and line number does not compress into single byte.
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 // Write out escape character and use regular compression for bci and line number.
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 write_byte((jubyte)0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 write_signed_int(bci_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 write_signed_int(line_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1432
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1433 // See comment in method.hpp which explains why this exists.
2233
15d6977f04b0 7017824: Add support for creating 64-bit Visual Studio projects
sla
parents: 2177
diff changeset
1434 #if defined(_M_AMD64) && _MSC_VER >= 1400
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 #pragma optimize("", off)
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 void CompressedLineNumberWriteStream::write_pair(int bci, int line) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 write_pair_inline(bci, line);
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 #pragma optimize("", on)
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1441
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 CompressedLineNumberReadStream::CompressedLineNumberReadStream(u_char* buffer) : CompressedReadStream(buffer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 _bci = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 _line = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1446
a61af66fc99e Initial load
duke
parents:
diff changeset
1447
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 bool CompressedLineNumberReadStream::read_pair() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 jubyte next = read_byte();
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 // Check for terminator
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 if (next == 0) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 if (next == 0xFF) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 // Escape character, regular compression used
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 _bci += read_signed_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 _line += read_signed_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 // Single byte compression used
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 _bci += next >> 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 _line += next & 0x7;
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1463
a61af66fc99e Initial load
duke
parents:
diff changeset
1464
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1465 Bytecodes::Code Method::orig_bytecode_at(int bci) const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1466 BreakpointInfo* bp = InstanceKlass::cast(method_holder())->breakpoints();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 for (; bp != NULL; bp = bp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 if (bp->match(this, bci)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 return bp->orig_bytecode();
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 return Bytecodes::_shouldnotreachhere;
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1475
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1476 void Method::set_orig_bytecode_at(int bci, Bytecodes::Code code) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 assert(code != Bytecodes::_breakpoint, "cannot patch breakpoints this way");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1478 BreakpointInfo* bp = InstanceKlass::cast(method_holder())->breakpoints();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 for (; bp != NULL; bp = bp->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 if (bp->match(this, bci)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 bp->set_orig_bytecode(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 // and continue, in case there is more than one
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1486
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1487 void Method::set_breakpoint(int bci) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1488 InstanceKlass* ik = InstanceKlass::cast(method_holder());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 BreakpointInfo *bp = new BreakpointInfo(this, bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 bp->set_next(ik->breakpoints());
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 ik->set_breakpoints(bp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 // do this last:
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 bp->set(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1495
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1496 static void clear_matches(Method* m, int bci) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1497 InstanceKlass* ik = InstanceKlass::cast(m->method_holder());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 BreakpointInfo* prev_bp = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 BreakpointInfo* next_bp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 for (BreakpointInfo* bp = ik->breakpoints(); bp != NULL; bp = next_bp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 next_bp = bp->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 // bci value of -1 is used to delete all breakpoints in method m (ex: clear_all_breakpoint).
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 if (bci >= 0 ? bp->match(m, bci) : bp->match(m)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 // do this first:
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 bp->clear(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 // unhook it
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 if (prev_bp != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 prev_bp->set_next(next_bp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 ik->set_breakpoints(next_bp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 delete bp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 // When class is redefined JVMTI sets breakpoint in all versions of EMCP methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 // at same location. So we have multiple matching (method_index and bci)
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 // BreakpointInfo nodes in BreakpointInfo list. We should just delete one
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 // breakpoint for clear_breakpoint request and keep all other method versions
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 // BreakpointInfo for future clear_breakpoint request.
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 // bcivalue of -1 is used to clear all breakpoints (see clear_all_breakpoints)
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 // which is being called when class is unloaded. We delete all the Breakpoint
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 // information for all versions of method. We may not correctly restore the original
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 // bytecode in all method versions, but that is ok. Because the class is being unloaded
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 // so these methods won't be used anymore.
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 if (bci >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 // This one is a keeper.
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 prev_bp = bp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1531
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1532 void Method::clear_breakpoint(int bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 assert(bci >= 0, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 clear_matches(this, bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1536
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1537 void Method::clear_all_breakpoints() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 clear_matches(this, -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1540
a61af66fc99e Initial load
duke
parents:
diff changeset
1541
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1542 int Method::invocation_count() {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1543 if (TieredCompilation) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1544 MethodData* const mdo = method_data();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1545 if (invocation_counter()->carry() || ((mdo != NULL) ? mdo->invocation_counter()->carry() : false)) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1546 return InvocationCounter::count_limit;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1547 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1548 return invocation_counter()->count() + ((mdo != NULL) ? mdo->invocation_counter()->count() : 0);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1549 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1550 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1551 return invocation_counter()->count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1552 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1553 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1554
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1555 int Method::backedge_count() {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1556 if (TieredCompilation) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1557 MethodData* const mdo = method_data();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1558 if (backedge_counter()->carry() || ((mdo != NULL) ? mdo->backedge_counter()->carry() : false)) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1559 return InvocationCounter::count_limit;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1560 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1561 return backedge_counter()->count() + ((mdo != NULL) ? mdo->backedge_counter()->count() : 0);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1562 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1563 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1564 return backedge_counter()->count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1565 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1566 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1567
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1568 int Method::highest_comp_level() const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1569 MethodData* mdo = method_data();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1570 if (mdo != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1571 return mdo->highest_comp_level();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1572 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1573 return CompLevel_none;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1574 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1575 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1576
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1577 int Method::highest_osr_comp_level() const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1578 MethodData* mdo = method_data();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1579 if (mdo != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1580 return mdo->highest_osr_comp_level();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1581 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1582 return CompLevel_none;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1583 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1584 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1585
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1586 void Method::set_highest_comp_level(int level) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1587 MethodData* mdo = method_data();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1588 if (mdo != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1589 mdo->set_highest_comp_level(level);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1590 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1591 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1592
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1593 void Method::set_highest_osr_comp_level(int level) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1594 MethodData* mdo = method_data();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1595 if (mdo != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1596 mdo->set_highest_osr_comp_level(level);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1597 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1598 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1692
diff changeset
1599
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1600 BreakpointInfo::BreakpointInfo(Method* m, int bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 _bci = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 _name_index = m->name_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 _signature_index = m->signature_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 _orig_bytecode = (Bytecodes::Code) *m->bcp_from(_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 if (_orig_bytecode == Bytecodes::_breakpoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 _orig_bytecode = m->orig_bytecode_at(_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1609
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1610 void BreakpointInfo::set(Method* method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 Bytecodes::Code code = (Bytecodes::Code) *method->bcp_from(_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 if (code == Bytecodes::_breakpoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 code = method->orig_bytecode_at(_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 assert(orig_bytecode() == code, "original bytecode must be the same");
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 *method->bcp_from(_bci) = Bytecodes::_breakpoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 method->incr_number_of_breakpoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 SystemDictionary::notice_modification();
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 // Deoptimize all dependents on this method
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 methodHandle mh(thread, method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 Universe::flush_dependents_on_method(mh);
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1630
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1631 void BreakpointInfo::clear(Method* method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 *method->bcp_from(_bci) = orig_bytecode();
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 assert(method->number_of_breakpoints() > 0, "must not go negative");
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 method->decr_number_of_breakpoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1636
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1637 // jmethodID handling
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1638
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1639 // This is a block allocating object, sort of like JNIHandleBlock, only a
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1640 // lot simpler. There aren't many of these, they aren't long, they are rarely
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1641 // deleted and so we can do some suboptimal things.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1642 // It's allocated on the CHeap because once we allocate a jmethodID, we can
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1643 // never get rid of it.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1644 // It would be nice to be able to parameterize the number of methods for
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1645 // the null_class_loader but then we'd have to turn this and ClassLoaderData
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1646 // into templates.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1647
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1648 // I feel like this brain dead class should exist somewhere in the STL
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1649
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1650 class JNIMethodBlock : public CHeapObj<mtClass> {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1651 enum { number_of_methods = 8 };
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1652
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1653 Method* _methods[number_of_methods];
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1654 int _top;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1655 JNIMethodBlock* _next;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1656 public:
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1657 static Method* const _free_method;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1658
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1659 JNIMethodBlock() : _next(NULL), _top(0) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1660 for (int i = 0; i< number_of_methods; i++) _methods[i] = _free_method;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1661 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1662
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1663 Method** add_method(Method* m) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1664 if (_top < number_of_methods) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1665 // top points to the next free entry.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1666 int i = _top;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1667 _methods[i] = m;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1668 _top++;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1669 return &_methods[i];
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1670 } else if (_top == number_of_methods) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1671 // if the next free entry ran off the block see if there's a free entry
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1672 for (int i = 0; i< number_of_methods; i++) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1673 if (_methods[i] == _free_method) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1674 _methods[i] = m;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1675 return &_methods[i];
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1676 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1677 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1678 // Only check each block once for frees. They're very unlikely.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1679 // Increment top past the end of the block.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1680 _top++;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1681 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1682 // need to allocate a next block.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1683 if (_next == NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1684 _next = new JNIMethodBlock();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1685 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1686 return _next->add_method(m);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1687 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1688
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1689 bool contains(Method** m) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1690 for (JNIMethodBlock* b = this; b != NULL; b = b->_next) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1691 for (int i = 0; i< number_of_methods; i++) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1692 if (&(b->_methods[i]) == m) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1693 return true;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1694 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1695 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1696 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1697 return false; // not found
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1698 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1699
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1700 // Doesn't really destroy it, just marks it as free so it can be reused.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1701 void destroy_method(Method** m) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1702 #ifdef ASSERT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1703 assert(contains(m), "should be a methodID");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1704 #endif // ASSERT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1705 *m = _free_method;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1706 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1707
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1708 // During class unloading the methods are cleared, which is different
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1709 // than freed.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1710 void clear_all_methods() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1711 for (JNIMethodBlock* b = this; b != NULL; b = b->_next) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1712 for (int i = 0; i< number_of_methods; i++) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1713 _methods[i] = NULL;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1714 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1715 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1716 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1717 #ifndef PRODUCT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1718 int count_methods() {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1719 // count all allocated methods
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1720 int count = 0;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1721 for (JNIMethodBlock* b = this; b != NULL; b = b->_next) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1722 for (int i = 0; i< number_of_methods; i++) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1723 if (_methods[i] != _free_method) count++;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1724 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1725 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1726 return count;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1727 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1728 #endif // PRODUCT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1729 };
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1730
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1731 // Something that can't be mistaken for an address or a markOop
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1732 Method* const JNIMethodBlock::_free_method = (Method*)55;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1733
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1734 // Add a method id to the jmethod_ids
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1735 jmethodID Method::make_jmethod_id(ClassLoaderData* loader_data, Method* m) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1736 ClassLoaderData* cld = loader_data;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1737
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1738 if (!SafepointSynchronize::is_at_safepoint()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1739 // Have to add jmethod_ids() to class loader data thread-safely.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1740 // Also have to add the method to the list safely, which the cld lock
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1741 // protects as well.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1742 MutexLockerEx ml(cld->metaspace_lock(), Mutex::_no_safepoint_check_flag);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1743 if (cld->jmethod_ids() == NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1744 cld->set_jmethod_ids(new JNIMethodBlock());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1745 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1746 // jmethodID is a pointer to Method*
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1747 return (jmethodID)cld->jmethod_ids()->add_method(m);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1748 } else {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1749 // At safepoint, we are single threaded and can set this.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1750 if (cld->jmethod_ids() == NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1751 cld->set_jmethod_ids(new JNIMethodBlock());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1752 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1753 // jmethodID is a pointer to Method*
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1754 return (jmethodID)cld->jmethod_ids()->add_method(m);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1755 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1756 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1757
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1758 // Mark a jmethodID as free. This is called when there is a data race in
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1759 // InstanceKlass while creating the jmethodID cache.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1760 void Method::destroy_jmethod_id(ClassLoaderData* loader_data, jmethodID m) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1761 ClassLoaderData* cld = loader_data;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1762 Method** ptr = (Method**)m;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1763 assert(cld->jmethod_ids() != NULL, "should have method handles");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1764 cld->jmethod_ids()->destroy_method(ptr);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1765 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1766
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1767 void Method::change_method_associated_with_jmethod_id(jmethodID jmid, Method* new_method) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1768 // Can't assert the method_holder is the same because the new method has the
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1769 // scratch method holder.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1770 assert(resolve_jmethod_id(jmid)->method_holder()->class_loader()
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1771 == new_method->method_holder()->class_loader(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1772 "changing to a different class loader");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1773 // Just change the method in place, jmethodID pointer doesn't change.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1774 *((Method**)jmid) = new_method;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1775 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1776
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1777 bool Method::is_method_id(jmethodID mid) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1778 Method* m = resolve_jmethod_id(mid);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1779 assert(m != NULL, "should be called with non-null method");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1780 InstanceKlass* ik = InstanceKlass::cast(m->method_holder());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1781 ClassLoaderData* cld = ik->class_loader_data();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1782 if (cld->jmethod_ids() == NULL) return false;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1783 return (cld->jmethod_ids()->contains((Method**)mid));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1784 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1785
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1786 Method* Method::checked_resolve_jmethod_id(jmethodID mid) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1787 if (mid == NULL) return NULL;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1788 Method* o = resolve_jmethod_id(mid);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1789 if (o == NULL || o == JNIMethodBlock::_free_method || !((Metadata*)o)->is_method()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1790 return NULL;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1791 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1792 return o;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1793 };
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1794
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1795 void Method::set_on_stack(const bool value) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1796 // Set both the method itself and its constant pool. The constant pool
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1797 // on stack means some method referring to it is also on the stack.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1798 _access_flags.set_on_stack(value);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1799 constants()->set_on_stack(value);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1800 if (value) MetadataOnStackMark::record(this);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1801 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1802
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1803 // Called when the class loader is unloaded to make all methods weak.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1804 void Method::clear_jmethod_ids(ClassLoaderData* loader_data) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1805 loader_data->jmethod_ids()->clear_all_methods();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1806 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1807
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1808 #ifndef PRODUCT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1809 void Method::print_jmethod_ids(ClassLoaderData* loader_data, outputStream* out) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1810 out->print_cr("jni_method_id count = %d", loader_data->jmethod_ids()->count_methods());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1811 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1812 #endif // PRODUCT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1813
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1814
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1815 // Printing
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1816
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1817 #ifndef PRODUCT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1818
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1819 void Method::print_on(outputStream* st) const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1820 ResourceMark rm;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1821 assert(is_method(), "must be method");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1822 st->print_cr(internal_name());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1823 // get the effect of PrintOopAddress, always, for methods:
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1824 st->print_cr(" - this oop: "INTPTR_FORMAT, (intptr_t)this);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1825 st->print (" - method holder: "); method_holder()->print_value_on(st); st->cr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1826 st->print (" - constants: "INTPTR_FORMAT" ", (address)constants());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1827 constants()->print_value_on(st); st->cr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1828 st->print (" - access: 0x%x ", access_flags().as_int()); access_flags().print_on(st); st->cr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1829 st->print (" - name: "); name()->print_value_on(st); st->cr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1830 st->print (" - signature: "); signature()->print_value_on(st); st->cr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1831 st->print_cr(" - max stack: %d", max_stack());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1832 st->print_cr(" - max locals: %d", max_locals());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1833 st->print_cr(" - size of params: %d", size_of_parameters());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1834 st->print_cr(" - method size: %d", method_size());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1835 if (intrinsic_id() != vmIntrinsics::_none)
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1836 st->print_cr(" - intrinsic id: %d %s", intrinsic_id(), vmIntrinsics::name_at(intrinsic_id()));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1837 if (highest_comp_level() != CompLevel_none)
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1838 st->print_cr(" - highest level: %d", highest_comp_level());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1839 st->print_cr(" - vtable index: %d", _vtable_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1840 st->print_cr(" - i2i entry: " INTPTR_FORMAT, interpreter_entry());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1841 st->print( " - adapters: ");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1842 AdapterHandlerEntry* a = ((Method*)this)->adapter();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1843 if (a == NULL)
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1844 st->print_cr(INTPTR_FORMAT, a);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1845 else
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1846 a->print_adapter_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1847 st->print_cr(" - compiled entry " INTPTR_FORMAT, from_compiled_entry());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1848 st->print_cr(" - code size: %d", code_size());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1849 if (code_size() != 0) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1850 st->print_cr(" - code start: " INTPTR_FORMAT, code_base());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1851 st->print_cr(" - code end (excl): " INTPTR_FORMAT, code_base() + code_size());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1852 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1853 if (method_data() != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1854 st->print_cr(" - method data: " INTPTR_FORMAT, (address)method_data());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1855 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1856 st->print_cr(" - checked ex length: %d", checked_exceptions_length());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1857 if (checked_exceptions_length() > 0) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1858 CheckedExceptionElement* table = checked_exceptions_start();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1859 st->print_cr(" - checked ex start: " INTPTR_FORMAT, table);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1860 if (Verbose) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1861 for (int i = 0; i < checked_exceptions_length(); i++) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1862 st->print_cr(" - throws %s", constants()->printable_name_at(table[i].class_cp_index));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1863 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1864 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1865 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1866 if (has_linenumber_table()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1867 u_char* table = compressed_linenumber_table();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1868 st->print_cr(" - linenumber start: " INTPTR_FORMAT, table);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1869 if (Verbose) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1870 CompressedLineNumberReadStream stream(table);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1871 while (stream.read_pair()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1872 st->print_cr(" - line %d: %d", stream.line(), stream.bci());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1873 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1874 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1875 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1876 st->print_cr(" - localvar length: %d", localvariable_table_length());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1877 if (localvariable_table_length() > 0) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1878 LocalVariableTableElement* table = localvariable_table_start();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1879 st->print_cr(" - localvar start: " INTPTR_FORMAT, table);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1880 if (Verbose) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1881 for (int i = 0; i < localvariable_table_length(); i++) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1882 int bci = table[i].start_bci;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1883 int len = table[i].length;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1884 const char* name = constants()->printable_name_at(table[i].name_cp_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1885 const char* desc = constants()->printable_name_at(table[i].descriptor_cp_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1886 int slot = table[i].slot;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1887 st->print_cr(" - %s %s bci=%d len=%d slot=%d", desc, name, bci, len, slot);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1888 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1889 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1890 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1891 if (code() != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1892 st->print (" - compiled code: ");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1893 code()->print_value_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1894 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1895 if (is_native()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1896 st->print_cr(" - native function: " INTPTR_FORMAT, native_function());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1897 st->print_cr(" - signature handler: " INTPTR_FORMAT, signature_handler());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1898 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1899 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1900
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1901 #endif //PRODUCT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1902
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1903 void Method::print_value_on(outputStream* st) const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1904 assert(is_method(), "must be method");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1905 st->print_cr(internal_name());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1906 print_address_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1907 st->print(" ");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1908 name()->print_value_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1909 st->print(" ");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1910 signature()->print_value_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1911 st->print(" in ");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1912 method_holder()->print_value_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1913 if (WizardMode) st->print("[%d,%d]", size_of_parameters(), max_locals());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1914 if (WizardMode && code() != NULL) st->print(" ((nmethod*)%p)", code());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1915 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1916
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1917
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1918 // Verification
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1919
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1920 void Method::verify_on(outputStream* st) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1921 guarantee(is_method(), "object must be method");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1922 guarantee(is_metadata(), "should be metadata");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1923 guarantee(constants()->is_constantPool(), "should be constant pool");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1924 guarantee(constants()->is_metadata(), "should be metadata");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1925 guarantee(constMethod()->is_constMethod(), "should be ConstMethod*");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1926 guarantee(constMethod()->is_metadata(), "should be metadata");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1927 MethodData* md = method_data();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1928 guarantee(md == NULL ||
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1929 md->is_metadata(), "should be in permspace");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1930 guarantee(md == NULL ||
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1931 md->is_methodData(), "should be method data");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6267
diff changeset
1932 }