Mercurial > hg > graal-compiler
annotate src/share/vm/oops/cpCache.cpp @ 10185:d50cc62e94ff
8012715: G1: GraphKit accesses PtrQueue::_index as int but is size_t
Summary: In graphKit INT operations were generated to access PtrQueue::_index which has type size_t. This is 64 bit on 64-bit machines. No problems occur on little endian machines as long as the index fits into 32 bit, but on big endian machines the upper part is read, which is zero. This leads to unnecessary branches to the slow path in the runtime.
Reviewed-by: twisti, johnc
Contributed-by: Martin Doerr <martin.doerr@sap.com>
author | johnc |
---|---|
date | Wed, 24 Apr 2013 14:48:43 -0700 |
parents | 3efdfd6ddbf2 |
children | c115fac239eb |
rev | line source |
---|---|
0 | 1 /* |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
2 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
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:
1507
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "gc_implementation/shared/markSweep.inline.hpp" | |
27 #include "interpreter/interpreter.hpp" | |
28 #include "interpreter/rewriter.hpp" | |
29 #include "memory/universe.inline.hpp" | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
30 #include "oops/cpCache.hpp" |
1972 | 31 #include "oops/objArrayOop.hpp" |
32 #include "oops/oop.inline.hpp" | |
33 #include "prims/jvmtiRedefineClassesTrace.hpp" | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
34 #include "prims/methodHandles.hpp" |
1972 | 35 #include "runtime/handles.inline.hpp" |
8001
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
6985
diff
changeset
|
36 #include "utilities/macros.hpp" |
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
6985
diff
changeset
|
37 #if INCLUDE_ALL_GCS |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
38 # include "gc_implementation/parallelScavenge/psPromotionManager.hpp" |
8001
db9981fd3124
8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents:
6985
diff
changeset
|
39 #endif // INCLUDE_ALL_GCS |
0 | 40 |
41 | |
42 // Implememtation of ConstantPoolCacheEntry | |
43 | |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
844
diff
changeset
|
44 void ConstantPoolCacheEntry::initialize_entry(int index) { |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
196
diff
changeset
|
45 assert(0 < index && index < 0x10000, "sanity check"); |
0 | 46 _indices = index; |
8712
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8025
diff
changeset
|
47 _f1 = NULL; |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8025
diff
changeset
|
48 _f2 = _flags = 0; |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
196
diff
changeset
|
49 assert(constant_pool_index() == index, ""); |
0 | 50 } |
51 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
52 int ConstantPoolCacheEntry::make_flags(TosState state, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
53 int option_bits, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
54 int field_index_or_method_params) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
55 assert(state < number_of_states, "Invalid state in make_flags"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
56 int f = ((int)state << tos_state_shift) | option_bits | field_index_or_method_params; |
0 | 57 // Preserve existing flag bit values |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
58 // The low bits are a field offset, or else the method parameter size. |
0 | 59 #ifdef ASSERT |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
60 TosState old_state = flag_state(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
61 assert(old_state == (TosState)0 || old_state == state, |
0 | 62 "inconsistent cpCache flags state"); |
63 #endif | |
64 return (_flags | f) ; | |
65 } | |
66 | |
67 void ConstantPoolCacheEntry::set_bytecode_1(Bytecodes::Code code) { | |
68 #ifdef ASSERT | |
69 // Read once. | |
70 volatile Bytecodes::Code c = bytecode_1(); | |
71 assert(c == 0 || c == code || code == 0, "update must be consistent"); | |
72 #endif | |
73 // Need to flush pending stores here before bytecode is written. | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
74 OrderAccess::release_store_ptr(&_indices, _indices | ((u_char)code << bytecode_1_shift)); |
0 | 75 } |
76 | |
77 void ConstantPoolCacheEntry::set_bytecode_2(Bytecodes::Code code) { | |
78 #ifdef ASSERT | |
79 // Read once. | |
80 volatile Bytecodes::Code c = bytecode_2(); | |
81 assert(c == 0 || c == code || code == 0, "update must be consistent"); | |
82 #endif | |
83 // Need to flush pending stores here before bytecode is written. | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
84 OrderAccess::release_store_ptr(&_indices, _indices | ((u_char)code << bytecode_2_shift)); |
0 | 85 } |
86 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
87 // Sets f1, ordering with previous writes. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
88 void ConstantPoolCacheEntry::release_set_f1(Metadata* f1) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
89 assert(f1 != NULL, ""); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
90 OrderAccess::release_store_ptr((HeapWord*) &_f1, f1); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
91 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
92 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
93 // Sets flags, but only if the value was previously zero. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
94 bool ConstantPoolCacheEntry::init_flags_atomic(intptr_t flags) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
95 intptr_t result = Atomic::cmpxchg_ptr(flags, &_flags, 0); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
96 return (result == 0); |
2246
fbf3184da15d
7012339: JSR 292 crash in G1SATBCardTableModRefBS::write_ref_field_pre_work()
twisti
parents:
1972
diff
changeset
|
97 } |
1903 | 98 |
0 | 99 // Note that concurrent update of both bytecodes can leave one of them |
100 // reset to zero. This is harmless; the interpreter will simply re-resolve | |
101 // the damaged entry. More seriously, the memory synchronization is needed | |
102 // to flush other fields (f1, f2) completely to memory before the bytecodes | |
103 // are updated, lest other processors see a non-zero bytecode but zero f1/f2. | |
104 void ConstantPoolCacheEntry::set_field(Bytecodes::Code get_code, | |
105 Bytecodes::Code put_code, | |
106 KlassHandle field_holder, | |
3938 | 107 int field_index, |
0 | 108 int field_offset, |
109 TosState field_type, | |
110 bool is_final, | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
111 bool is_volatile, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
112 Klass* root_klass) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
113 set_f1(field_holder()); |
0 | 114 set_f2(field_offset); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
115 assert((field_index & field_index_mask) == field_index, |
0 | 116 "field index does not fit in low flag bits"); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
117 set_field_flags(field_type, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
118 ((is_volatile ? 1 : 0) << is_volatile_shift) | |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
119 ((is_final ? 1 : 0) << is_final_shift), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
120 field_index); |
0 | 121 set_bytecode_1(get_code); |
122 set_bytecode_2(put_code); | |
123 NOT_PRODUCT(verify(tty)); | |
124 } | |
125 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
126 void ConstantPoolCacheEntry::set_parameter_size(int value) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
127 // This routine is called only in corner cases where the CPCE is not yet initialized. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
128 // See AbstractInterpreter::deopt_continue_after_entry. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
129 assert(_flags == 0 || parameter_size() == 0 || parameter_size() == value, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
130 err_msg("size must not change: parameter_size=%d, value=%d", parameter_size(), value)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
131 // Setting the parameter size by itself is only safe if the |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
132 // current value of _flags is 0, otherwise another thread may have |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
133 // updated it and we don't want to overwrite that value. Don't |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
134 // bother trying to update it once it's nonzero but always make |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
135 // sure that the final parameter size agrees with what was passed. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
136 if (_flags == 0) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
137 Atomic::cmpxchg_ptr((value & parameter_size_mask), &_flags, 0); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
138 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
139 guarantee(parameter_size() == value, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
140 err_msg("size must not change: parameter_size=%d, value=%d", parameter_size(), value)); |
0 | 141 } |
142 | |
143 void ConstantPoolCacheEntry::set_method(Bytecodes::Code invoke_code, | |
144 methodHandle method, | |
145 int vtable_index) { | |
146 assert(method->interpreter_entry() != NULL, "should have been set at this point"); | |
147 assert(!method->is_obsolete(), "attempt to write obsolete method to cpCache"); | |
148 | |
149 int byte_no = -1; | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
150 bool change_to_virtual = false; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
151 |
0 | 152 switch (invoke_code) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
153 case Bytecodes::_invokeinterface: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
154 // We get here from InterpreterRuntime::resolve_invoke when an invokeinterface |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
155 // instruction somehow links to a non-interface method (in Object). |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
156 // In that case, the method has no itable index and must be invoked as a virtual. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
157 // Set a flag to keep track of this corner case. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
158 change_to_virtual = true; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
159 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
160 // ...and fall through as if we were handling invokevirtual: |
0 | 161 case Bytecodes::_invokevirtual: |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
162 { |
0 | 163 if (method->can_be_statically_bound()) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
164 // set_f2_as_vfinal_method checks if is_vfinal flag is true. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
165 set_method_flags(as_TosState(method->result_type()), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
166 ( 1 << is_vfinal_shift) | |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
167 ((method->is_final_method() ? 1 : 0) << is_final_shift) | |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
168 ((change_to_virtual ? 1 : 0) << is_forced_virtual_shift), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
169 method()->size_of_parameters()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
170 set_f2_as_vfinal_method(method()); |
0 | 171 } else { |
172 assert(vtable_index >= 0, "valid index"); | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
173 assert(!method->is_final_method(), "sanity"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
174 set_method_flags(as_TosState(method->result_type()), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
175 ((change_to_virtual ? 1 : 0) << is_forced_virtual_shift), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
176 method()->size_of_parameters()); |
0 | 177 set_f2(vtable_index); |
178 } | |
179 byte_no = 2; | |
180 break; | |
1660
083fde3b838e
6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents:
1552
diff
changeset
|
181 } |
083fde3b838e
6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents:
1552
diff
changeset
|
182 |
0 | 183 case Bytecodes::_invokespecial: |
184 case Bytecodes::_invokestatic: | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
185 // Note: Read and preserve the value of the is_vfinal flag on any |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
186 // invokevirtual bytecode shared with this constant pool cache entry. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
187 // It is cheap and safe to consult is_vfinal() at all times. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
188 // Once is_vfinal is set, it must stay that way, lest we get a dangling oop. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
189 set_method_flags(as_TosState(method->result_type()), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
190 ((is_vfinal() ? 1 : 0) << is_vfinal_shift) | |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
191 ((method->is_final_method() ? 1 : 0) << is_final_shift), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
192 method()->size_of_parameters()); |
0 | 193 set_f1(method()); |
194 byte_no = 1; | |
195 break; | |
196 default: | |
197 ShouldNotReachHere(); | |
198 break; | |
199 } | |
200 | |
201 // Note: byte_no also appears in TemplateTable::resolve. | |
202 if (byte_no == 1) { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
203 assert(invoke_code != Bytecodes::_invokevirtual && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
204 invoke_code != Bytecodes::_invokeinterface, ""); |
0 | 205 set_bytecode_1(invoke_code); |
206 } else if (byte_no == 2) { | |
207 if (change_to_virtual) { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
208 assert(invoke_code == Bytecodes::_invokeinterface, ""); |
0 | 209 // NOTE: THIS IS A HACK - BE VERY CAREFUL!!! |
210 // | |
211 // Workaround for the case where we encounter an invokeinterface, but we | |
212 // should really have an _invokevirtual since the resolved method is a | |
213 // virtual method in java.lang.Object. This is a corner case in the spec | |
214 // but is presumably legal. javac does not generate this code. | |
215 // | |
216 // We set bytecode_1() to _invokeinterface, because that is the | |
217 // bytecode # used by the interpreter to see if it is resolved. | |
218 // We set bytecode_2() to _invokevirtual. | |
219 // See also interpreterRuntime.cpp. (8/25/2000) | |
220 // Only set resolved for the invokeinterface case if method is public. | |
221 // Otherwise, the method needs to be reresolved with caller for each | |
222 // interface call. | |
223 if (method->is_public()) set_bytecode_1(invoke_code); | |
224 } else { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
225 assert(invoke_code == Bytecodes::_invokevirtual, ""); |
0 | 226 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
227 // set up for invokevirtual, even if linking for invokeinterface also: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
228 set_bytecode_2(Bytecodes::_invokevirtual); |
0 | 229 } else { |
230 ShouldNotReachHere(); | |
231 } | |
232 NOT_PRODUCT(verify(tty)); | |
233 } | |
234 | |
235 | |
236 void ConstantPoolCacheEntry::set_interface_call(methodHandle method, int index) { | |
6940
18fb7da42534
8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents:
6822
diff
changeset
|
237 InstanceKlass* interf = method->method_holder(); |
18fb7da42534
8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents:
6822
diff
changeset
|
238 assert(interf->is_interface(), "must be an interface"); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
239 assert(!method->is_final_method(), "interfaces do not have final methods; cannot link to one here"); |
0 | 240 set_f1(interf); |
241 set_f2(index); | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
242 set_method_flags(as_TosState(method->result_type()), |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
243 0, // no option bits |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
244 method()->size_of_parameters()); |
0 | 245 set_bytecode_1(Bytecodes::_invokeinterface); |
246 } | |
247 | |
248 | |
6942
64672b22ef05
8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents:
6822
diff
changeset
|
249 void ConstantPoolCacheEntry::set_method_handle(constantPoolHandle cpool, const CallInfo &call_info) { |
64672b22ef05
8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents:
6822
diff
changeset
|
250 set_method_handle_common(cpool, Bytecodes::_invokehandle, call_info); |
1660
083fde3b838e
6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents:
1552
diff
changeset
|
251 } |
083fde3b838e
6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents:
1552
diff
changeset
|
252 |
6942
64672b22ef05
8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents:
6822
diff
changeset
|
253 void ConstantPoolCacheEntry::set_dynamic_call(constantPoolHandle cpool, const CallInfo &call_info) { |
64672b22ef05
8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents:
6822
diff
changeset
|
254 set_method_handle_common(cpool, Bytecodes::_invokedynamic, call_info); |
1660
083fde3b838e
6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents:
1552
diff
changeset
|
255 } |
083fde3b838e
6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents:
1552
diff
changeset
|
256 |
6737
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
257 void ConstantPoolCacheEntry::set_method_handle_common(constantPoolHandle cpool, |
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
258 Bytecodes::Code invoke_code, |
6942
64672b22ef05
8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents:
6822
diff
changeset
|
259 const CallInfo &call_info) { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
260 // NOTE: This CPCE can be the subject of data races. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
261 // There are three words to update: flags, refs[f2], f1 (in that order). |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
262 // Writers must store all other values before f1. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
263 // Readers must test f1 first for non-null before reading other fields. |
6737
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
264 // Competing writers must acquire exclusive access via a lock. |
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
265 // A losing writer waits on the lock until the winner writes f1 and leaves |
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
266 // the lock, so that when the losing writer returns, he can use the linked |
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
267 // cache entry. |
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
268 |
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
269 MonitorLockerEx ml(cpool->lock()); |
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
270 if (!is_f1_null()) { |
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
271 return; |
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
272 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
273 |
6942
64672b22ef05
8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents:
6822
diff
changeset
|
274 const methodHandle adapter = call_info.resolved_method(); |
64672b22ef05
8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents:
6822
diff
changeset
|
275 const Handle appendix = call_info.resolved_appendix(); |
64672b22ef05
8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents:
6822
diff
changeset
|
276 const Handle method_type = call_info.resolved_method_type(); |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
277 const bool has_appendix = appendix.not_null(); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
278 const bool has_method_type = method_type.not_null(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
279 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
280 // Write the flags. |
6737
4bfe8b33cf66
7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed
twisti
parents:
6725
diff
changeset
|
281 set_method_flags(as_TosState(adapter->result_type()), |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
282 ((has_appendix ? 1 : 0) << has_appendix_shift ) | |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
283 ((has_method_type ? 1 : 0) << has_method_type_shift) | |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
284 ( 1 << is_final_shift ), |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
285 adapter->size_of_parameters()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
286 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
287 if (TraceInvokeDynamic) { |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
288 tty->print_cr("set_method_handle bc=%d appendix="PTR_FORMAT"%s method_type="PTR_FORMAT"%s method="PTR_FORMAT" ", |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
289 invoke_code, |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
290 (intptr_t)appendix(), (has_appendix ? "" : " (unused)"), |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
291 (intptr_t)method_type(), (has_method_type ? "" : " (unused)"), |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
292 (intptr_t)adapter()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
293 adapter->print(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
294 if (has_appendix) appendix()->print(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
295 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
296 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
297 // Method handle invokes and invokedynamic sites use both cp cache words. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
298 // refs[f2], if not null, contains a value passed as a trailing argument to the adapter. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
299 // In the general case, this could be the call site's MethodType, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
300 // for use with java.lang.Invokers.checkExactType, or else a CallSite object. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
301 // f1 contains the adapter method which manages the actual call. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
302 // In the general case, this is a compiled LambdaForm. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
303 // (The Java code is free to optimize these calls by binding other |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
304 // sorts of methods and appendices to call sites.) |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
305 // JVM-level linking is via f1, as if for invokespecial, and signatures are erased. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
306 // The appendix argument (if any) is added to the signature, and is counted in the parameter_size bits. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
307 // Even with the appendix, the method will never take more than 255 parameter slots. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
308 // |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
309 // This means that given a call site like (List)mh.invoke("foo"), |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
310 // the f1 method has signature '(Ljl/Object;Ljl/invoke/MethodType;)Ljl/Object;', |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
311 // not '(Ljava/lang/String;)Ljava/util/List;'. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
312 // The fact that String and List are involved is encoded in the MethodType in refs[f2]. |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
313 // This allows us to create fewer method oops, while keeping type safety. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
314 // |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
315 |
6942
64672b22ef05
8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents:
6822
diff
changeset
|
316 objArrayHandle resolved_references = cpool->resolved_references(); |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
317 // Store appendix, if any. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
318 if (has_appendix) { |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
319 const int appendix_index = f2_as_index() + _indy_resolved_references_appendix_offset; |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
320 assert(appendix_index >= 0 && appendix_index < resolved_references->length(), "oob"); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
321 assert(resolved_references->obj_at(appendix_index) == NULL, "init just once"); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
322 resolved_references->obj_at_put(appendix_index, appendix()); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
323 } |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
324 |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
325 // Store MethodType, if any. |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
326 if (has_method_type) { |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
327 const int method_type_index = f2_as_index() + _indy_resolved_references_method_type_offset; |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
328 assert(method_type_index >= 0 && method_type_index < resolved_references->length(), "oob"); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
329 assert(resolved_references->obj_at(method_type_index) == NULL, "init just once"); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
330 resolved_references->obj_at_put(method_type_index, method_type()); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
331 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
332 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
333 release_set_f1(adapter()); // This must be the last one to set (see NOTE above)! |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
334 |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
335 // The interpreter assembly code does not check byte_2, |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
336 // but it is used by is_resolved, method_if_resolved, etc. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
337 set_bytecode_1(invoke_code); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
338 NOT_PRODUCT(verify(tty)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
339 if (TraceInvokeDynamic) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
340 this->print(tty, 0); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
341 } |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
196
diff
changeset
|
342 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
196
diff
changeset
|
343 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
344 Method* ConstantPoolCacheEntry::method_if_resolved(constantPoolHandle cpool) { |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
345 // Decode the action of set_method and set_interface_call |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
346 Bytecodes::Code invoke_code = bytecode_1(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
347 if (invoke_code != (Bytecodes::Code)0) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
348 Metadata* f1 = (Metadata*)_f1; |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
349 if (f1 != NULL) { |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
350 switch (invoke_code) { |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
351 case Bytecodes::_invokeinterface: |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
352 assert(f1->is_klass(), ""); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
353 return klassItable::method_for_itable_index((Klass*)f1, f2_as_index()); |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
354 case Bytecodes::_invokestatic: |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
355 case Bytecodes::_invokespecial: |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
356 assert(!has_appendix(), ""); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
357 case Bytecodes::_invokehandle: |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
358 case Bytecodes::_invokedynamic: |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
359 assert(f1->is_method(), ""); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
360 return (Method*)f1; |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
361 } |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
362 } |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
363 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
364 invoke_code = bytecode_2(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
365 if (invoke_code != (Bytecodes::Code)0) { |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
366 switch (invoke_code) { |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
367 case Bytecodes::_invokevirtual: |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
368 if (is_vfinal()) { |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
369 // invokevirtual |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
370 Method* m = f2_as_vfinal_method(); |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
371 assert(m->is_method(), ""); |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
372 return m; |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
373 } else { |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
374 int holder_index = cpool->uncached_klass_ref_index_at(constant_pool_index()); |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
375 if (cpool->tag_at(holder_index).is_klass()) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
376 Klass* klass = cpool->resolved_klass_at(holder_index); |
6983 | 377 if (!klass->oop_is_instance()) |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
378 klass = SystemDictionary::Object_klass(); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
379 return InstanceKlass::cast(klass)->method_at_vtable(f2_as_index()); |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
380 } |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
381 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
382 break; |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
383 } |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
384 } |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
385 return NULL; |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
386 } |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
387 |
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
3279
diff
changeset
|
388 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
389 oop ConstantPoolCacheEntry::appendix_if_resolved(constantPoolHandle cpool) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
390 if (is_f1_null() || !has_appendix()) |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
391 return NULL; |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
392 const int ref_index = f2_as_index() + _indy_resolved_references_appendix_offset; |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
393 objArrayOop resolved_references = cpool->resolved_references(); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
394 return resolved_references->obj_at(ref_index); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
395 } |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
396 |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
397 |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
398 oop ConstantPoolCacheEntry::method_type_if_resolved(constantPoolHandle cpool) { |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
399 if (is_f1_null() || !has_method_type()) |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
400 return NULL; |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
401 const int ref_index = f2_as_index() + _indy_resolved_references_method_type_offset; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
402 objArrayOop resolved_references = cpool->resolved_references(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
403 return resolved_references->obj_at(ref_index); |
0 | 404 } |
405 | |
406 | |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
407 #if INCLUDE_JVMTI |
0 | 408 // RedefineClasses() API support: |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
409 // If this ConstantPoolCacheEntry refers to old_method then update it |
0 | 410 // to refer to new_method. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
411 bool ConstantPoolCacheEntry::adjust_method_entry(Method* old_method, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
412 Method* new_method, bool * trace_name_printed) { |
0 | 413 |
414 if (is_vfinal()) { | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
415 // virtual and final so _f2 contains method ptr instead of vtable index |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
416 if (f2_as_vfinal_method() == old_method) { |
0 | 417 // match old_method so need an update |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
418 // NOTE: can't use set_f2_as_vfinal_method as it asserts on different values |
0 | 419 _f2 = (intptr_t)new_method; |
420 if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) { | |
421 if (!(*trace_name_printed)) { | |
422 // RC_TRACE_MESG macro has an embedded ResourceMark | |
423 RC_TRACE_MESG(("adjust: name=%s", | |
6940
18fb7da42534
8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents:
6822
diff
changeset
|
424 old_method->method_holder()->external_name())); |
0 | 425 *trace_name_printed = true; |
426 } | |
427 // RC_TRACE macro has an embedded ResourceMark | |
428 RC_TRACE(0x00400000, ("cpc vf-entry update: %s(%s)", | |
429 new_method->name()->as_C_string(), | |
430 new_method->signature()->as_C_string())); | |
431 } | |
432 | |
433 return true; | |
434 } | |
435 | |
436 // f1() is not used with virtual entries so bail out | |
437 return false; | |
438 } | |
439 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
440 if (_f1 == NULL) { |
0 | 441 // NULL f1() means this is a virtual entry so bail out |
442 // We are assuming that the vtable index does not need change. | |
443 return false; | |
444 } | |
445 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
446 if (_f1 == old_method) { |
0 | 447 _f1 = new_method; |
448 if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) { | |
449 if (!(*trace_name_printed)) { | |
450 // RC_TRACE_MESG macro has an embedded ResourceMark | |
451 RC_TRACE_MESG(("adjust: name=%s", | |
6940
18fb7da42534
8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents:
6822
diff
changeset
|
452 old_method->method_holder()->external_name())); |
0 | 453 *trace_name_printed = true; |
454 } | |
455 // RC_TRACE macro has an embedded ResourceMark | |
456 RC_TRACE(0x00400000, ("cpc entry update: %s(%s)", | |
457 new_method->name()->as_C_string(), | |
458 new_method->signature()->as_C_string())); | |
459 } | |
460 | |
461 return true; | |
462 } | |
463 | |
464 return false; | |
465 } | |
466 | |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
467 // a constant pool cache entry should never contain old or obsolete methods |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
468 bool ConstantPoolCacheEntry::check_no_old_or_obsolete_entries() { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
469 if (is_vfinal()) { |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
470 // virtual and final so _f2 contains method ptr instead of vtable index |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
471 Metadata* f2 = (Metadata*)_f2; |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
472 // Return false if _f2 refers to an old or an obsolete method. |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
473 // _f2 == NULL || !_f2->is_method() are just as unexpected here. |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
474 return (f2 != NULL NOT_PRODUCT(&& f2->is_valid()) && f2->is_method() && |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
475 !((Method*)f2)->is_old() && !((Method*)f2)->is_obsolete()); |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
476 } else if (_f1 == NULL || |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
477 (NOT_PRODUCT(_f1->is_valid() &&) !_f1->is_method())) { |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
478 // _f1 == NULL || !_f1->is_method() are OK here |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
479 return true; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
480 } |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
481 // return false if _f1 refers to an old or an obsolete method |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
482 return (NOT_PRODUCT(_f1->is_valid() &&) _f1->is_method() && |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
483 !((Method*)_f1)->is_old() && !((Method*)_f1)->is_obsolete()); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
484 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
485 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
486 bool ConstantPoolCacheEntry::is_interesting_method_entry(Klass* k) { |
0 | 487 if (!is_method_entry()) { |
488 // not a method entry so not interesting by default | |
489 return false; | |
490 } | |
491 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
492 Method* m = NULL; |
0 | 493 if (is_vfinal()) { |
494 // virtual and final so _f2 contains method ptr instead of vtable index | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
495 m = f2_as_vfinal_method(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
496 } else if (is_f1_null()) { |
0 | 497 // NULL _f1 means this is a virtual entry so also not interesting |
498 return false; | |
499 } else { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
500 if (!(_f1->is_method())) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
501 // _f1 can also contain a Klass* for an interface |
0 | 502 return false; |
503 } | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
5898
diff
changeset
|
504 m = f1_as_method(); |
0 | 505 } |
506 | |
507 assert(m != NULL && m->is_method(), "sanity check"); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
508 if (m == NULL || !m->is_method() || (k != NULL && m->method_holder() != k)) { |
0 | 509 // robustness for above sanity checks or method is not in |
510 // the interesting class | |
511 return false; | |
512 } | |
513 | |
514 // the method is in the interesting class so the entry is interesting | |
515 return true; | |
516 } | |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
517 #endif // INCLUDE_JVMTI |
0 | 518 |
519 void ConstantPoolCacheEntry::print(outputStream* st, int index) const { | |
520 // print separator | |
5898
f096e1b74d85
7148126: ConstantPoolCacheEntry::print prints to wrong stream
dholmes
parents:
3938
diff
changeset
|
521 if (index == 0) st->print_cr(" -------------"); |
0 | 522 // print entry |
5898
f096e1b74d85
7148126: ConstantPoolCacheEntry::print prints to wrong stream
dholmes
parents:
3938
diff
changeset
|
523 st->print("%3d ("PTR_FORMAT") ", index, (intptr_t)this); |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
524 st->print_cr("[%02x|%02x|%5d]", bytecode_2(), bytecode_1(), |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
525 constant_pool_index()); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
526 st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f1); |
5898
f096e1b74d85
7148126: ConstantPoolCacheEntry::print prints to wrong stream
dholmes
parents:
3938
diff
changeset
|
527 st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f2); |
f096e1b74d85
7148126: ConstantPoolCacheEntry::print prints to wrong stream
dholmes
parents:
3938
diff
changeset
|
528 st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_flags); |
f096e1b74d85
7148126: ConstantPoolCacheEntry::print prints to wrong stream
dholmes
parents:
3938
diff
changeset
|
529 st->print_cr(" -------------"); |
0 | 530 } |
531 | |
532 void ConstantPoolCacheEntry::verify(outputStream* st) const { | |
533 // not implemented yet | |
534 } | |
535 | |
536 // Implementation of ConstantPoolCache | |
537 | |
8712
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8025
diff
changeset
|
538 ConstantPoolCache* ConstantPoolCache::allocate(ClassLoaderData* loader_data, |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8025
diff
changeset
|
539 int length, |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8025
diff
changeset
|
540 const intStack& index_map, |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8025
diff
changeset
|
541 const intStack& invokedynamic_map, TRAPS) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
542 int size = ConstantPoolCache::size(length); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
543 |
8712
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8025
diff
changeset
|
544 return new (loader_data, size, false, THREAD) ConstantPoolCache(length, index_map, invokedynamic_map); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
545 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
546 |
8712
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8025
diff
changeset
|
547 void ConstantPoolCache::initialize(const intArray& inverse_index_map, |
3efdfd6ddbf2
8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents:
8025
diff
changeset
|
548 const intArray& invokedynamic_references_map) { |
0 | 549 assert(inverse_index_map.length() == length(), "inverse index map must have same length as cache"); |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
844
diff
changeset
|
550 for (int i = 0; i < length(); i++) { |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
844
diff
changeset
|
551 ConstantPoolCacheEntry* e = entry_at(i); |
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
844
diff
changeset
|
552 int original_index = inverse_index_map[i]; |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
553 e->initialize_entry(original_index); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
554 assert(entry_at(i) == e, "sanity"); |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
555 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
556 for (int ref = 0; ref < invokedynamic_references_map.length(); ref++) { |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
557 const int cpci = invokedynamic_references_map[ref]; |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
558 if (cpci >= 0) { |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
559 #ifdef ASSERT |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
560 // invokedynamic and invokehandle have more entries; check if they |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
561 // all point to the same constant pool cache entry. |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
562 for (int entry = 1; entry < ConstantPoolCacheEntry::_indy_resolved_references_entries; entry++) { |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
563 const int cpci_next = invokedynamic_references_map[ref + entry]; |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
564 assert(cpci == cpci_next, err_msg_res("%d == %d", cpci, cpci_next)); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
565 } |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
566 #endif |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
567 entry_at(cpci)->initialize_resolved_reference_index(ref); |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
568 ref += ConstantPoolCacheEntry::_indy_resolved_references_entries - 1; // skip extra entries |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6737
diff
changeset
|
569 } |
1059
389049f3f393
6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents:
844
diff
changeset
|
570 } |
0 | 571 } |
572 | |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
573 #if INCLUDE_JVMTI |
0 | 574 // RedefineClasses() API support: |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
575 // If any entry of this ConstantPoolCache points to any of |
0 | 576 // old_methods, replace it with the corresponding new_method. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
577 void ConstantPoolCache::adjust_method_entries(Method** old_methods, Method** new_methods, |
0 | 578 int methods_length, bool * trace_name_printed) { |
579 | |
580 if (methods_length == 0) { | |
581 // nothing to do if there are no methods | |
582 return; | |
583 } | |
584 | |
585 // get shorthand for the interesting class | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
586 Klass* old_holder = old_methods[0]->method_holder(); |
0 | 587 |
588 for (int i = 0; i < length(); i++) { | |
589 if (!entry_at(i)->is_interesting_method_entry(old_holder)) { | |
590 // skip uninteresting methods | |
591 continue; | |
592 } | |
593 | |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
594 // The ConstantPoolCache contains entries for several different |
0 | 595 // things, but we only care about methods. In fact, we only care |
596 // about methods in the same class as the one that contains the | |
597 // old_methods. At this point, we have an interesting entry. | |
598 | |
599 for (int j = 0; j < methods_length; j++) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
600 Method* old_method = old_methods[j]; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
601 Method* new_method = new_methods[j]; |
0 | 602 |
603 if (entry_at(i)->adjust_method_entry(old_method, new_method, | |
604 trace_name_printed)) { | |
605 // current old_method matched this entry and we updated it so | |
606 // break out and get to the next interesting entry if there one | |
607 break; | |
608 } | |
609 } | |
610 } | |
611 } | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
612 |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
613 // the constant pool cache should never contain old or obsolete methods |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
614 bool ConstantPoolCache::check_no_old_or_obsolete_entries() { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
615 for (int i = 1; i < length(); i++) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
616 if (entry_at(i)->is_interesting_method_entry(NULL) && |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
617 !entry_at(i)->check_no_old_or_obsolete_entries()) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
618 return false; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
619 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
620 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
621 return true; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
622 } |
8021
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
623 |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
624 void ConstantPoolCache::dump_cache() { |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
625 for (int i = 1; i < length(); i++) { |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
626 if (entry_at(i)->is_interesting_method_entry(NULL)) { |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
627 entry_at(i)->print(tty, i); |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
628 } |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
629 } |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
630 } |
8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents:
6985
diff
changeset
|
631 #endif // INCLUDE_JVMTI |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
632 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
633 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
634 // Printing |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
635 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
636 void ConstantPoolCache::print_on(outputStream* st) const { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
637 assert(is_constantPoolCache(), "obj must be constant pool cache"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
638 st->print_cr(internal_name()); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
639 // print constant pool cache entries |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
640 for (int i = 0; i < length(); i++) entry_at(i)->print(st, i); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
641 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
642 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
643 void ConstantPoolCache::print_value_on(outputStream* st) const { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
644 assert(is_constantPoolCache(), "obj must be constant pool cache"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
645 st->print("cache [%d]", length()); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
646 print_address_on(st); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
647 st->print(" for "); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
648 constant_pool()->print_value_on(st); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
649 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
650 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
651 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
652 // Verification |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
653 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
654 void ConstantPoolCache::verify_on(outputStream* st) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
655 guarantee(is_constantPoolCache(), "obj must be constant pool cache"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
656 // print constant pool cache entries |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
657 for (int i = 0; i < length(); i++) entry_at(i)->verify(st); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
658 } |