annotate src/share/vm/interpreter/interpreterRuntime.cpp @ 3992:d1bdeef3e3e2

7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76 Summary: There is a race between one thread successfully forwarding and copying the klass mirror for the SoftReference class (including the static master clock) and another thread attempting to use the master clock while attempting to discover a soft reference object. Maintain a shadow copy of the soft reference master clock and use the shadow during reference discovery and reference processing. Reviewed-by: tonyp, brutisso, ysr
author johnc
date Wed, 12 Oct 2011 10:25:51 -0700
parents e6b1331a51d2
children 12d38ffcba2a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 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"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
29 #include "gc_interface/collectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
30 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
31 #include "interpreter/interpreterRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
32 #include "interpreter/linkResolver.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
33 #include "interpreter/templateTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
34 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
35 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
36 #include "oops/constantPoolOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
37 #include "oops/cpCacheOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
38 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
39 #include "oops/methodDataOop.hpp"
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.
a61af66fc99e Initial load
duke
parents:
diff changeset
101 methodDataOop mdo = last_frame(thread).interpreter_frame_method()->method_data();
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
a61af66fc99e Initial load
duke
parents:
diff changeset
115 constantPoolOop 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
a61af66fc99e Initial load
duke
parents:
diff changeset
119 if (tag.is_unresolved_klass() || tag.is_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
120 klassOop 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 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // If we entered this runtime routine, we believed the tag contained
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // an unresolved string, an unresolved class or a resolved class.
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // However, another thread could have resolved the unresolved string
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // or class by the time we go there.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 assert(tag.is_unresolved_string()|| tag.is_string(), "expected string");
a61af66fc99e Initial load
duke
parents:
diff changeset
130 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
131 oop s_oop = pool->string_at(index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 thread->set_vm_result(s_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
135
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
136 IRT_ENTRY(void, InterpreterRuntime::resolve_ldc(JavaThread* thread, Bytecodes::Code bytecode)) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
137 assert(bytecode == Bytecodes::_fast_aldc ||
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
138 bytecode == Bytecodes::_fast_aldc_w, "wrong bc");
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
139 ResourceMark rm(thread);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
140 methodHandle m (thread, method(thread));
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
141 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
142 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
143 #ifdef ASSERT
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
144 {
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
145 // 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
146 Bytecode_loadconstant ldc2(m, bci(thread));
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
147 ConstantPoolCacheEntry* cpce = m->constants()->cache()->entry_at(ldc2.cache_index());
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
148 assert(result == cpce->f1(), "expected result for assembly code");
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
149 }
7db2b9499c36 7046732: JSR 292 assert(result == cpce->f1()) failed: expected result for assembly code
never
parents: 2460
diff changeset
150 #endif
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
151 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
152 IRT_END
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
153
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 IRT_ENTRY(void, InterpreterRuntime::_new(JavaThread* thread, constantPoolOopDesc* pool, int index))
a61af66fc99e Initial load
duke
parents:
diff changeset
159 klassOop k_oop = pool->klass_at(index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
160 instanceKlassHandle klass (THREAD, k_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // Make sure we are not instantiating an abstract klass
a61af66fc99e Initial load
duke
parents:
diff changeset
163 klass->check_valid_for_instantiation(true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Make sure klass is initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
166 klass->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // At this point the class may not be fully initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // because of recursive initialization. If it is fully
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // initialized & has_finalized is not set, we rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // it into its fast version (Note: no locking is needed
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // here since this is an atomic byte write and can be
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // done more than once).
a61af66fc99e Initial load
duke
parents:
diff changeset
174 //
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // Note: In case of classes with has_finalized we don't
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // rewrite since that saves us an extra check in
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // the fast version which then would call the
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // slow version anyway (and do a call back into
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // Java).
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // If we have a breakpoint, then we don't rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // because the _breakpoint bytecode would be lost.
a61af66fc99e Initial load
duke
parents:
diff changeset
182 oop obj = klass->allocate_instance(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
183 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
184 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 IRT_ENTRY(void, InterpreterRuntime::newarray(JavaThread* thread, BasicType type, jint size))
a61af66fc99e Initial load
duke
parents:
diff changeset
188 oop obj = oopFactory::new_typeArray(type, 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::anewarray(JavaThread* thread, constantPoolOopDesc* pool, int index, jint size))
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Note: no oopHandle for pool & klass needed since they are not used
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // anymore after new_objArray() and no GC can happen before.
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // (This may have to change if this code changes!)
a61af66fc99e Initial load
duke
parents:
diff changeset
197 klassOop klass = pool->klass_at(index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 objArrayOop obj = oopFactory::new_objArray(klass, size, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
200 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 IRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // We may want to pass in more arguments - could make this slightly faster
a61af66fc99e Initial load
duke
parents:
diff changeset
205 constantPoolOop constants = method(thread)->constants();
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
206 int i = get_index_u2(thread, Bytecodes::_multianewarray);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
207 klassOop klass = constants->klass_at(i, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 int nof_dims = number_of_dimensions(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 assert(oop(klass)->is_klass(), "not a class");
a61af66fc99e Initial load
duke
parents:
diff changeset
210 assert(nof_dims >= 1, "multianewarray rank must be nonzero");
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // We must create an array of jints to pass to multi_allocate.
a61af66fc99e Initial load
duke
parents:
diff changeset
213 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
214 const int small_dims = 10;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 jint dim_array[small_dims];
a61af66fc99e Initial load
duke
parents:
diff changeset
216 jint *dims = &dim_array[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
217 if (nof_dims > small_dims) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 dims = (jint*) NEW_RESOURCE_ARRAY(jint, nof_dims);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 for (int index = 0; index < nof_dims; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // offset from first_size_address is addressed as local[index]
a61af66fc99e Initial load
duke
parents:
diff changeset
222 int n = Interpreter::local_offset_in_bytes(index)/jintSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 dims[index] = first_size_address[n];
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 oop obj = arrayKlass::cast(klass)->multi_allocate(nof_dims, dims, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 thread->set_vm_result(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
227 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 IRT_ENTRY(void, InterpreterRuntime::register_finalizer(JavaThread* thread, oopDesc* obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
231 assert(obj->is_oop(), "must be a valid oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
232 assert(obj->klass()->klass_part()->has_finalizer(), "shouldn't be here otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
233 instanceKlass::register_finalizer(instanceOop(obj), CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // Quicken instance-of and check-cast bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
238 IRT_ENTRY(void, InterpreterRuntime::quicken_io_cc(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Force resolving; quicken the bytecode
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
240 int which = get_index_u2(thread, Bytecodes::_checkcast);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
241 constantPoolOop cpool = method(thread)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // We'd expect to assert that we're only here to quicken bytecodes, but in a multithreaded
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // program we might have seen an unquick'd bytecode in the interpreter but have another
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // thread quicken the bytecode before we get here.
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // assert( cpool->tag_at(which).is_unresolved_klass(), "should only come here to quicken bytecodes" );
a61af66fc99e Initial load
duke
parents:
diff changeset
246 klassOop klass = cpool->klass_at(which, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
247 thread->set_vm_result(klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
248 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // Exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // Assume the compiler is (or will be) interested in this event.
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // If necessary, create an MDO to hold the information, and record it.
a61af66fc99e Initial load
duke
parents:
diff changeset
256 void InterpreterRuntime::note_trap(JavaThread* thread, int reason, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 assert(ProfileTraps, "call me only if profiling");
a61af66fc99e Initial load
duke
parents:
diff changeset
258 methodHandle trap_method(thread, method(thread));
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
259
0
a61af66fc99e Initial load
duke
parents:
diff changeset
260 if (trap_method.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 methodDataHandle trap_mdo(thread, trap_method->method_data());
a61af66fc99e Initial load
duke
parents:
diff changeset
262 if (trap_mdo.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 methodOopDesc::build_interpreter_method_data(trap_method, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
264 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
a61af66fc99e Initial load
duke
parents:
diff changeset
266 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268 trap_mdo = methodDataHandle(thread, trap_method->method_data());
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // and fall through...
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 if (trap_mdo.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // Update per-method count of trap events. The interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // is updating the MDO to simulate the effect of compiler traps.
a61af66fc99e Initial load
duke
parents:
diff changeset
274 int trap_bci = trap_method->bci_from(bcp(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
275 Deoptimization::update_method_data_from_interpreter(trap_mdo, trap_bci, reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 static Handle get_preinitialized_exception(klassOop k, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // get klass
a61af66fc99e Initial load
duke
parents:
diff changeset
282 instanceKlass* klass = instanceKlass::cast(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
283 assert(klass->is_initialized(),
a61af66fc99e Initial load
duke
parents:
diff changeset
284 "this klass should have been initialized during VM initialization");
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // create instance - do not call constructor since we may have no
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // (java) stack space left (should assert constructor is empty)
a61af66fc99e Initial load
duke
parents:
diff changeset
287 Handle exception;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 oop exception_oop = klass->allocate_instance(CHECK_(exception));
a61af66fc99e Initial load
duke
parents:
diff changeset
289 exception = Handle(THREAD, exception_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 if (StackTraceInThrowable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 java_lang_Throwable::fill_in_stack_trace(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293 return exception;
a61af66fc99e Initial load
duke
parents:
diff changeset
294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Special handling for stack overflow: since we don't have any (java) stack
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // space left we use the pre-allocated & pre-initialized StackOverflowError
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // klass to create an stack overflow error instance. We do not call its
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // constructor for the same reason (it is empty, anyway).
a61af66fc99e Initial load
duke
parents:
diff changeset
300 IRT_ENTRY(void, InterpreterRuntime::throw_StackOverflowError(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
301 Handle exception = get_preinitialized_exception(
a61af66fc99e Initial load
duke
parents:
diff changeset
302 SystemDictionary::StackOverflowError_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
303 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
304 THROW_HANDLE(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 IRT_ENTRY(void, InterpreterRuntime::create_exception(JavaThread* thread, char* name, char* message))
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // lookup exception klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
310 TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
311 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 if (s == vmSymbols::java_lang_ArithmeticException()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 note_trap(thread, Deoptimization::Reason_div0_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
314 } else if (s == vmSymbols::java_lang_NullPointerException()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 note_trap(thread, Deoptimization::Reason_null_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // create exception
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
319 Handle exception = Exceptions::new_exception(thread, s, message);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
320 thread->set_vm_result(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
321 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 IRT_ENTRY(void, InterpreterRuntime::create_klass_exception(JavaThread* thread, char* name, oopDesc* obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
325 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 const char* klass_name = Klass::cast(obj->klass())->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // lookup exception klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
328 TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
329 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 note_trap(thread, Deoptimization::Reason_class_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // 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
333 Handle exception = Exceptions::new_exception(thread, s, klass_name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
334 thread->set_vm_result(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
335 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 IRT_ENTRY(void, InterpreterRuntime::throw_ArrayIndexOutOfBoundsException(JavaThread* thread, char* name, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
339 char message[jintAsStringSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // lookup exception klass
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
341 TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
342 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
343 note_trap(thread, Deoptimization::Reason_range_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // create exception
a61af66fc99e Initial load
duke
parents:
diff changeset
346 sprintf(message, "%d", index);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
347 THROW_MSG(s, message);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
348 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 IRT_ENTRY(void, InterpreterRuntime::throw_ClassCastException(
a61af66fc99e Initial load
duke
parents:
diff changeset
351 JavaThread* thread, oopDesc* obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 char* message = SharedRuntime::generate_class_cast_message(
a61af66fc99e Initial load
duke
parents:
diff changeset
355 thread, Klass::cast(obj->klass())->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 note_trap(thread, Deoptimization::Reason_class_check, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // create exception
a61af66fc99e Initial load
duke
parents:
diff changeset
362 THROW_MSG(vmSymbols::java_lang_ClassCastException(), message);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // exception_handler_for_exception(...) returns the continuation address,
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // the exception oop (via TLS) and sets the bci/bcp for the continuation.
a61af66fc99e Initial load
duke
parents:
diff changeset
367 // The exception oop is returned to make sure it is preserved over GC (it
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // is only on the stack if the exception was thrown explicitly via athrow).
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // During this operation, the expression stack contains the values for the
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // bci where the exception happened. If the exception was propagated back
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // from a call, the expression stack contains the values for the bci at the
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // invoke w/o arguments (i.e., as if one were inside the call).
a61af66fc99e Initial load
duke
parents:
diff changeset
373 IRT_ENTRY(address, InterpreterRuntime::exception_handler_for_exception(JavaThread* thread, oopDesc* exception))
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 Handle h_exception(thread, exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
376 methodHandle h_method (thread, method(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
377 constantPoolHandle h_constants(thread, h_method->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
378 typeArrayHandle h_extable (thread, h_method->exception_table());
a61af66fc99e Initial load
duke
parents:
diff changeset
379 bool should_repeat;
a61af66fc99e Initial load
duke
parents:
diff changeset
380 int handler_bci;
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
381 int current_bci = bci(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // Need to do this check first since when _do_not_unlock_if_synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // is set, we don't want to trigger any classloading which may make calls
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // into java, or surprisingly find a matching exception handler for bci 0
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // since at this moment the method hasn't been "officially" entered yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
387 if (thread->do_not_unlock_if_synchronized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
388 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 assert(current_bci == 0, "bci isn't zero for do_not_unlock_if_synchronized");
a61af66fc99e Initial load
duke
parents:
diff changeset
390 thread->set_vm_result(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
391 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
392 return (address) -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
393 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
394 return Interpreter::remove_activation_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
395 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
399 should_repeat = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // assertions
a61af66fc99e Initial load
duke
parents:
diff changeset
402 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
403 assert(h_exception.not_null(), "NULL exceptions should be handled by athrow");
a61af66fc99e Initial load
duke
parents:
diff changeset
404 assert(h_exception->is_oop(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // 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
406 if (!(h_exception->is_a(SystemDictionary::Throwable_klass()))) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
407 if (ExitVMOnVerifyError) vm_exit(-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // tracing
a61af66fc99e Initial load
duke
parents:
diff changeset
413 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
414 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
415 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
416 tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", h_exception->print_value_string(), (address)h_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
417 tty->print_cr(" thrown in interpreter method <%s>", h_method->print_value_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
418 tty->print_cr(" at bci %d for thread " INTPTR_FORMAT, current_bci, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // Don't go paging in something which won't be used.
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // else if (h_extable->length() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // // disabled for now - interpreter is not using shortcut yet
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // // (shortcut is not to call runtime if we have no exception handlers)
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // // warning("performance bug: should not call runtime if method has no exception handlers");
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // for AbortVMOnException flag
a61af66fc99e Initial load
duke
parents:
diff changeset
427 NOT_PRODUCT(Exceptions::debug_check_abort(h_exception));
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // exception handler lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
430 KlassHandle h_klass(THREAD, h_exception->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
431 handler_bci = h_method->fast_exception_handler_bci_for(h_klass, current_bci, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
432 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // We threw an exception while trying to find the exception handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // Transfer the new exception to the exception handle which will
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // be set into thread local storage, and do another lookup for an
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // exception handler for this exception, this time starting at the
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // BCI of the exception handler which caused the exception to be
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // thrown (bug 4307310).
a61af66fc99e Initial load
duke
parents:
diff changeset
439 h_exception = Handle(THREAD, PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
440 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
441 if (handler_bci >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
442 current_bci = handler_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
443 should_repeat = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
446 } while (should_repeat == true);
a61af66fc99e Initial load
duke
parents:
diff changeset
447
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.
a61af66fc99e Initial load
duke
parents:
diff changeset
538 instanceKlass *klass = instanceKlass::cast(info.klass()->as_klassOop());
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
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
550 if (is_put && !is_static && klass->is_subclass_of(SystemDictionary::CallSite_klass()) && (info.name() == vmSymbols::target_name())) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
551 const jint direction = frame::interpreter_frame_expression_stack_direction();
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
552 oop call_site = *((oop*) thread->last_frame().interpreter_frame_tos_at(-1 * direction));
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
553 oop method_handle = *((oop*) thread->last_frame().interpreter_frame_tos_at( 0 * direction));
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
554 assert(call_site ->is_a(SystemDictionary::CallSite_klass()), "must be");
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
555 assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), "must be");
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
556
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
557 {
3901
aa67216400d3 7085404: JSR 292: VolatileCallSites should have push notification too
twisti
parents: 3852
diff changeset
558 // Walk all nmethods depending on this call site.
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
559 MutexLocker mu(Compile_lock, thread);
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
560 Universe::flush_dependents_on(call_site, method_handle);
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
561 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
562
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
563 // Don't allow fast path for setting CallSite.target and sub-classes.
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
564 put_code = (Bytecodes::Code) 0;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
565 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3791
diff changeset
566
0
a61af66fc99e Initial load
duke
parents:
diff changeset
567 cache_entry(thread)->set_field(
a61af66fc99e Initial load
duke
parents:
diff changeset
568 get_code,
a61af66fc99e Initial load
duke
parents:
diff changeset
569 put_code,
a61af66fc99e Initial load
duke
parents:
diff changeset
570 info.klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
571 info.field_index(),
a61af66fc99e Initial load
duke
parents:
diff changeset
572 info.field_offset(),
a61af66fc99e Initial load
duke
parents:
diff changeset
573 state,
a61af66fc99e Initial load
duke
parents:
diff changeset
574 info.access_flags().is_final(),
a61af66fc99e Initial load
duke
parents:
diff changeset
575 info.access_flags().is_volatile()
a61af66fc99e Initial load
duke
parents:
diff changeset
576 );
a61af66fc99e Initial load
duke
parents:
diff changeset
577 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
581 // Synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
582 //
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // The interpreter's synchronization code is factored out so that it can
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // be shared by method invocation and synchronized blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
585 //%note synchronization_3
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 static void trace_locking(Handle& h_locking_obj, bool is_locking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
588 ObjectSynchronizer::trace_locking(h_locking_obj, false, true, is_locking);
a61af66fc99e Initial load
duke
parents:
diff changeset
589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 //%note monitor_1
a61af66fc99e Initial load
duke
parents:
diff changeset
593 IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorenter(JavaThread* thread, BasicObjectLock* elem))
a61af66fc99e Initial load
duke
parents:
diff changeset
594 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
595 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
596 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
597 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
598 Atomic::inc(BiasedLocking::slow_path_entry_count_addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
600 Handle h_obj(thread, elem->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
601 assert(Universe::heap()->is_in_reserved_or_null(h_obj()),
a61af66fc99e Initial load
duke
parents:
diff changeset
602 "must be NULL or an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
603 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // Retry fast entry if bias is revoked to avoid unnecessary inflation
a61af66fc99e Initial load
duke
parents:
diff changeset
605 ObjectSynchronizer::fast_enter(h_obj, elem->lock(), true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
606 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
607 ObjectSynchronizer::slow_enter(h_obj, elem->lock(), CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
609 assert(Universe::heap()->is_in_reserved_or_null(elem->obj()),
a61af66fc99e Initial load
duke
parents:
diff changeset
610 "must be NULL or an object");
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 //%note monitor_1
a61af66fc99e Initial load
duke
parents:
diff changeset
618 IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorexit(JavaThread* thread, BasicObjectLock* elem))
a61af66fc99e Initial load
duke
parents:
diff changeset
619 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
620 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
621 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
622 Handle h_obj(thread, elem->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
623 assert(Universe::heap()->is_in_reserved_or_null(h_obj()),
a61af66fc99e Initial load
duke
parents:
diff changeset
624 "must be NULL or an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
625 if (elem == NULL || h_obj()->is_unlocked()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
626 THROW(vmSymbols::java_lang_IllegalMonitorStateException());
a61af66fc99e Initial load
duke
parents:
diff changeset
627 }
a61af66fc99e Initial load
duke
parents:
diff changeset
628 ObjectSynchronizer::slow_exit(h_obj(), elem->lock(), thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // Free entry. This must be done here, since a pending exception might be installed on
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // exit. If it is not cleared, the exception handling code will try to unlock the monitor again.
a61af66fc99e Initial load
duke
parents:
diff changeset
631 elem->set_obj(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
632 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
633 thread->last_frame().interpreter_frame_verify_monitor(elem);
a61af66fc99e Initial load
duke
parents:
diff changeset
634 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
635 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
636
a61af66fc99e Initial load
duke
parents:
diff changeset
637
a61af66fc99e Initial load
duke
parents:
diff changeset
638 IRT_ENTRY(void, InterpreterRuntime::throw_illegal_monitor_state_exception(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
639 THROW(vmSymbols::java_lang_IllegalMonitorStateException());
a61af66fc99e Initial load
duke
parents:
diff changeset
640 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 IRT_ENTRY(void, InterpreterRuntime::new_illegal_monitor_state_exception(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
644 // Returns an illegal exception to install into the current thread. The
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // pending_exception flag is cleared so normal exception handling does not
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // trigger. Any current installed exception will be overwritten. This
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // method will be called during an exception unwind.
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649 assert(!HAS_PENDING_EXCEPTION, "no pending exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
650 Handle exception(thread, thread->vm_result());
a61af66fc99e Initial load
duke
parents:
diff changeset
651 assert(exception() != NULL, "vm result should be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
652 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
653 if (!exception->is_a(SystemDictionary::ThreadDeath_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
654 exception = get_preinitialized_exception(
a61af66fc99e Initial load
duke
parents:
diff changeset
655 SystemDictionary::IllegalMonitorStateException_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
656 CATCH);
a61af66fc99e Initial load
duke
parents:
diff changeset
657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
658 thread->set_vm_result(exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
659 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // Invokes
a61af66fc99e Initial load
duke
parents:
diff changeset
664
a61af66fc99e Initial load
duke
parents:
diff changeset
665 IRT_ENTRY(Bytecodes::Code, InterpreterRuntime::get_original_bytecode_at(JavaThread* thread, methodOopDesc* method, address bcp))
a61af66fc99e Initial load
duke
parents:
diff changeset
666 return method->orig_bytecode_at(method->bci_from(bcp));
a61af66fc99e Initial load
duke
parents:
diff changeset
667 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
668
a61af66fc99e Initial load
duke
parents:
diff changeset
669 IRT_ENTRY(void, InterpreterRuntime::set_original_bytecode_at(JavaThread* thread, methodOopDesc* method, address bcp, Bytecodes::Code new_code))
a61af66fc99e Initial load
duke
parents:
diff changeset
670 method->set_orig_bytecode_at(method->bci_from(bcp), new_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
671 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 IRT_ENTRY(void, InterpreterRuntime::_breakpoint(JavaThread* thread, methodOopDesc* method, address bcp))
a61af66fc99e Initial load
duke
parents:
diff changeset
674 JvmtiExport::post_raw_breakpoint(thread, method, bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
675 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
676
a61af66fc99e Initial load
duke
parents:
diff changeset
677 IRT_ENTRY(void, InterpreterRuntime::resolve_invoke(JavaThread* thread, Bytecodes::Code bytecode))
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // extract receiver from the outgoing argument list if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
679 Handle receiver(thread, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
680 if (bytecode == Bytecodes::_invokevirtual || bytecode == Bytecodes::_invokeinterface) {
a61af66fc99e Initial load
duke
parents:
diff changeset
681 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
682 methodHandle m (thread, method(thread));
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
683 Bytecode_invoke call(m, bci(thread));
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
684 Symbol* signature = call.signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
685 receiver = Handle(thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
686 thread->last_frame().interpreter_callee_receiver(signature));
a61af66fc99e Initial load
duke
parents:
diff changeset
687 assert(Universe::heap()->is_in_reserved_or_null(receiver()),
a61af66fc99e Initial load
duke
parents:
diff changeset
688 "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
689 assert(receiver.is_null() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
690 Universe::heap()->is_in_reserved(receiver->klass()),
a61af66fc99e Initial load
duke
parents:
diff changeset
691 "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
693
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // resolve method
a61af66fc99e Initial load
duke
parents:
diff changeset
695 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
696 constantPoolHandle pool(thread, method(thread)->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 {
a61af66fc99e Initial load
duke
parents:
diff changeset
699 JvmtiHideSingleStepping jhss(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
700 LinkResolver::resolve_invoke(info, receiver, pool,
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
701 get_index_u2_cpcache(thread, bytecode), bytecode, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
702 if (JvmtiExport::can_hotswap_or_post_breakpoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
703 int retry_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
704 while (info.resolved_method()->is_old()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
705 // It is very unlikely that method is redefined more than 100 times
a61af66fc99e Initial load
duke
parents:
diff changeset
706 // in the middle of resolve. If it is looping here more than 100 times
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // means then there could be a bug here.
a61af66fc99e Initial load
duke
parents:
diff changeset
708 guarantee((retry_count++ < 100),
a61af66fc99e Initial load
duke
parents:
diff changeset
709 "Could not resolve to latest version of redefined method");
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // method is redefined in the middle of resolve so re-try.
a61af66fc99e Initial load
duke
parents:
diff changeset
711 LinkResolver::resolve_invoke(info, receiver, pool,
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1507
diff changeset
712 get_index_u2_cpcache(thread, bytecode), bytecode, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
714 }
a61af66fc99e Initial load
duke
parents:
diff changeset
715 } // end JvmtiHideSingleStepping
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // check if link resolution caused cpCache to be updated
a61af66fc99e Initial load
duke
parents:
diff changeset
718 if (already_resolved(thread)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 if (bytecode == Bytecodes::_invokeinterface) {
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 if (TraceItables && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
723 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
724 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
725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
726 if (info.resolved_method()->method_holder() ==
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1138
diff changeset
727 SystemDictionary::Object_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
728 // NOTE: THIS IS A FIX FOR A CORNER CASE in the JVM spec
a61af66fc99e Initial load
duke
parents:
diff changeset
729 // (see also cpCacheOop.cpp for details)
a61af66fc99e Initial load
duke
parents:
diff changeset
730 methodHandle rm = info.resolved_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
731 assert(rm->is_final() || info.has_vtable_index(),
a61af66fc99e Initial load
duke
parents:
diff changeset
732 "should have been set already");
a61af66fc99e Initial load
duke
parents:
diff changeset
733 cache_entry(thread)->set_method(bytecode, rm, info.vtable_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
734 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
735 // Setup itable entry
a61af66fc99e Initial load
duke
parents:
diff changeset
736 int index = klassItable::compute_itable_index(info.resolved_method()());
a61af66fc99e Initial load
duke
parents:
diff changeset
737 cache_entry(thread)->set_interface_call(info.resolved_method(), index);
a61af66fc99e Initial load
duke
parents:
diff changeset
738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
739 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
740 cache_entry(thread)->set_method(
a61af66fc99e Initial load
duke
parents:
diff changeset
741 bytecode,
a61af66fc99e Initial load
duke
parents:
diff changeset
742 info.resolved_method(),
a61af66fc99e Initial load
duke
parents:
diff changeset
743 info.vtable_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
744 }
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 ResourceMark rm(thread);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
751
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
752 assert(EnableInvokeDynamic, "");
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
753
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
754 const Bytecodes::Code bytecode = Bytecodes::_invokedynamic;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
755
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
756 methodHandle caller_method(thread, method(thread));
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
757
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
758 constantPoolHandle pool(thread, caller_method->constants());
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
759 pool->set_invokedynamic(); // mark header to flag active call sites
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
760
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
761 int caller_bci = 0;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
762 int site_index = 0;
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
763 { address caller_bcp = bcp(thread);
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
764 caller_bci = caller_method->bci_from(caller_bcp);
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
765 site_index = Bytes::get_native_u4(caller_bcp+1);
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
766 }
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
767 assert(site_index == InterpreterRuntime::bytecode(thread).get_index_u4(bytecode), "");
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
768 assert(constantPoolCacheOopDesc::is_secondary_index(site_index), "proper format");
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 941
diff changeset
769 // there is a second CPC entries that is of interest; it caches signature info:
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 941
diff changeset
770 int main_index = pool->cache()->secondary_entry_at(site_index)->main_entry_index();
1913
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1903
diff changeset
771 int pool_index = pool->cache()->entry_at(main_index)->constant_pool_index();
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
772
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
773 // first resolve the signature to a MH.invoke methodOop
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
774 if (!pool->cache()->entry_at(main_index)->is_resolved(bytecode)) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
775 JvmtiHideSingleStepping jhss(thread);
1903
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
776 CallInfo callinfo;
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
777 LinkResolver::resolve_invoke(callinfo, Handle(), pool,
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 941
diff changeset
778 site_index, bytecode, CHECK);
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
779 // The main entry corresponds to a JVM_CONSTANT_InvokeDynamic, and serves
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
780 // as a common reference point for all invokedynamic call sites with
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
781 // that exact call descriptor. We will link it in the CP cache exactly
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
782 // as if it were an invokevirtual of MethodHandle.invoke.
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
783 pool->cache()->entry_at(main_index)->set_method(
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
784 bytecode,
1903
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
785 callinfo.resolved_method(),
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
786 callinfo.vtable_index());
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
787 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
788
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
789 // The method (f2 entry) of the main entry is the MH.invoke for the
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
790 // invokedynamic target call signature.
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
791 oop f1_value = pool->cache()->entry_at(main_index)->f1();
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
792 methodHandle signature_invoker(THREAD, (methodOop) f1_value);
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
793 assert(signature_invoker.not_null() && signature_invoker->is_method() && signature_invoker->is_method_handle_invoke(),
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
794 "correct result from LinkResolver::resolve_invokedynamic");
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
795
1913
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1903
diff changeset
796 Handle info; // optional argument(s) in JVM_CONSTANT_InvokeDynamic
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
797 Handle bootm = SystemDictionary::find_bootstrap_method(caller_method, caller_bci,
1913
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1903
diff changeset
798 main_index, info, CHECK);
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2194
diff changeset
799 if (!java_lang_invoke_MethodHandle::is_instance(bootm())) {
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
800 THROW_MSG(vmSymbols::java_lang_IllegalStateException(),
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
801 "no bootstrap method found for invokedynamic");
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
802 }
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
803
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
804 // Short circuit if CallSite has been bound already:
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
805 if (!pool->cache()->secondary_entry_at(site_index)->is_f1_null())
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
806 return;
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1603
diff changeset
807
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2144
diff changeset
808 Symbol* call_site_name = pool->name_ref_at(site_index);
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
809
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
810 Handle call_site
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
811 = SystemDictionary::make_dynamic_call_site(bootm,
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
812 // Callee information:
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
813 call_site_name,
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
814 signature_invoker,
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
815 info,
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
816 // Caller information:
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
817 caller_method,
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
818 caller_bci,
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
819 CHECK);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
820
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
821 // In the secondary entry, the f1 field is the call site, and the f2 (index)
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
822 // field is some data about the invoke site. Currently, it is just the BCI.
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
823 // Later, it might be changed to help manage inlining dependencies.
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1506
diff changeset
824 pool->cache()->secondary_entry_at(site_index)->set_dynamic_call(call_site, signature_invoker);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
825 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
826 IRT_END
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
827
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
828
0
a61af66fc99e Initial load
duke
parents:
diff changeset
829 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
830 // Miscellaneous
a61af66fc99e Initial load
duke
parents:
diff changeset
831
a61af66fc99e Initial load
duke
parents:
diff changeset
832
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
833 nmethod* InterpreterRuntime::frequency_counter_overflow(JavaThread* thread, address branch_bcp) {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
834 nmethod* nm = frequency_counter_overflow_inner(thread, branch_bcp);
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
835 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
836 if (branch_bcp != NULL && nm != NULL) {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
837 // This was a successful request for an OSR nmethod. Because
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
838 // frequency_counter_overflow_inner ends with a safepoint check,
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
839 // 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
840 // to examine nm directly since it might have been freed and used
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
841 // for something else.
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
842 frame fr = thread->last_frame();
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
843 methodOop method = fr.interpreter_frame_method();
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
844 int bci = method->bci_from(fr.interpreter_frame_bcp());
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
845 nm = method->lookup_osr_nmethod_for(bci, CompLevel_none, false);
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
846 }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
847 return nm;
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
848 }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
849
0
a61af66fc99e Initial load
duke
parents:
diff changeset
850 IRT_ENTRY(nmethod*,
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 726
diff changeset
851 InterpreterRuntime::frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
852 // use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // flag, in case this method triggers classloading which will call into Java.
a61af66fc99e Initial load
duke
parents:
diff changeset
854 UnlockFlagSaver fs(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
857 assert(fr.is_interpreted_frame(), "must come from interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
858 methodHandle method(thread, fr.interpreter_frame_method());
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
859 const int branch_bci = branch_bcp != NULL ? method->bci_from(branch_bcp) : InvocationEntryBci;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
860 const int bci = branch_bcp != NULL ? method->bci_from(fr.interpreter_frame_bcp()) : InvocationEntryBci;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
861
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3781
diff changeset
862 nmethod* osr_nm = CompilationPolicy::policy()->event(method, method, branch_bci, bci, CompLevel_none, NULL, thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
863
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
864 if (osr_nm != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
865 // We may need to do on-stack replacement which requires that no
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
866 // monitors in the activation are biased because their
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
867 // BasicObjectLocks will need to migrate during OSR. Force
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
868 // unbiasing of all monitors in the activation now (even though
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
869 // the OSR nmethod might be invalidated) because we don't have a
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
870 // safepoint opportunity later once the migration begins.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
871 if (UseBiasedLocking) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
872 ResourceMark rm;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
873 GrowableArray<Handle>* objects_to_revoke = new GrowableArray<Handle>();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
874 for( BasicObjectLock *kptr = fr.interpreter_frame_monitor_end();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
875 kptr < fr.interpreter_frame_monitor_begin();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
876 kptr = fr.next_monitor_in_interpreter_frame(kptr) ) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
877 if( kptr->obj() != NULL ) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
878 objects_to_revoke->append(Handle(THREAD, kptr->obj()));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
879 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
880 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
881 BiasedLocking::revoke(objects_to_revoke);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
883 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1748
diff changeset
884 return osr_nm;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
885 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887 IRT_LEAF(jint, InterpreterRuntime::bcp_to_di(methodOopDesc* method, address cur_bcp))
a61af66fc99e Initial load
duke
parents:
diff changeset
888 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
889 int bci = method->bci_from(cur_bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 methodDataOop mdo = method->method_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
891 if (mdo == NULL) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
892 return mdo->bci_to_di(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
893 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
894
2118
dd031b2226de 4930919: race condition in MDO creation at back branch locations
iveresov
parents: 1986
diff changeset
895 IRT_ENTRY(void, InterpreterRuntime::profile_method(JavaThread* thread))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // flag, in case this method triggers classloading which will call into Java.
a61af66fc99e Initial load
duke
parents:
diff changeset
898 UnlockFlagSaver fs(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 assert(ProfileInterpreter, "must be profiling interpreter");
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");
a61af66fc99e Initial load
duke
parents:
diff changeset
903 methodHandle method(thread, fr.interpreter_frame_method());
a61af66fc99e Initial load
duke
parents:
diff changeset
904 methodOopDesc::build_interpreter_method_data(method, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
905 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
906 assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
a61af66fc99e Initial load
duke
parents:
diff changeset
907 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // and fall through...
a61af66fc99e Initial load
duke
parents:
diff changeset
909 }
a61af66fc99e Initial load
duke
parents:
diff changeset
910 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912
a61af66fc99e Initial load
duke
parents:
diff changeset
913 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
914 IRT_LEAF(void, InterpreterRuntime::verify_mdp(methodOopDesc* method, address bcp, address mdp))
a61af66fc99e Initial load
duke
parents:
diff changeset
915 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
916
a61af66fc99e Initial load
duke
parents:
diff changeset
917 methodDataOop mdo = method->method_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
918 assert(mdo != NULL, "must not be null");
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 int bci = method->bci_from(bcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
921
a61af66fc99e Initial load
duke
parents:
diff changeset
922 address mdp2 = mdo->bci_to_dp(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
923 if (mdp != mdp2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
924 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
925 ResetNoHandleMark rnm; // In a LEAF entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
926 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
927 tty->print_cr("FAILED verify : actual mdp %p expected mdp %p @ bci %d", mdp, mdp2, bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
928 int current_di = mdo->dp_to_di(mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
929 int expected_di = mdo->dp_to_di(mdp2);
a61af66fc99e Initial load
duke
parents:
diff changeset
930 tty->print_cr(" actual di %d expected di %d", current_di, expected_di);
a61af66fc99e Initial load
duke
parents:
diff changeset
931 int expected_approx_bci = mdo->data_at(expected_di)->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
932 int approx_bci = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
933 if (current_di >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
934 approx_bci = mdo->data_at(current_di)->bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936 tty->print_cr(" actual bci is %d expected bci %d", approx_bci, expected_approx_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
937 mdo->print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
938 method->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
939 }
a61af66fc99e Initial load
duke
parents:
diff changeset
940 assert(mdp == mdp2, "wrong mdp");
a61af66fc99e Initial load
duke
parents:
diff changeset
941 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
942 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944 IRT_ENTRY(void, InterpreterRuntime::update_mdp_for_ret(JavaThread* thread, int return_bci))
a61af66fc99e Initial load
duke
parents:
diff changeset
945 assert(ProfileInterpreter, "must be profiling interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
946 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
947 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
948 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
949 assert(fr.is_interpreted_frame(), "must come from interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
950 methodDataHandle h_mdo(thread, fr.interpreter_frame_method()->method_data());
a61af66fc99e Initial load
duke
parents:
diff changeset
951
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // Grab a lock to ensure atomic access to setting the return bci and
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // the displacement. This can block and GC, invalidating all naked oops.
a61af66fc99e Initial load
duke
parents:
diff changeset
954 MutexLocker ml(RetData_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
955
a61af66fc99e Initial load
duke
parents:
diff changeset
956 // ProfileData is essentially a wrapper around a derived oop, so we
a61af66fc99e Initial load
duke
parents:
diff changeset
957 // need to take the lock before making any ProfileData structures.
a61af66fc99e Initial load
duke
parents:
diff changeset
958 ProfileData* data = h_mdo->data_at(h_mdo->dp_to_di(fr.interpreter_frame_mdp()));
a61af66fc99e Initial load
duke
parents:
diff changeset
959 RetData* rdata = data->as_RetData();
a61af66fc99e Initial load
duke
parents:
diff changeset
960 address new_mdp = rdata->fixup_ret(return_bci, h_mdo);
a61af66fc99e Initial load
duke
parents:
diff changeset
961 fr.interpreter_frame_set_mdp(new_mdp);
a61af66fc99e Initial load
duke
parents:
diff changeset
962 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
963
a61af66fc99e Initial load
duke
parents:
diff changeset
964
a61af66fc99e Initial load
duke
parents:
diff changeset
965 IRT_ENTRY(void, InterpreterRuntime::at_safepoint(JavaThread* thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
966 // We used to need an explict preserve_arguments here for invoke bytecodes. However,
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // stack traversal automatically takes care of preserving arguments for invoke, so
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // this is no longer needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
969
a61af66fc99e Initial load
duke
parents:
diff changeset
970 // IRT_END does an implicit safepoint check, hence we are guaranteed to block
a61af66fc99e Initial load
duke
parents:
diff changeset
971 // if this is called during a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973 if (JvmtiExport::should_post_single_step()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // We are called during regular safepoints and when the VM is
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // single stepping. If any thread is marked for single stepping,
a61af66fc99e Initial load
duke
parents:
diff changeset
976 // then we may have JVMTI work to do.
a61af66fc99e Initial load
duke
parents:
diff changeset
977 JvmtiExport::at_single_stepping_point(thread, method(thread), bcp(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
979 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
980
a61af66fc99e Initial load
duke
parents:
diff changeset
981 IRT_ENTRY(void, InterpreterRuntime::post_field_access(JavaThread *thread, oopDesc* obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
982 ConstantPoolCacheEntry *cp_entry))
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 // 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
985
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2357
diff changeset
986 instanceKlass* ik = instanceKlass::cast(java_lang_Class::as_klassOop(cp_entry->f1()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
987 int index = cp_entry->field_index();
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3912
diff changeset
988 if ((ik->field_access_flags(index) & JVM_ACC_FIELD_ACCESS_WATCHED) == 0) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990 switch(cp_entry->flag_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
991 case btos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
992 case ctos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
993 case stos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
994 case itos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
995 case ftos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
996 case ltos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
997 case dtos: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
998 case atos: break;
a61af66fc99e Initial load
duke
parents:
diff changeset
999 default: ShouldNotReachHere(); return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 bool is_static = (obj == NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 Handle h_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 // non-static field accessors have an object, but we need a handle
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 h_obj = Handle(thread, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 }
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2357
diff changeset
1009 instanceKlassHandle h_cp_entry_f1(thread, java_lang_Class::as_klassOop(cp_entry->f1()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 jfieldID fid = jfieldIDWorkaround::to_jfieldID(h_cp_entry_f1, cp_entry->f2(), is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 JvmtiExport::post_field_access(thread, method(thread), bcp(thread), h_cp_entry_f1, h_obj, fid);
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1013
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 IRT_ENTRY(void, InterpreterRuntime::post_field_modification(JavaThread *thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 oopDesc* obj, ConstantPoolCacheEntry *cp_entry, jvalue *value))
a61af66fc99e Initial load
duke
parents:
diff changeset
1016
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2357
diff changeset
1017 klassOop k = java_lang_Class::as_klassOop(cp_entry->f1());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 // check the access_flags for the field in the klass
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 instanceKlass* ik = instanceKlass::cast(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 int index = cp_entry->field_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // bail out if field modifications are not watched
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3912
diff changeset
1023 if ((ik->field_access_flags(index) & JVM_ACC_FIELD_MODIFICATION_WATCHED) == 0) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 char sig_type = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1026
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 switch(cp_entry->flag_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 case btos: sig_type = 'Z'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 case ctos: sig_type = 'C'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 case stos: sig_type = 'S'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 case itos: sig_type = 'I'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 case ftos: sig_type = 'F'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 case atos: sig_type = 'L'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 case ltos: sig_type = 'J'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 case dtos: sig_type = 'D'; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 default: ShouldNotReachHere(); return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 bool is_static = (obj == NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1039
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 instanceKlassHandle h_klass(thread, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 jfieldID fid = jfieldIDWorkaround::to_jfieldID(h_klass, cp_entry->f2(), is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 jvalue fvalue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 fvalue = *value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 // Long/double values are stored unaligned and also noncontiguously with
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 // tagged stacks. We can't just do a simple assignment even in the non-
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 // J/D cases because a C++ compiler is allowed to assume that a jvalue is
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 // 8-byte aligned, and interpreter stack slots are only 4-byte aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 // We assume that the two halves of longs/doubles are stored in interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // stack slots in platform-endian order.
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 jlong_accessor u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 jint* newval = (jint*)value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 u.words[0] = newval[0];
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1213
diff changeset
1056 u.words[1] = newval[Interpreter::stackElementWords]; // skip if tag
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 fvalue.j = u.long_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1059
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 Handle h_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 // non-static field accessors have an object, but we need a handle
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 h_obj = Handle(thread, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1065
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 JvmtiExport::post_raw_field_modification(thread, method(thread), bcp(thread), h_klass, h_obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 fid, sig_type, &fvalue);
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1069
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 IRT_ENTRY(void, InterpreterRuntime::post_method_entry(JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 JvmtiExport::post_method_entry(thread, InterpreterRuntime::method(thread), InterpreterRuntime::last_frame(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1073
a61af66fc99e Initial load
duke
parents:
diff changeset
1074
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 IRT_ENTRY(void, InterpreterRuntime::post_method_exit(JavaThread *thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 JvmtiExport::post_method_exit(thread, InterpreterRuntime::method(thread), InterpreterRuntime::last_frame(thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 IRT_LEAF(int, InterpreterRuntime::interpreter_contains(address pc))
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 return (Interpreter::contains(pc) ? 1 : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1084
a61af66fc99e Initial load
duke
parents:
diff changeset
1085
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // Implementation of SignatureHandlerLibrary
a61af66fc99e Initial load
duke
parents:
diff changeset
1087
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 address SignatureHandlerLibrary::set_handler_blob() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 BufferBlob* handler_blob = BufferBlob::create("native signature handlers", blob_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 if (handler_blob == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 }
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1093 address handler = handler_blob->code_begin();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 _handler_blob = handler_blob;
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 _handler = handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 return handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1098
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 void SignatureHandlerLibrary::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 if (_fingerprints != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 if (set_handler_blob() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 vm_exit_out_of_memory(blob_size, "native signature handlers");
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1106
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 BufferBlob* bb = BufferBlob::create("Signature Handler Temp Buffer",
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 SignatureHandlerLibrary::buffer_size);
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1109 _buffer = bb->code_begin();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1110
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 _fingerprints = new(ResourceObj::C_HEAP)GrowableArray<uint64_t>(32, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 _handlers = new(ResourceObj::C_HEAP)GrowableArray<address>(32, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1114
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 address SignatureHandlerLibrary::set_handler(CodeBuffer* buffer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 address handler = _handler;
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1117 int insts_size = buffer->pure_insts_size();
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1118 if (handler + insts_size > _handler_blob->code_end()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // get a new handler blob
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 handler = set_handler_blob();
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 if (handler != NULL) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1123 memcpy(handler, buffer->insts_begin(), insts_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 pd_set_handler(handler);
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1125 ICache::invalidate_range(handler, insts_size);
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1126 _handler = handler + insts_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 return handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 void SignatureHandlerLibrary::add(methodHandle method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 if (method->signature_handler() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // use slow signature handler if we can't do better
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 int handler_index = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 // check if we can use customized (fast) signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 if (UseFastSignatureHandlers && method->size_of_parameters() <= Fingerprinter::max_size_of_parameters) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 // use customized signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 MutexLocker mu(SignatureHandlerLibrary_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // make sure data structure is initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 // lookup method signature's fingerprint
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 uint64_t fingerprint = Fingerprinter(method).fingerprint();
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 handler_index = _fingerprints->find(fingerprint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 // create handler if necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 if (handler_index < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 ptrdiff_t align_offset = (address)
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 round_to((intptr_t)_buffer, CodeEntryAlignment) - (address)_buffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 CodeBuffer buffer((address)(_buffer + align_offset),
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 SignatureHandlerLibrary::buffer_size - align_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 InterpreterRuntime::SignatureHandlerGenerator(method, &buffer).generate(fingerprint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 // copy into code heap
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 address handler = set_handler(&buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 if (handler == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 // use slow signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 // debugging suppport
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 if (PrintSignatureHandlers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 tty->print_cr("argument handler #%d for: %s %s (fingerprint = " UINT64_FORMAT ", %d bytes generated)",
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 _handlers->length(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 (method->is_static() ? "static" : "receiver"),
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 method->name_and_sig_as_C_string(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 fingerprint,
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1165 buffer.insts_size());
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1660
diff changeset
1166 Disassembler::decode(handler, handler + buffer.insts_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 tty->print_cr(" --- associated result handler ---");
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 address rh_begin = Interpreter::result_handler(method()->result_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 address rh_end = rh_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 while (*(int*)rh_end != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 rh_end += sizeof(int);
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 Disassembler::decode(rh_begin, rh_end);
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 // add handler to library
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 _fingerprints->append(fingerprint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 _handlers->append(handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // set handler index
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 assert(_fingerprints->length() == _handlers->length(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 handler_index = _fingerprints->length() - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 }
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1185 // Set handler under SignatureHandlerLibrary_lock
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 if (handler_index < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 // use generic signature handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 method->set_signature_handler(Interpreter::slow_signature_handler());
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 // set handler
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 method->set_signature_handler(_handlers->at(handler_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 }
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1193 } else {
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1194 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
1195 // use generic signature handler
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1196 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
1197 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 }
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1199 #ifdef ASSERT
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1200 int handler_index = -1;
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1201 int fingerprint_index = -2;
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1202 {
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1203 // '_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
1204 // 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
1205 // 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
1206 // 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
1207 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
1208 if (_handlers != NULL) {
1986
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1209 handler_index = _handlers->find(method->signature_handler());
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1210 fingerprint_index = _fingerprints->find(Fingerprinter(method).fingerprint());
9bc798875b2a 6704010: Internal Error (src/share/vm/interpreter/interpreterRuntime.cpp:1106)
coleenp
parents: 1972
diff changeset
1211 }
2194
face83fc8882 7012088: jump to 0 address because of lack of memory ordering in SignatureHandlerLibrary::add
coleenp
parents: 2192
diff changeset
1212 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 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
1214 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
1215 #endif // ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1217
a61af66fc99e Initial load
duke
parents:
diff changeset
1218
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 BufferBlob* SignatureHandlerLibrary::_handler_blob = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 address SignatureHandlerLibrary::_handler = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 GrowableArray<uint64_t>* SignatureHandlerLibrary::_fingerprints = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 GrowableArray<address>* SignatureHandlerLibrary::_handlers = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 address SignatureHandlerLibrary::_buffer = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1224
a61af66fc99e Initial load
duke
parents:
diff changeset
1225
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 IRT_ENTRY(void, InterpreterRuntime::prepare_native_call(JavaThread* thread, methodOopDesc* method))
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 methodHandle m(thread, method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 assert(m->is_native(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // lookup native function entry point if it doesn't exist
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 bool in_base_library;
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 if (!m->has_native_function()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 NativeLookup::lookup(m, in_base_library, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // make sure signature handler is installed
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 SignatureHandlerLibrary::add(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 // The interpreter entry point checks the signature handler first,
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 // before trying to fetch the native entry point and klass mirror.
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 // We must set the signature handler last, so that multiple processors
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 // preparing the same method will be sure to see non-null entry & mirror.
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1241
3911
2fecca53a2c6 7085012: ARM: com/sun/jdi/PopSynchronousTest.java still fails
roland
parents: 3852
diff changeset
1242 #if defined(IA32) || defined(AMD64) || defined(ARM)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 IRT_LEAF(void, InterpreterRuntime::popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address))
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 if (src_address == dest_address) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 ResetNoHandleMark rnm; // In a LEAF entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 frame fr = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 assert(fr.is_interpreted_frame(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 jint bci = fr.interpreter_frame_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 methodHandle mh(thread, fr.interpreter_frame_method());
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
1254 Bytecode_invoke invoke(mh, bci);
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
1255 ArgumentSizeComputer asc(invoke.signature());
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1986
diff changeset
1256 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
1257 Copy::conjoint_jbytes(src_address, dest_address,
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1213
diff changeset
1258 size_of_arguments * Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 IRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 #endif