annotate src/share/vm/interpreter/interpreterRuntime.cpp @ 9126:bc26f978b0ce

HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly don't use the (wrong) cached value, but ask the runtime on each request. Fixes regression on xml.* benchmarks @ specjvm2008. The problem was: After the constructor of Object was deoptimized due to an assumption violation, it was recompiled again after some time. However, on recompilation, the value of hasFinalizeSubclass for the class was not updated and it was compiled again with a, now wrong, assumption, which then triggers deoptimization again. This was repeated until it hit the recompilation limit (defined by PerMethodRecompilationCutoff), and therefore only executed by the interpreter from now on, causing the performance regression.
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 15 Apr 2013 19:54:58 +0200
parents 89e4d67fdd2a
children 836a62f43af9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6145
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: 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
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: 1913
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
27 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
28 #include "compiler/compileBroker.hpp"
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 6985
diff changeset
29 #include "compiler/disassembler.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
30 #include "gc_interface/collectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
31 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
32 #include "interpreter/interpreterRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
33 #include "interpreter/linkResolver.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
34 #include "interpreter/templateTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
35 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
36 #include "memory/universe.inline.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
37 #include "oops/constantPool.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
38 #include "oops/instanceKlass.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
39 #include "oops/methodData.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
40 #include "oops/objArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
41 #include "oops/oop.inline.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
42 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
43 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
44 #include "prims/nativeLookup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
45 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
46 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
47 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
48 #include "runtime/fieldDescriptor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
49 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
50 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
51 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
52 #include "runtime/jfieldIDWorkaround.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
53 #include "runtime/osThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
54 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
55 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
56 #include "runtime/synchronizer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
57 #include "runtime/threadCritical.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
58 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
59 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
60 # include "vm_version_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
61 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
62 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
63 # include "vm_version_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
64 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
65 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
66 # include "vm_version_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
67 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
68 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
69 # include "vm_version_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
70 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
71 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
72 # include "vm_version_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
73 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
74 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
75 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
76 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 class UnlockFlagSaver {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
80 JavaThread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 bool _do_not_unlock;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
83 UnlockFlagSaver(JavaThread* t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 _thread = t;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 _do_not_unlock = t->do_not_unlock_if_synchronized();
a61af66fc99e Initial load
duke
parents:
diff changeset
86 t->set_do_not_unlock_if_synchronized(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88 ~UnlockFlagSaver() {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 _thread->set_do_not_unlock_if_synchronized(_do_not_unlock);
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 };
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // State accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 void InterpreterRuntime::set_bcp_and_mdp(address bcp, JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 last_frame(thread).interpreter_frame_set_bcp(bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
98 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // ProfileTraps uses MDOs independently of ProfileInterpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // That is why we must check both ProfileInterpreter and mdo != NULL.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
101 MethodData* mdo = last_frame(thread).interpreter_frame_method()->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
102 if (mdo != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 NEEDS_CLEANUP;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 last_frame(thread).interpreter_frame_set_mdp(mdo->bci_to_dp(last_frame(thread).interpreter_frame_bci()));
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Constants
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 IRT_ENTRY(void, InterpreterRuntime::ldc(JavaThread* thread, bool wide))
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // access constant pool
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
115 ConstantPool* pool = method(thread)->constants();
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
116 int index = wide ? get_index_u2(thread, Bytecodes::_ldc_w) : get_index_u1(thread, Bytecodes::_ldc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
117 constantTag tag = pool->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
118
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
119 assert (tag.is_unresolved_klass() || tag.is_klass(), "wrong ldc call");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
120 Klass* klass = pool->klass_at(index, CHECK);
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2357
diff changeset
121 oop java_class = klass->java_mirror();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 thread->set_vm_result(java_class);
a61af66fc99e Initial load
duke
parents:
diff changeset
123 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
124
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
125 IRT_ENTRY(void, InterpreterRuntime::resolve_ldc(JavaThread* thread, Bytecodes::Code bytecode)) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
126 assert(bytecode == Bytecodes::_fast_aldc ||
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
127 bytecode == Bytecodes::_fast_aldc_w, "wrong bc");
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
128 ResourceMark rm(thread);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
129 methodHandle m (thread, method(thread));
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
130 Bytecode_loadconstant ldc(m, bci(thread));
3403
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
131 oop result = ldc.resolve_constant(CHECK);
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
132 #ifdef ASSERT
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
133 {
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
134 // The bytecode wrappers aren't GC-safe so construct a new one
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
135 Bytecode_loadconstant ldc2(m, bci(thread));
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
136 oop coop = m->constants()->resolved_references()->obj_at(ldc2.cache_index());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
137 assert(result == coop, "expected result for assembly code");
3403
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
138 }
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
139 #endif
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
140 thread->set_vm_result(result);
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
141 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
142 IRT_END
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
143
0
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
147
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
148 IRT_ENTRY(void, InterpreterRuntime::_new(JavaThread* thread, ConstantPool* pool, int index))
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
149 Klass* k_oop = pool->klass_at(index, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150 instanceKlassHandle klass (THREAD, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Make sure we are not instantiating an abstract klass
a61af66fc99e Initial load
duke
parents:
diff changeset
153 klass->check_valid_for_instantiation(true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // Make sure klass is initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
156 klass->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // At this point the class may not be fully initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // because of recursive initialization. If it is fully
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // initialized & has_finalized is not set, we rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // it into its fast version (Note: no locking is needed
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // here since this is an atomic byte write and can be
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // done more than once).
a61af66fc99e Initial load
duke
parents:
diff changeset
164 //
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Note: In case of classes with has_finalized we don't
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // rewrite since that saves us an extra check in
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // the fast version which then would call the
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // slow version anyway (and do a call back into
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Java).
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // If we have a breakpoint, then we don't rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // because the _breakpoint bytecode would be lost.
a61af66fc99e Initial load
duke
parents:
diff changeset
172 oop obj = klass->allocate_instance(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 IRT_ENTRY(void, InterpreterRuntime::newarray(JavaThread* thread, BasicType type, jint size))
a61af66fc99e Initial load
duke
parents:
diff changeset
178 oop obj = oopFactory::new_typeArray(type, size, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
180 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
183 IRT_ENTRY(void, InterpreterRuntime::anewarray(JavaThread* thread, ConstantPool* pool, int index, jint size))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Note: no oopHandle for pool & klass needed since they are not used
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // anymore after new_objArray() and no GC can happen before.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // (This may have to change if this code changes!)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
187 Klass* klass = pool->klass_at(index, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
188 objArrayOop obj = oopFactory::new_objArray(klass, size, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
189 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
190 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 IRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // We may want to pass in more arguments - could make this slightly faster
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
195 ConstantPool* constants = method(thread)->constants();
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
196 int i = get_index_u2(thread, Bytecodes::_multianewarray);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
197 Klass* klass = constants->klass_at(i, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198 int nof_dims = number_of_dimensions(thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
199 assert(klass->is_klass(), "not a class");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
200 assert(nof_dims >= 1, "multianewarray rank must be nonzero");
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // We must create an array of jints to pass to multi_allocate.
a61af66fc99e Initial load
duke
parents:
diff changeset
203 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 const int small_dims = 10;
a61af66fc99e Initial load
duke
parents:
diff changeset
205 jint dim_array[small_dims];
a61af66fc99e Initial load
duke
parents:
diff changeset
206 jint *dims = &dim_array[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (nof_dims > small_dims) {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 dims = (jint*) NEW_RESOURCE_ARRAY(jint, nof_dims);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210 for (int index = 0; index < nof_dims; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // offset from first_size_address is addressed as local[index]
a61af66fc99e Initial load
duke
parents:
diff changeset
212 int n = Interpreter::local_offset_in_bytes(index)/jintSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 dims[index] = first_size_address[n];
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6737
diff changeset
215 oop obj = ArrayKlass::cast(klass)->multi_allocate(nof_dims, dims, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
216 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 IRT_ENTRY(void, InterpreterRuntime::register_finalizer(JavaThread* thread, oopDesc* obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
221 assert(obj->is_oop(), "must be a valid oop");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
222 assert(obj->klass()->has_finalizer(), "shouldn't be here otherwise");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
223 InstanceKlass::register_finalizer(instanceOop(obj), CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
224 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // Quicken instance-of and check-cast bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
228 IRT_ENTRY(void, InterpreterRuntime::quicken_io_cc(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Force resolving; quicken the bytecode
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
230 int which = get_index_u2(thread, Bytecodes::_checkcast);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
231 ConstantPool* cpool = method(thread)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // We'd expect to assert that we're only here to quicken bytecodes, but in a multithreaded
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // program we might have seen an unquick'd bytecode in the interpreter but have another
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // thread quicken the bytecode before we get here.
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // assert( cpool->tag_at(which).is_unresolved_klass(), "should only come here to quicken bytecodes" );
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
236 Klass* klass = cpool->klass_at(which, CHECK);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
237 thread->set_vm_result_2(klass);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
238 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // Exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // Assume the compiler is (or will be) interested in this event.
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // If necessary, create an MDO to hold the information, and record it.
a61af66fc99e Initial load
duke
parents:
diff changeset
246 void InterpreterRuntime::note_trap(JavaThread* thread, int reason, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 assert(ProfileTraps, "call me only if profiling");
a61af66fc99e Initial load
duke
parents:
diff changeset
248 methodHandle trap_method(thread, method(thread));
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
249
0
a61af66fc99e Initial load
duke
parents:
diff changeset
250 if (trap_method.not_null()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
251 MethodData* trap_mdo = trap_method->method_data();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
252 if (trap_mdo == NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
253 Method::build_interpreter_method_data(trap_method, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
254 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
a61af66fc99e Initial load
duke
parents:
diff changeset
256 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
258 trap_mdo = trap_method->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // and fall through...
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
261 if (trap_mdo != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // Update per-method count of trap events. The interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // is updating the MDO to simulate the effect of compiler traps.
a61af66fc99e Initial load
duke
parents:
diff changeset
264 int trap_bci = trap_method->bci_from(bcp(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
265 Deoptimization::update_method_data_from_interpreter(trap_mdo, trap_bci, reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
270 static Handle get_preinitialized_exception(Klass* k, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // get klass
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
272 InstanceKlass* klass = InstanceKlass::cast(k);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
273 assert(klass->is_initialized(),
a61af66fc99e Initial load
duke
parents:
diff changeset
274 "this klass should have been initialized during VM initialization");
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // create instance - do not call constructor since we may have no
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // (java) stack space left (should assert constructor is empty)
a61af66fc99e Initial load
duke
parents:
diff changeset
277 Handle exception;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 oop exception_oop = klass->allocate_instance(CHECK_(exception));
a61af66fc99e Initial load
duke
parents:
diff changeset
279 exception = Handle(THREAD, exception_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
280 if (StackTraceInThrowable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 java_lang_Throwable::fill_in_stack_trace(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 return exception;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // Special handling for stack overflow: since we don't have any (java) stack
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // space left we use the pre-allocated & pre-initialized StackOverflowError
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // klass to create an stack overflow error instance. We do not call its
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // constructor for the same reason (it is empty, anyway).
a61af66fc99e Initial load
duke
parents:
diff changeset
290 IRT_ENTRY(void, InterpreterRuntime::throw_StackOverflowError(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
291 Handle exception = get_preinitialized_exception(
a61af66fc99e Initial load
duke
parents:
diff changeset
292 SystemDictionary::StackOverflowError_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
293 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
294 THROW_HANDLE(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
295 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 IRT_ENTRY(void, InterpreterRuntime::create_exception(JavaThread* thread, char* name, char* message))
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // lookup exception klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
300 TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
301 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 if (s == vmSymbols::java_lang_ArithmeticException()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 note_trap(thread, Deoptimization::Reason_div0_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
304 } else if (s == vmSymbols::java_lang_NullPointerException()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
305 note_trap(thread, Deoptimization::Reason_null_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // create exception
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
309 Handle exception = Exceptions::new_exception(thread, s, message);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
310 thread->set_vm_result(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
311 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 IRT_ENTRY(void, InterpreterRuntime::create_klass_exception(JavaThread* thread, char* name, oopDesc* obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
315 ResourceMark rm(thread);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6840
diff changeset
316 const char* klass_name = obj->klass()->external_name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // lookup exception klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
318 TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
319 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 note_trap(thread, Deoptimization::Reason_class_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // create exception, with klass name as detail message
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
323 Handle exception = Exceptions::new_exception(thread, s, klass_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
324 thread->set_vm_result(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
325 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328 IRT_ENTRY(void, InterpreterRuntime::throw_ArrayIndexOutOfBoundsException(JavaThread* thread, char* name, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
329 char message[jintAsStringSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // lookup exception klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
331 TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 note_trap(thread, Deoptimization::Reason_range_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // create exception
a61af66fc99e Initial load
duke
parents:
diff changeset
336 sprintf(message, "%d", index);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
337 THROW_MSG(s, message);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
338 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 IRT_ENTRY(void, InterpreterRuntime::throw_ClassCastException(
a61af66fc99e Initial load
duke
parents:
diff changeset
341 JavaThread* thread, oopDesc* obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
344 char* message = SharedRuntime::generate_class_cast_message(
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6840
diff changeset
345 thread, obj->klass()->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 note_trap(thread, Deoptimization::Reason_class_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // create exception
a61af66fc99e Initial load
duke
parents:
diff changeset
352 THROW_MSG(vmSymbols::java_lang_ClassCastException(), message);
a61af66fc99e Initial load
duke
parents:
diff changeset
353 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // exception_handler_for_exception(...) returns the continuation address,
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // the exception oop (via TLS) and sets the bci/bcp for the continuation.
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // The exception oop is returned to make sure it is preserved over GC (it
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // is only on the stack if the exception was thrown explicitly via athrow).
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // During this operation, the expression stack contains the values for the
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // bci where the exception happened. If the exception was propagated back
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // from a call, the expression stack contains the values for the bci at the
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // invoke w/o arguments (i.e., as if one were inside the call).
a61af66fc99e Initial load
duke
parents:
diff changeset
363 IRT_ENTRY(address, InterpreterRuntime::exception_handler_for_exception(JavaThread* thread, oopDesc* exception))
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 Handle h_exception(thread, exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
366 methodHandle h_method (thread, method(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
367 constantPoolHandle h_constants(thread, h_method->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
368 bool should_repeat;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 int handler_bci;
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
370 int current_bci = bci(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // Need to do this check first since when _do_not_unlock_if_synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // is set, we don't want to trigger any classloading which may make calls
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // into java, or surprisingly find a matching exception handler for bci 0
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // since at this moment the method hasn't been "officially" entered yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
376 if (thread->do_not_unlock_if_synchronized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 assert(current_bci == 0, "bci isn't zero for do_not_unlock_if_synchronized");
a61af66fc99e Initial load
duke
parents:
diff changeset
379 thread->set_vm_result(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
380 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
381 return (address) -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
383 return Interpreter::remove_activation_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
384 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
388 should_repeat = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // assertions
a61af66fc99e Initial load
duke
parents:
diff changeset
391 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
392 assert(h_exception.not_null(), "NULL exceptions should be handled by athrow");
a61af66fc99e Initial load
duke
parents:
diff changeset
393 assert(h_exception->is_oop(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // Check that exception is a subclass of Throwable, otherwise we have a VerifyError
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1138
diff changeset
395 if (!(h_exception->is_a(SystemDictionary::Throwable_klass()))) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
396 if (ExitVMOnVerifyError) vm_exit(-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
397 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // tracing
a61af66fc99e Initial load
duke
parents:
diff changeset
402 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
404 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", h_exception->print_value_string(), (address)h_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
406 tty->print_cr(" thrown in interpreter method <%s>", h_method->print_value_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
407 tty->print_cr(" at bci %d for thread " INTPTR_FORMAT, current_bci, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // Don't go paging in something which won't be used.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
410 // else if (extable->length() == 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // // disabled for now - interpreter is not using shortcut yet
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // // (shortcut is not to call runtime if we have no exception handlers)
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // // warning("performance bug: should not call runtime if method has no exception handlers");
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // for AbortVMOnException flag
a61af66fc99e Initial load
duke
parents:
diff changeset
416 NOT_PRODUCT(Exceptions::debug_check_abort(h_exception));
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // exception handler lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
419 KlassHandle h_klass(THREAD, h_exception->klass());
7469
0c8717a92b2d 8001341: SIGSEGV in methodOopDesc::fast_exception_handler_bci_for(KlassHandle,int,Thread*)+0x3e9.
jiangli
parents: 7199
diff changeset
420 handler_bci = Method::fast_exception_handler_bci_for(h_method, h_klass, current_bci, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
421 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // We threw an exception while trying to find the exception handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // Transfer the new exception to the exception handle which will
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // be set into thread local storage, and do another lookup for an
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // exception handler for this exception, this time starting at the
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // BCI of the exception handler which caused the exception to be
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // thrown (bug 4307310).
a61af66fc99e Initial load
duke
parents:
diff changeset
428 h_exception = Handle(THREAD, PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
429 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 if (handler_bci >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
431 current_bci = handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
432 should_repeat = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435 } while (should_repeat == true);
a61af66fc99e Initial load
duke
parents:
diff changeset
436
8616
d343737786fe changed profiling of exceptions so that the ExceptionSeen flag also works without GRAALVM
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7482
diff changeset
437 #ifdef GRAAL
3055
fecdb0a65fb2 runtime profiles exceptions at the call site
Lukas Stadler <lukas.stadler@jku.at>
parents: 2460
diff changeset
438 if (h_method->method_data() != NULL) {
3153
5ca1332171c8 Fixed an issue in the HotSpot code for rethrowing an exception at deopt (wrong values on the expression stack caused a crash when GC and deopt happened at the same time).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 3055
diff changeset
439 ResourceMark rm(thread);
3055
fecdb0a65fb2 runtime profiles exceptions at the call site
Lukas Stadler <lukas.stadler@jku.at>
parents: 2460
diff changeset
440 ProfileData* pdata = h_method->method_data()->allocate_bci_to_data(current_bci);
8616
d343737786fe changed profiling of exceptions so that the ExceptionSeen flag also works without GRAALVM
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7482
diff changeset
441 if (pdata != NULL && pdata->is_BitData()) {
d343737786fe changed profiling of exceptions so that the ExceptionSeen flag also works without GRAALVM
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7482
diff changeset
442 BitData* bit_data = (BitData*) pdata;
d343737786fe changed profiling of exceptions so that the ExceptionSeen flag also works without GRAALVM
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7482
diff changeset
443 bit_data->set_exception_seen();
3055
fecdb0a65fb2 runtime profiles exceptions at the call site
Lukas Stadler <lukas.stadler@jku.at>
parents: 2460
diff changeset
444 }
fecdb0a65fb2 runtime profiles exceptions at the call site
Lukas Stadler <lukas.stadler@jku.at>
parents: 2460
diff changeset
445 }
4979
18a5539bf19b More diff vs hsx24 optimizations.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 4970
diff changeset
446 #endif
3055
fecdb0a65fb2 runtime profiles exceptions at the call site
Lukas Stadler <lukas.stadler@jku.at>
parents: 2460
diff changeset
447
0
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // notify JVMTI of an exception throw; JVMTI will detect if this is a first
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // time throw or a stack unwinding throw and accordingly notify the debugger
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1142
diff changeset
450 if (JvmtiExport::can_post_on_exceptions()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
451 JvmtiExport::post_exception_throw(thread, h_method(), bcp(thread), h_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
455 address continuation = (address)(intptr_t) handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
456 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
457 address continuation = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
458 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
459 address handler_pc = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
460 if (handler_bci < 0 || !thread->reguard_stack((address) &continuation)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // Forward exception to callee (leaving bci/bcp untouched) because (a) no
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // handler in this method, or (b) after a stack overflow there is not yet
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // enough stack space available to reprotect the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
464 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
465 continuation = Interpreter::remove_activation_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
466 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // Count this for compilation purposes
a61af66fc99e Initial load
duke
parents:
diff changeset
468 h_method->interpreter_throwout_increment();
a61af66fc99e Initial load
duke
parents:
diff changeset
469 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // handler in this method => change bci/bcp to handler bci/bcp and continue there
a61af66fc99e Initial load
duke
parents:
diff changeset
471 handler_pc = h_method->code_base() + handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
472 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
473 set_bcp_and_mdp(handler_pc, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
474 continuation = Interpreter::dispatch_table(vtos)[*handler_pc];
a61af66fc99e Initial load
duke
parents:
diff changeset
475 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // notify debugger of an exception catch
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // (this is good for exceptions caught in native methods as well)
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1142
diff changeset
479 if (JvmtiExport::can_post_on_exceptions()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
480 JvmtiExport::notice_unwind_due_to_exception(thread, h_method(), handler_pc, h_exception(), (handler_pc != NULL));
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 thread->set_vm_result(h_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
484 return continuation;
a61af66fc99e Initial load
duke
parents:
diff changeset
485 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 IRT_ENTRY(void, InterpreterRuntime::throw_pending_exception(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
489 assert(thread->has_pending_exception(), "must only ne called if there's an exception pending");
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // nothing to do - eventually we should remove this code entirely (see comments @ call sites)
a61af66fc99e Initial load
duke
parents:
diff changeset
491 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 IRT_ENTRY(void, InterpreterRuntime::throw_AbstractMethodError(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
495 THROW(vmSymbols::java_lang_AbstractMethodError());
a61af66fc99e Initial load
duke
parents:
diff changeset
496 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499 IRT_ENTRY(void, InterpreterRuntime::throw_IncompatibleClassChangeError(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
500 THROW(vmSymbols::java_lang_IncompatibleClassChangeError());
a61af66fc99e Initial load
duke
parents:
diff changeset
501 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
505 // Fields
a61af66fc99e Initial load
duke
parents:
diff changeset
506 //
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 IRT_ENTRY(void, InterpreterRuntime::resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode))
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // resolve field
a61af66fc99e Initial load
duke
parents:
diff changeset
510 FieldAccessInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
511 constantPoolHandle pool(thread, method(thread)->constants());
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
512 bool is_put = (bytecode == Bytecodes::_putfield || bytecode == Bytecodes::_putstatic);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
513 bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic);
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 {
a61af66fc99e Initial load
duke
parents:
diff changeset
516 JvmtiHideSingleStepping jhss(thread);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
517 LinkResolver::resolve_field(info, pool, get_index_u2_cpcache(thread, bytecode),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
518 bytecode, false, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 } // end JvmtiHideSingleStepping
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // check if link resolution caused cpCache to be updated
a61af66fc99e Initial load
duke
parents:
diff changeset
522 if (already_resolved(thread)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // compute auxiliary field attributes
a61af66fc99e Initial load
duke
parents:
diff changeset
525 TosState state = as_TosState(info.field_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // We need to delay resolving put instructions on final fields
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // until we actually invoke one. This is required so we throw
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // exceptions at the correct place. If we do not resolve completely
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // in the current pass, leaving the put_code set to zero will
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // cause the next put instruction to reresolve.
a61af66fc99e Initial load
duke
parents:
diff changeset
532 Bytecodes::Code put_code = (Bytecodes::Code)0;
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // We also need to delay resolving getstatic instructions until the
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // class is intitialized. This is required so that access to the static
a61af66fc99e Initial load
duke
parents:
diff changeset
536 // field will call the initialization function every time until the class
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // is completely initialized ala. in 2.17.5 in JVM Specification.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
538 InstanceKlass *klass = InstanceKlass::cast(info.klass()());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
539 bool uninitialized_static = ((bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
540 !klass->is_initialized());
a61af66fc99e Initial load
duke
parents:
diff changeset
541 Bytecodes::Code get_code = (Bytecodes::Code)0;
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 if (!uninitialized_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
544 get_code = ((is_static) ? Bytecodes::_getstatic : Bytecodes::_getfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
545 if (is_put || !info.access_flags().is_final()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
546 put_code = ((is_static) ? Bytecodes::_putstatic : Bytecodes::_putfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
549
a61af66fc99e Initial load
duke
parents:
diff changeset
550 cache_entry(thread)->set_field(
a61af66fc99e Initial load
duke
parents:
diff changeset
551 get_code,
a61af66fc99e Initial load
duke
parents:
diff changeset
552 put_code,
a61af66fc99e Initial load
duke
parents:
diff changeset
553 info.klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
554 info.field_index(),
a61af66fc99e Initial load
duke
parents:
diff changeset
555 info.field_offset(),
a61af66fc99e Initial load
duke
parents:
diff changeset
556 state,
a61af66fc99e Initial load
duke
parents:
diff changeset
557 info.access_flags().is_final(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
558 info.access_flags().is_volatile(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
559 pool->pool_holder()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
560 );
a61af66fc99e Initial load
duke
parents:
diff changeset
561 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // Synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
566 //
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // The interpreter's synchronization code is factored out so that it can
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // be shared by method invocation and synchronized blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
569 //%note synchronization_3
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 //%note monitor_1
a61af66fc99e Initial load
duke
parents:
diff changeset
572 IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorenter(JavaThread* thread, BasicObjectLock* elem))
a61af66fc99e Initial load
duke
parents:
diff changeset
573 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
574 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
575 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
576 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
577 Atomic::inc(BiasedLocking::slow_path_entry_count_addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
579 Handle h_obj(thread, elem->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
580 assert(Universe::heap()->is_in_reserved_or_null(h_obj()),
a61af66fc99e Initial load
duke
parents:
diff changeset
581 "must be NULL or an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
582 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // Retry fast entry if bias is revoked to avoid unnecessary inflation
a61af66fc99e Initial load
duke
parents:
diff changeset
584 ObjectSynchronizer::fast_enter(h_obj, elem->lock(), true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
586 ObjectSynchronizer::slow_enter(h_obj, elem->lock(), CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
588 assert(Universe::heap()->is_in_reserved_or_null(elem->obj()),
a61af66fc99e Initial load
duke
parents:
diff changeset
589 "must be NULL or an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
590 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
591 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
592 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
593 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 //%note monitor_1
a61af66fc99e Initial load
duke
parents:
diff changeset
597 IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorexit(JavaThread* thread, BasicObjectLock* elem))
a61af66fc99e Initial load
duke
parents:
diff changeset
598 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
599 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
600 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
601 Handle h_obj(thread, elem->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
602 assert(Universe::heap()->is_in_reserved_or_null(h_obj()),
a61af66fc99e Initial load
duke
parents:
diff changeset
603 "must be NULL or an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
604 if (elem == NULL || h_obj()->is_unlocked()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 THROW(vmSymbols::java_lang_IllegalMonitorStateException());
a61af66fc99e Initial load
duke
parents:
diff changeset
606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
607 ObjectSynchronizer::slow_exit(h_obj(), elem->lock(), thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // Free entry. This must be done here, since a pending exception might be installed on
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // exit. If it is not cleared, the exception handling code will try to unlock the monitor again.
a61af66fc99e Initial load
duke
parents:
diff changeset
610 elem->set_obj(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
611 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
612 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
613 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
614 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
615
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 IRT_ENTRY(void, InterpreterRuntime::throw_illegal_monitor_state_exception(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
618 THROW(vmSymbols::java_lang_IllegalMonitorStateException());
a61af66fc99e Initial load
duke
parents:
diff changeset
619 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 IRT_ENTRY(void, InterpreterRuntime::new_illegal_monitor_state_exception(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // Returns an illegal exception to install into the current thread. The
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // pending_exception flag is cleared so normal exception handling does not
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // trigger. Any current installed exception will be overwritten. This
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // method will be called during an exception unwind.
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 assert(!HAS_PENDING_EXCEPTION, "no pending exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
629 Handle exception(thread, thread->vm_result());
a61af66fc99e Initial load
duke
parents:
diff changeset
630 assert(exception() != NULL, "vm result should be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
631 thread->set_vm_result(NULL); // clear vm result before continuing (may cause memory leaks and assert failures)
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1138
diff changeset
632 if (!exception->is_a(SystemDictionary::ThreadDeath_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
633 exception = get_preinitialized_exception(
a61af66fc99e Initial load
duke
parents:
diff changeset
634 SystemDictionary::IllegalMonitorStateException_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
635 CATCH);
a61af66fc99e Initial load
duke
parents:
diff changeset
636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
637 thread->set_vm_result(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
638 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
639
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // Invokes
a61af66fc99e Initial load
duke
parents:
diff changeset
643
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
644 IRT_ENTRY(Bytecodes::Code, InterpreterRuntime::get_original_bytecode_at(JavaThread* thread, Method* method, address bcp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
645 return method->orig_bytecode_at(method->bci_from(bcp));
a61af66fc99e Initial load
duke
parents:
diff changeset
646 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
647
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
648 IRT_ENTRY(void, InterpreterRuntime::set_original_bytecode_at(JavaThread* thread, Method* method, address bcp, Bytecodes::Code new_code))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
649 method->set_orig_bytecode_at(method->bci_from(bcp), new_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
650 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
651
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
652 IRT_ENTRY(void, InterpreterRuntime::_breakpoint(JavaThread* thread, Method* method, address bcp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
653 JvmtiExport::post_raw_breakpoint(thread, method, bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
654 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
655
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
656 IRT_ENTRY(void, InterpreterRuntime::resolve_invoke(JavaThread* thread, Bytecodes::Code bytecode)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // extract receiver from the outgoing argument list if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
658 Handle receiver(thread, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
659 if (bytecode == Bytecodes::_invokevirtual || bytecode == Bytecodes::_invokeinterface) {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
661 methodHandle m (thread, method(thread));
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
662 Bytecode_invoke call(m, bci(thread));
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
663 Symbol* signature = call.signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
664 receiver = Handle(thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
665 thread->last_frame().interpreter_callee_receiver(signature));
a61af66fc99e Initial load
duke
parents:
diff changeset
666 assert(Universe::heap()->is_in_reserved_or_null(receiver()),
a61af66fc99e Initial load
duke
parents:
diff changeset
667 "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
668 assert(receiver.is_null() ||
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
669 !Universe::heap()->is_in_reserved(receiver->klass()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
670 "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 // resolve method
a61af66fc99e Initial load
duke
parents:
diff changeset
674 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
675 constantPoolHandle pool(thread, method(thread)->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
676
a61af66fc99e Initial load
duke
parents:
diff changeset
677 {
a61af66fc99e Initial load
duke
parents:
diff changeset
678 JvmtiHideSingleStepping jhss(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 LinkResolver::resolve_invoke(info, receiver, pool,
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
680 get_index_u2_cpcache(thread, bytecode), bytecode, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
681 if (JvmtiExport::can_hotswap_or_post_breakpoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
682 int retry_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
683 while (info.resolved_method()->is_old()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // It is very unlikely that method is redefined more than 100 times
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // in the middle of resolve. If it is looping here more than 100 times
a61af66fc99e Initial load
duke
parents:
diff changeset
686 // means then there could be a bug here.
a61af66fc99e Initial load
duke
parents:
diff changeset
687 guarantee((retry_count++ < 100),
a61af66fc99e Initial load
duke
parents:
diff changeset
688 "Could not resolve to latest version of redefined method");
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // method is redefined in the middle of resolve so re-try.
a61af66fc99e Initial load
duke
parents:
diff changeset
690 LinkResolver::resolve_invoke(info, receiver, pool,
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
691 get_index_u2_cpcache(thread, bytecode), bytecode, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
694 } // end JvmtiHideSingleStepping
a61af66fc99e Initial load
duke
parents:
diff changeset
695
a61af66fc99e Initial load
duke
parents:
diff changeset
696 // check if link resolution caused cpCache to be updated
a61af66fc99e Initial load
duke
parents:
diff changeset
697 if (already_resolved(thread)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
698
a61af66fc99e Initial load
duke
parents:
diff changeset
699 if (bytecode == Bytecodes::_invokeinterface) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700
a61af66fc99e Initial load
duke
parents:
diff changeset
701 if (TraceItables && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
702 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
703 tty->print_cr("Resolving: klass: %s to method: %s", info.resolved_klass()->name()->as_C_string(), info.resolved_method()->name()->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
704 }
a61af66fc99e Initial load
duke
parents:
diff changeset
705 if (info.resolved_method()->method_holder() ==
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1138
diff changeset
706 SystemDictionary::Object_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // NOTE: THIS IS A FIX FOR A CORNER CASE in the JVM spec
a61af66fc99e Initial load
duke
parents:
diff changeset
708 // (see also cpCacheOop.cpp for details)
a61af66fc99e Initial load
duke
parents:
diff changeset
709 methodHandle rm = info.resolved_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
710 assert(rm->is_final() || info.has_vtable_index(),
a61af66fc99e Initial load
duke
parents:
diff changeset
711 "should have been set already");
a61af66fc99e Initial load
duke
parents:
diff changeset
712 cache_entry(thread)->set_method(bytecode, rm, info.vtable_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
713 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 // Setup itable entry
a61af66fc99e Initial load
duke
parents:
diff changeset
715 int index = klassItable::compute_itable_index(info.resolved_method()());
a61af66fc99e Initial load
duke
parents:
diff changeset
716 cache_entry(thread)->set_interface_call(info.resolved_method(), index);
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
719 cache_entry(thread)->set_method(
a61af66fc99e Initial load
duke
parents:
diff changeset
720 bytecode,
a61af66fc99e Initial load
duke
parents:
diff changeset
721 info.resolved_method(),
a61af66fc99e Initial load
duke
parents:
diff changeset
722 info.vtable_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
723 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
724 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
725 IRT_END
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
726
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
727
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
728 // First time execution: Resolve symbols, create a permanent MethodType object.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
729 IRT_ENTRY(void, InterpreterRuntime::resolve_invokehandle(JavaThread* thread)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
730 assert(EnableInvokeDynamic, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
731 const Bytecodes::Code bytecode = Bytecodes::_invokehandle;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
732
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
733 // resolve method
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
734 CallInfo info;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
735 constantPoolHandle pool(thread, method(thread)->constants());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
736
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
737 {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
738 JvmtiHideSingleStepping jhss(thread);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
739 LinkResolver::resolve_invoke(info, Handle(), pool,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
740 get_index_u2_cpcache(thread, bytecode), bytecode, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
741 } // end JvmtiHideSingleStepping
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
742
6942
64672b22ef05 8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents: 6840
diff changeset
743 cache_entry(thread)->set_method_handle(pool, info);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
744 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
745 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
746
a61af66fc99e Initial load
duke
parents:
diff changeset
747
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 941
diff changeset
748 // First time execution: Resolve symbols, create a permanent CallSite object.
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
749 IRT_ENTRY(void, InterpreterRuntime::resolve_invokedynamic(JavaThread* thread)) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
750 assert(EnableInvokeDynamic, "");
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
751 const Bytecodes::Code bytecode = Bytecodes::_invokedynamic;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
752
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
753 //TO DO: consider passing BCI to Java.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
754 // int caller_bci = method(thread)->bci_from(bcp(thread));
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
755
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
756 // resolve method
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
757 CallInfo info;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
758 constantPoolHandle pool(thread, method(thread)->constants());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
759 int index = get_index_u4(thread, bytecode);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
760 {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
761 JvmtiHideSingleStepping jhss(thread);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
762 LinkResolver::resolve_invoke(info, Handle(), pool,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
763 index, bytecode, CHECK);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
764 } // end JvmtiHideSingleStepping
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
765
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
766 ConstantPoolCacheEntry* cp_cache_entry = pool->invokedynamic_cp_cache_entry_at(index);
6942
64672b22ef05 8001658: No need to pass resolved_references as argument to ConstantPoolCacheEntry::set_method_handle_common
twisti
parents: 6840
diff changeset
767 cp_cache_entry->set_dynamic_call(pool, info);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
768 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
769 IRT_END
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
770
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
771
0
a61af66fc99e Initial load
duke
parents:
diff changeset
772 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // Miscellaneous
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
776 nmethod* InterpreterRuntime::frequency_counter_overflow(JavaThread* thread, address branch_bcp) {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
777 nmethod* nm = frequency_counter_overflow_inner(thread, branch_bcp);
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
778 assert(branch_bcp != NULL || nm == NULL, "always returns null for non OSR requests");
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
779 if (branch_bcp != NULL && nm != NULL) {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
780 // This was a successful request for an OSR nmethod. Because
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
781 // frequency_counter_overflow_inner ends with a safepoint check,
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
782 // nm could have been unloaded so look it up again. It's unsafe
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
783 // to examine nm directly since it might have been freed and used
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
784 // for something else.
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
785 frame fr = thread->last_frame();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
786 Method* method = fr.interpreter_frame_method();
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
787 int bci = method->bci_from(fr.interpreter_frame_bcp());
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
788 nm = method->lookup_osr_nmethod_for(bci, CompLevel_none, false);
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
789 }
6145
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
790 #ifndef PRODUCT
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
791 if (TraceOnStackReplacement) {
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
792 if (nm != NULL) {
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
793 tty->print("OSR entry @ pc: " INTPTR_FORMAT ": ", nm->osr_entry());
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
794 nm->print();
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
795 }
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
796 }
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4825
diff changeset
797 #endif
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
798 return nm;
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
799 }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
800
0
a61af66fc99e Initial load
duke
parents:
diff changeset
801 IRT_ENTRY(nmethod*,
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
802 InterpreterRuntime::frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // flag, in case this method triggers classloading which will call into Java.
a61af66fc99e Initial load
duke
parents:
diff changeset
805 UnlockFlagSaver fs(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
806
a61af66fc99e Initial load
duke
parents:
diff changeset
807 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
808 assert(fr.is_interpreted_frame(), "must come from interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
809 methodHandle method(thread, fr.interpreter_frame_method());
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
810 const int branch_bci = branch_bcp != NULL ? method->bci_from(branch_bcp) : InvocationEntryBci;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
811 const int bci = branch_bcp != NULL ? method->bci_from(fr.interpreter_frame_bcp()) : InvocationEntryBci;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
812
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4043
diff changeset
813 assert(!HAS_PENDING_EXCEPTION, "Should not have any exceptions pending");
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3451
diff changeset
814 nmethod* osr_nm = CompilationPolicy::policy()->event(method, method, branch_bci, bci, CompLevel_none, NULL, thread);
4825
20334ed5ed3c 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 4043
diff changeset
815 assert(!HAS_PENDING_EXCEPTION, "Event handler should not throw any exceptions");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
816
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
817 if (osr_nm != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
818 // We may need to do on-stack replacement which requires that no
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
819 // monitors in the activation are biased because their
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
820 // BasicObjectLocks will need to migrate during OSR. Force
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
821 // unbiasing of all monitors in the activation now (even though
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
822 // the OSR nmethod might be invalidated) because we don't have a
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
823 // safepoint opportunity later once the migration begins.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
824 if (UseBiasedLocking) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
825 ResourceMark rm;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
826 GrowableArray<Handle>* objects_to_revoke = new GrowableArray<Handle>();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
827 for( BasicObjectLock *kptr = fr.interpreter_frame_monitor_end();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
828 kptr < fr.interpreter_frame_monitor_begin();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
829 kptr = fr.next_monitor_in_interpreter_frame(kptr) ) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
830 if( kptr->obj() != NULL ) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
831 objects_to_revoke->append(Handle(THREAD, kptr->obj()));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
832 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
833 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
834 BiasedLocking::revoke(objects_to_revoke);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
835 }
a61af66fc99e Initial load
duke
parents:
diff changeset
836 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
837 return osr_nm;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
838 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
839
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
840 IRT_LEAF(jint, InterpreterRuntime::bcp_to_di(Method* method, address cur_bcp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
841 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
842 int bci = method->bci_from(cur_bcp);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
843 MethodData* mdo = method->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
844 if (mdo == NULL) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
845 return mdo->bci_to_di(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
847
2118
dd031b2226de 4930919: race condition in MDO creation at back branch locations
iveresov
parents: 1986
diff changeset
848 IRT_ENTRY(void, InterpreterRuntime::profile_method(JavaThread* thread))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // flag, in case this method triggers classloading which will call into Java.
a61af66fc99e Initial load
duke
parents:
diff changeset
851 UnlockFlagSaver fs(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
852
a61af66fc99e Initial load
duke
parents:
diff changeset
853 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
854 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
855 assert(fr.is_interpreted_frame(), "must come from interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
856 methodHandle method(thread, fr.interpreter_frame_method());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
857 Method::build_interpreter_method_data(method, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
858 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
859 assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
a61af66fc99e Initial load
duke
parents:
diff changeset
860 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
861 // and fall through...
a61af66fc99e Initial load
duke
parents:
diff changeset
862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
863 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 #ifdef ASSERT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
867 IRT_LEAF(void, InterpreterRuntime::verify_mdp(Method* method, address bcp, address mdp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
868 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
869
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
870 MethodData* mdo = method->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
871 assert(mdo != NULL, "must not be null");
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 int bci = method->bci_from(bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 address mdp2 = mdo->bci_to_dp(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
876 if (mdp != mdp2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
877 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
878 ResetNoHandleMark rnm; // In a LEAF entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
879 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
880 tty->print_cr("FAILED verify : actual mdp %p expected mdp %p @ bci %d", mdp, mdp2, bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
881 int current_di = mdo->dp_to_di(mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 int expected_di = mdo->dp_to_di(mdp2);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 tty->print_cr(" actual di %d expected di %d", current_di, expected_di);
a61af66fc99e Initial load
duke
parents:
diff changeset
884 int expected_approx_bci = mdo->data_at(expected_di)->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
885 int approx_bci = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
886 if (current_di >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
887 approx_bci = mdo->data_at(current_di)->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
889 tty->print_cr(" actual bci is %d expected bci %d", approx_bci, expected_approx_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 mdo->print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
891 method->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
892 }
a61af66fc99e Initial load
duke
parents:
diff changeset
893 assert(mdp == mdp2, "wrong mdp");
a61af66fc99e Initial load
duke
parents:
diff changeset
894 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
895 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
896
a61af66fc99e Initial load
duke
parents:
diff changeset
897 IRT_ENTRY(void, InterpreterRuntime::update_mdp_for_ret(JavaThread* thread, int return_bci))
a61af66fc99e Initial load
duke
parents:
diff changeset
898 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
899 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
900 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
901 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
902 assert(fr.is_interpreted_frame(), "must come from interpreter");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
903 MethodData* h_mdo = fr.interpreter_frame_method()->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
904
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // Grab a lock to ensure atomic access to setting the return bci and
a61af66fc99e Initial load
duke
parents:
diff changeset
906 // the displacement. This can block and GC, invalidating all naked oops.
a61af66fc99e Initial load
duke
parents:
diff changeset
907 MutexLocker ml(RetData_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
908
a61af66fc99e Initial load
duke
parents:
diff changeset
909 // ProfileData is essentially a wrapper around a derived oop, so we
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // need to take the lock before making any ProfileData structures.
a61af66fc99e Initial load
duke
parents:
diff changeset
911 ProfileData* data = h_mdo->data_at(h_mdo->dp_to_di(fr.interpreter_frame_mdp()));
a61af66fc99e Initial load
duke
parents:
diff changeset
912 RetData* rdata = data->as_RetData();
a61af66fc99e Initial load
duke
parents:
diff changeset
913 address new_mdp = rdata->fixup_ret(return_bci, h_mdo);
a61af66fc99e Initial load
duke
parents:
diff changeset
914 fr.interpreter_frame_set_mdp(new_mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
915 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
916
a61af66fc99e Initial load
duke
parents:
diff changeset
917
a61af66fc99e Initial load
duke
parents:
diff changeset
918 IRT_ENTRY(void, InterpreterRuntime::at_safepoint(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
919 // We used to need an explict preserve_arguments here for invoke bytecodes. However,
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // stack traversal automatically takes care of preserving arguments for invoke, so
a61af66fc99e Initial load
duke
parents:
diff changeset
921 // this is no longer needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
922
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // IRT_END does an implicit safepoint check, hence we are guaranteed to block
a61af66fc99e Initial load
duke
parents:
diff changeset
924 // if this is called during a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
925
a61af66fc99e Initial load
duke
parents:
diff changeset
926 if (JvmtiExport::should_post_single_step()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
927 // We are called during regular safepoints and when the VM is
a61af66fc99e Initial load
duke
parents:
diff changeset
928 // single stepping. If any thread is marked for single stepping,
a61af66fc99e Initial load
duke
parents:
diff changeset
929 // then we may have JVMTI work to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
930 JvmtiExport::at_single_stepping_point(thread, method(thread), bcp(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
931 }
a61af66fc99e Initial load
duke
parents:
diff changeset
932 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
933
a61af66fc99e Initial load
duke
parents:
diff changeset
934 IRT_ENTRY(void, InterpreterRuntime::post_field_access(JavaThread *thread, oopDesc* obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
935 ConstantPoolCacheEntry *cp_entry))
a61af66fc99e Initial load
duke
parents:
diff changeset
936
a61af66fc99e Initial load
duke
parents:
diff changeset
937 // check the access_flags for the field in the klass
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2357
diff changeset
938
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
939 InstanceKlass* ik = InstanceKlass::cast(cp_entry->f1_as_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
940 int index = cp_entry->field_index();
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3912
diff changeset
941 if ((ik->field_access_flags(index) & JVM_ACC_FIELD_ACCESS_WATCHED) == 0) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
942
a61af66fc99e Initial load
duke
parents:
diff changeset
943 switch(cp_entry->flag_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
944 case btos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
945 case ctos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
946 case stos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
947 case itos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
948 case ftos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
949 case ltos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
950 case dtos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
951 case atos: break;
a61af66fc99e Initial load
duke
parents:
diff changeset
952 default: ShouldNotReachHere(); return;
a61af66fc99e Initial load
duke
parents:
diff changeset
953 }
a61af66fc99e Initial load
duke
parents:
diff changeset
954 bool is_static = (obj == NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
955 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
956
a61af66fc99e Initial load
duke
parents:
diff changeset
957 Handle h_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
958 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // non-static field accessors have an object, but we need a handle
a61af66fc99e Initial load
duke
parents:
diff changeset
960 h_obj = Handle(thread, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
961 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
962 instanceKlassHandle h_cp_entry_f1(thread, (Klass*)cp_entry->f1_as_klass());
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
963 jfieldID fid = jfieldIDWorkaround::to_jfieldID(h_cp_entry_f1, cp_entry->f2_as_index(), is_static);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
964 JvmtiExport::post_field_access(thread, method(thread), bcp(thread), h_cp_entry_f1, h_obj, fid);
a61af66fc99e Initial load
duke
parents:
diff changeset
965 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967 IRT_ENTRY(void, InterpreterRuntime::post_field_modification(JavaThread *thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
968 oopDesc* obj, ConstantPoolCacheEntry *cp_entry, jvalue *value))
a61af66fc99e Initial load
duke
parents:
diff changeset
969
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
970 Klass* k = (Klass*)cp_entry->f1_as_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 // check the access_flags for the field in the klass
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
973 InstanceKlass* ik = InstanceKlass::cast(k);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
974 int index = cp_entry->field_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // bail out if field modifications are not watched
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3912
diff changeset
976 if ((ik->field_access_flags(index) & JVM_ACC_FIELD_MODIFICATION_WATCHED) == 0) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
977
a61af66fc99e Initial load
duke
parents:
diff changeset
978 char sig_type = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
979
a61af66fc99e Initial load
duke
parents:
diff changeset
980 switch(cp_entry->flag_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 case btos: sig_type = 'Z'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
982 case ctos: sig_type = 'C'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
983 case stos: sig_type = 'S'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
984 case itos: sig_type = 'I'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
985 case ftos: sig_type = 'F'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
986 case atos: sig_type = 'L'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
987 case ltos: sig_type = 'J'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
988 case dtos: sig_type = 'D'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
989 default: ShouldNotReachHere(); return;
a61af66fc99e Initial load
duke
parents:
diff changeset
990 }
a61af66fc99e Initial load
duke
parents:
diff changeset
991 bool is_static = (obj == NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
992
a61af66fc99e Initial load
duke
parents:
diff changeset
993 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
994 instanceKlassHandle h_klass(thread, k);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
995 jfieldID fid = jfieldIDWorkaround::to_jfieldID(h_klass, cp_entry->f2_as_index(), is_static);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
996 jvalue fvalue;
a61af66fc99e Initial load
duke
parents:
diff changeset
997 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
998 fvalue = *value;
a61af66fc99e Initial load
duke
parents:
diff changeset
999 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 // Long/double values are stored unaligned and also noncontiguously with
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 // tagged stacks. We can't just do a simple assignment even in the non-
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 // J/D cases because a C++ compiler is allowed to assume that a jvalue is
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 // 8-byte aligned, and interpreter stack slots are only 4-byte aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 // We assume that the two halves of longs/doubles are stored in interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 // stack slots in platform-endian order.
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 jlong_accessor u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 jint* newval = (jint*)value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 u.words[0] = newval[0];
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1213
diff changeset
1009 u.words[1] = newval[Interpreter::stackElementWords]; // skip if tag
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 fvalue.j = u.long_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1012
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 Handle h_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 // non-static field accessors have an object, but we need a handle
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 h_obj = Handle(thread, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 JvmtiExport::post_raw_field_modification(thread, method(thread), bcp(thread), h_klass, h_obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 fid, sig_type, &fvalue);
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1022
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 IRT_ENTRY(void, InterpreterRuntime::post_method_entry(JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 JvmtiExport::post_method_entry(thread, InterpreterRuntime::method(thread), InterpreterRuntime::last_frame(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1026
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 IRT_ENTRY(void, InterpreterRuntime::post_method_exit(JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 JvmtiExport::post_method_exit(thread, InterpreterRuntime::method(thread), InterpreterRuntime::last_frame(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1031
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 IRT_LEAF(int, InterpreterRuntime::interpreter_contains(address pc))
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 return (Interpreter::contains(pc) ? 1 : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // Implementation of SignatureHandlerLibrary
a61af66fc99e Initial load
duke
parents:
diff changeset
1040
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 address SignatureHandlerLibrary::set_handler_blob() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 BufferBlob* handler_blob = BufferBlob::create("native signature handlers", blob_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 if (handler_blob == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 }
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1046 address handler = handler_blob->code_begin();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 _handler_blob = handler_blob;
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 _handler = handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 return handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1051
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 void SignatureHandlerLibrary::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 if (_fingerprints != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 if (set_handler_blob() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 vm_exit_out_of_memory(blob_size, "native signature handlers");
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1059
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 BufferBlob* bb = BufferBlob::create("Signature Handler Temp Buffer",
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 SignatureHandlerLibrary::buffer_size);
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1062 _buffer = bb->code_begin();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1063
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6145
diff changeset
1064 _fingerprints = new(ResourceObj::C_HEAP, mtCode)GrowableArray<uint64_t>(32, true);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6145
diff changeset
1065 _handlers = new(ResourceObj::C_HEAP, mtCode)GrowableArray<address>(32, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1067
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 address SignatureHandlerLibrary::set_handler(CodeBuffer* buffer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 address handler = _handler;
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1070 int insts_size = buffer->pure_insts_size();
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1071 if (handler + insts_size > _handler_blob->code_end()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 // get a new handler blob
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 handler = set_handler_blob();
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 if (handler != NULL) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1076 memcpy(handler, buffer->insts_begin(), insts_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 pd_set_handler(handler);
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1078 ICache::invalidate_range(handler, insts_size);
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1079 _handler = handler + insts_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 return handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 void SignatureHandlerLibrary::add(methodHandle method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 if (method->signature_handler() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // use slow signature handler if we can't do better
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 int handler_index = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // check if we can use customized (fast) signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 if (UseFastSignatureHandlers && method->size_of_parameters() <= Fingerprinter::max_size_of_parameters) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // use customized signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 MutexLocker mu(SignatureHandlerLibrary_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 // make sure data structure is initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // lookup method signature's fingerprint
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 uint64_t fingerprint = Fingerprinter(method).fingerprint();
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 handler_index = _fingerprints->find(fingerprint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // create handler if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 if (handler_index < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 ptrdiff_t align_offset = (address)
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 round_to((intptr_t)_buffer, CodeEntryAlignment) - (address)_buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 CodeBuffer buffer((address)(_buffer + align_offset),
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 SignatureHandlerLibrary::buffer_size - align_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 InterpreterRuntime::SignatureHandlerGenerator(method, &buffer).generate(fingerprint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 // copy into code heap
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 address handler = set_handler(&buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 if (handler == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // use slow signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 // debugging suppport
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 if (PrintSignatureHandlers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 tty->print_cr("argument handler #%d for: %s %s (fingerprint = " UINT64_FORMAT ", %d bytes generated)",
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 _handlers->length(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 (method->is_static() ? "static" : "receiver"),
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 method->name_and_sig_as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 fingerprint,
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1118 buffer.insts_size());
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1119 Disassembler::decode(handler, handler + buffer.insts_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 tty->print_cr(" --- associated result handler ---");
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 address rh_begin = Interpreter::result_handler(method()->result_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 address rh_end = rh_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 while (*(int*)rh_end != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 rh_end += sizeof(int);
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 Disassembler::decode(rh_begin, rh_end);
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 // add handler to library
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 _fingerprints->append(fingerprint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 _handlers->append(handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // set handler index
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 assert(_fingerprints->length() == _handlers->length(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 handler_index = _fingerprints->length() - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 }
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1138 // Set handler under SignatureHandlerLibrary_lock
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 if (handler_index < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 // use generic signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 method->set_signature_handler(Interpreter::slow_signature_handler());
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // set handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 method->set_signature_handler(_handlers->at(handler_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 }
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1146 } else {
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1147 CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1148 // use generic signature handler
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1149 method->set_signature_handler(Interpreter::slow_signature_handler());
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1150 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 }
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1152 #ifdef ASSERT
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1153 int handler_index = -1;
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1154 int fingerprint_index = -2;
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1155 {
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1156 // '_handlers' and '_fingerprints' are 'GrowableArray's and are NOT synchronized
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1157 // in any way if accessed from multiple threads. To avoid races with another
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1158 // thread which may change the arrays in the above, mutex protected block, we
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1159 // have to protect this read access here with the same mutex as well!
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1160 MutexLocker mu(SignatureHandlerLibrary_lock);
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1161 if (_handlers != NULL) {
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1162 handler_index = _handlers->find(method->signature_handler());
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1163 fingerprint_index = _fingerprints->find(Fingerprinter(method).fingerprint());
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1164 }
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1165 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 assert(method->signature_handler() == Interpreter::slow_signature_handler() ||
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1167 handler_index == fingerprint_index, "sanity check");
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1168 #endif // ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1170
a61af66fc99e Initial load
duke
parents:
diff changeset
1171
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 BufferBlob* SignatureHandlerLibrary::_handler_blob = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 address SignatureHandlerLibrary::_handler = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 GrowableArray<uint64_t>* SignatureHandlerLibrary::_fingerprints = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 GrowableArray<address>* SignatureHandlerLibrary::_handlers = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 address SignatureHandlerLibrary::_buffer = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1177
a61af66fc99e Initial load
duke
parents:
diff changeset
1178
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1179 IRT_ENTRY(void, InterpreterRuntime::prepare_native_call(JavaThread* thread, Method* method))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 methodHandle m(thread, method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 assert(m->is_native(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 // lookup native function entry point if it doesn't exist
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 bool in_base_library;
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 if (!m->has_native_function()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 NativeLookup::lookup(m, in_base_library, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 // make sure signature handler is installed
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 SignatureHandlerLibrary::add(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 // The interpreter entry point checks the signature handler first,
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 // before trying to fetch the native entry point and klass mirror.
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 // We must set the signature handler last, so that multiple processors
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 // preparing the same method will be sure to see non-null entry & mirror.
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1194
3911
2fecca53a2c6 7085012: ARM: com/sun/jdi/PopSynchronousTest.java still fails
roland
parents: 3852
diff changeset
1195 #if defined(IA32) || defined(AMD64) || defined(ARM)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 IRT_LEAF(void, InterpreterRuntime::popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address))
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 if (src_address == dest_address) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 ResetNoHandleMark rnm; // In a LEAF entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 assert(fr.is_interpreted_frame(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 jint bci = fr.interpreter_frame_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 methodHandle mh(thread, fr.interpreter_frame_method());
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
1207 Bytecode_invoke invoke(mh, bci);
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
1208 ArgumentSizeComputer asc(invoke.signature());
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
1209 int size_of_arguments = (asc.size() + (invoke.has_receiver() ? 1 : 0)); // receiver
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1602
diff changeset
1210 Copy::conjoint_jbytes(src_address, dest_address,
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1213
diff changeset
1211 size_of_arguments * Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 #endif