annotate src/share/vm/prims/jvm.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 6e0cb14ce59b
children 8cb56c8cb30d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17693
d35df3079834 8028073: race condition in ObjectMonitor implementation causing deadlocks
dcubed
parents: 12824
diff changeset
2 * Copyright (c) 1997, 2014, 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: 1324
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1324
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: 1324
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: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "classfile/javaAssertions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "classfile/javaClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "classfile/symbolTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "classfile/systemDictionary.hpp"
20375
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
31 #if INCLUDE_CDS
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
32 #include "classfile/sharedClassUtil.hpp"
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
33 #include "classfile/systemDictionaryShared.hpp"
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
34 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #include "gc_interface/collectedHeap.inline.hpp"
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
37 #include "interpreter/bytecode.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
39 #include "memory/universe.inline.hpp"
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
40 #include "oops/fieldStreams.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
41 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
42 #include "oops/objArrayKlass.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
43 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
44 #include "prims/jvm.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
45 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
46 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
47 #include "prims/jvmtiThreadState.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
48 #include "prims/nativeLookup.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
49 #include "prims/privilegedStack.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
50 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
51 #include "runtime/dtraceJSDT.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
52 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
53 #include "runtime/init.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
54 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
55 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
56 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
57 #include "runtime/jfieldIDWorkaround.hpp"
20197
ce8f6bb717c9 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 17962
diff changeset
58 #include "runtime/orderAccess.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
59 #include "runtime/os.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
60 #include "runtime/perfData.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
61 #include "runtime/reflection.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
62 #include "runtime/vframe.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
63 #include "runtime/vm_operations.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
64 #include "services/attachListener.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
65 #include "services/management.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
66 #include "services/threadService.hpp"
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
67 #include "trace/tracing.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
68 #include "utilities/copy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
69 #include "utilities/defaultStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
70 #include "utilities/dtrace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
71 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
72 #include "utilities/histogram.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
73 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
74 #include "utilities/utf8.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
75 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
76 # include "jvm_linux.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
77 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
78 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
79 # include "jvm_solaris.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
80 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
81 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
82 # include "jvm_windows.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
83 #endif
14411
bdd155477289 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 11099
diff changeset
84 #ifdef TARGET_OS_FAMILY_aix
bdd155477289 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 11099
diff changeset
85 # include "jvm_aix.h"
bdd155477289 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 11099
diff changeset
86 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
87 #ifdef TARGET_OS_FAMILY_bsd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
88 # include "jvm_bsd.h"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
89 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
90
0
a61af66fc99e Initial load
duke
parents:
diff changeset
91 #include <errno.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
92
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
93 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1144
diff changeset
94 HS_DTRACE_PROBE_DECL1(hotspot, thread__sleep__begin, long long);
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1144
diff changeset
95 HS_DTRACE_PROBE_DECL1(hotspot, thread__sleep__end, int);
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1144
diff changeset
96 HS_DTRACE_PROBE_DECL0(hotspot, thread__yield);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
97 #endif /* !USDT2 */
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1144
diff changeset
98
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
100 NOTE about use of any ctor or function call that can trigger a safepoint/GC:
a61af66fc99e Initial load
duke
parents:
diff changeset
101 such ctors and calls MUST NOT come between an oop declaration/init and its
a61af66fc99e Initial load
duke
parents:
diff changeset
102 usage because if objects are move this may cause various memory stomps, bus
a61af66fc99e Initial load
duke
parents:
diff changeset
103 errors and segfaults. Here is a cookbook for causing so called "naked oop
a61af66fc99e Initial load
duke
parents:
diff changeset
104 failures":
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields<etc> {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 JVMWrapper("JVM_GetClassDeclaredFields");
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Object address to be held directly in mirror & not visible to GC
a61af66fc99e Initial load
duke
parents:
diff changeset
110 oop mirror = JNIHandles::resolve_non_null(ofClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // If this ctor can hit a safepoint, moving objects around, then
a61af66fc99e Initial load
duke
parents:
diff changeset
113 ComplexConstructor foo;
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // Boom! mirror may point to JUNK instead of the intended object
a61af66fc99e Initial load
duke
parents:
diff changeset
116 (some dereference of mirror)
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Here's another call that may block for GC, making mirror stale
a61af66fc99e Initial load
duke
parents:
diff changeset
119 MutexLocker ml(some_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // And here's an initializer that can result in a stale oop
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // all in one step.
a61af66fc99e Initial load
duke
parents:
diff changeset
123 oop o = call_that_can_throw_exception(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 The solution is to keep the oop declaration BELOW the ctor or function
a61af66fc99e Initial load
duke
parents:
diff changeset
127 call that might cause a GC, do another resolve to reassign the oop, or
a61af66fc99e Initial load
duke
parents:
diff changeset
128 consider use of a Handle instead of an oop so there is immunity from object
a61af66fc99e Initial load
duke
parents:
diff changeset
129 motion. But note that the "QUICK" entries below do not have a handlemark
a61af66fc99e Initial load
duke
parents:
diff changeset
130 and thus can only support use of handles passed in.
a61af66fc99e Initial load
duke
parents:
diff changeset
131 */
a61af66fc99e Initial load
duke
parents:
diff changeset
132
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
133 static void trace_class_resolution_impl(Klass* to_class, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
134 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 int line_number = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 const char * source_file = NULL;
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
137 const char * trace = "explicit";
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
138 InstanceKlass* caller = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
139 JavaThread* jthread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
140 if (jthread->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 vframeStream vfst(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // scan up the stack skipping ClassLoader, AccessController and PrivilegedAction frames
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
144 TempNewSymbol access_controller = SymbolTable::new_symbol("java/security/AccessController", CHECK);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
145 Klass* access_controller_klass = SystemDictionary::resolve_or_fail(access_controller, false, CHECK);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
146 TempNewSymbol privileged_action = SymbolTable::new_symbol("java/security/PrivilegedAction", CHECK);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
147 Klass* privileged_action_klass = SystemDictionary::resolve_or_fail(privileged_action, false, CHECK);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
148
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
149 Method* last_caller = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 while (!vfst.at_end()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
152 Method* m = vfst.method();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
153 if (!vfst.method()->method_holder()->is_subclass_of(SystemDictionary::ClassLoader_klass())&&
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
154 !vfst.method()->method_holder()->is_subclass_of(access_controller_klass) &&
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
155 !vfst.method()->method_holder()->is_subclass_of(privileged_action_klass)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
156 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158 last_caller = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 vfst.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // if this is called from Class.forName0 and that is called from Class.forName,
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // then print the caller of Class.forName. If this is Class.loadClass, then print
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // that caller, otherwise keep quiet since this should be picked up elsewhere.
a61af66fc99e Initial load
duke
parents:
diff changeset
164 bool found_it = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 if (!vfst.at_end() &&
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
166 vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
167 vfst.method()->name() == vmSymbols::forName0_name()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 vfst.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
169 if (!vfst.at_end() &&
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
170 vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
171 vfst.method()->name() == vmSymbols::forName_name()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
172 vfst.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
173 found_it = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 } else if (last_caller != NULL &&
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
176 last_caller->method_holder()->name() ==
0
a61af66fc99e Initial load
duke
parents:
diff changeset
177 vmSymbols::java_lang_ClassLoader() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
178 (last_caller->name() == vmSymbols::loadClassInternal_name() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
179 last_caller->name() == vmSymbols::loadClass_name())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
180 found_it = true;
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
181 } else if (!vfst.at_end()) {
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
182 if (vfst.method()->is_native()) {
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
183 // JNI call
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
184 found_it = true;
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
185 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
187 if (found_it && !vfst.at_end()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // found the caller
a61af66fc99e Initial load
duke
parents:
diff changeset
189 caller = vfst.method()->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
190 line_number = vfst.method()->line_number_from_bci(vfst.bci());
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
191 if (line_number == -1) {
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
192 // show method name if it's a native method
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
193 trace = vfst.method()->name_and_sig_as_C_string();
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
194 }
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
195 Symbol* s = caller->source_file_name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
196 if (s != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 source_file = s->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201 if (caller != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 if (to_class != caller) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
203 const char * from = caller->external_name();
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
204 const char * to = to_class->external_name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // print in a single call to reduce interleaving between threads
a61af66fc99e Initial load
duke
parents:
diff changeset
206 if (source_file != NULL) {
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
207 tty->print("RESOLVE %s %s %s:%d (%s)\n", from, to, source_file, line_number, trace);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
208 } else {
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
209 tty->print("RESOLVE %s %s (%s)\n", from, to, trace);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
215 void trace_class_resolution(Klass* to_class) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
216 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
217 trace_class_resolution_impl(to_class, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
218 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // Wrapper to trace JVM functions
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
226 class JVMTraceWrapper : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 public:
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17889
diff changeset
228 JVMTraceWrapper(const char* format, ...) ATTRIBUTE_PRINTF(2, 3) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
229 if (TraceJVMCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
231 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
232 tty->print("JVM ");
a61af66fc99e Initial load
duke
parents:
diff changeset
233 tty->vprint_cr(format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
237 };
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 Histogram* JVMHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
240 volatile jint JVMHistogram_lock = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 class JVMHistogramElement : public HistogramElement {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
244 JVMHistogramElement(const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
245 };
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 JVMHistogramElement::JVMHistogramElement(const char* elementName) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 _name = elementName;
a61af66fc99e Initial load
duke
parents:
diff changeset
249 uintx count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 while (Atomic::cmpxchg(1, &JVMHistogram_lock, 0) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 while (OrderAccess::load_acquire(&JVMHistogram_lock) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 count +=1;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 if ( (WarnOnStalledSpinLock > 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
255 && (count % WarnOnStalledSpinLock == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 warning("JVMHistogram_lock seems to be stalled");
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 if(JVMHistogram == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
262 JVMHistogram = new Histogram("JVM Call Counts",100);
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 JVMHistogram->add_element(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
265 Atomic::dec(&JVMHistogram_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 #define JVMCountWrapper(arg) \
a61af66fc99e Initial load
duke
parents:
diff changeset
269 static JVMHistogramElement* e = new JVMHistogramElement(arg); \
a61af66fc99e Initial load
duke
parents:
diff changeset
270 if (e != NULL) e->increment_count(); // Due to bug in VC++, we need a NULL check here eventhough it should never happen!
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 #define JVMWrapper(arg1) JVMCountWrapper(arg1); JVMTraceWrapper(arg1)
a61af66fc99e Initial load
duke
parents:
diff changeset
273 #define JVMWrapper2(arg1, arg2) JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2)
a61af66fc99e Initial load
duke
parents:
diff changeset
274 #define JVMWrapper3(arg1, arg2, arg3) JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2, arg3)
a61af66fc99e Initial load
duke
parents:
diff changeset
275 #define JVMWrapper4(arg1, arg2, arg3, arg4) JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2, arg3, arg4)
a61af66fc99e Initial load
duke
parents:
diff changeset
276 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
277 #define JVMWrapper(arg1)
a61af66fc99e Initial load
duke
parents:
diff changeset
278 #define JVMWrapper2(arg1, arg2)
a61af66fc99e Initial load
duke
parents:
diff changeset
279 #define JVMWrapper3(arg1, arg2, arg3)
a61af66fc99e Initial load
duke
parents:
diff changeset
280 #define JVMWrapper4(arg1, arg2, arg3, arg4)
a61af66fc99e Initial load
duke
parents:
diff changeset
281 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // Interface version /////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 JVM_LEAF(jint, JVM_GetInterfaceVersion())
a61af66fc99e Initial load
duke
parents:
diff changeset
288 return JVM_INTERFACE_VERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
289 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // java.lang.System //////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 JVM_LEAF(jlong, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored))
a61af66fc99e Initial load
duke
parents:
diff changeset
296 JVMWrapper("JVM_CurrentTimeMillis");
a61af66fc99e Initial load
duke
parents:
diff changeset
297 return os::javaTimeMillis();
a61af66fc99e Initial load
duke
parents:
diff changeset
298 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 JVM_LEAF(jlong, JVM_NanoTime(JNIEnv *env, jclass ignored))
a61af66fc99e Initial load
duke
parents:
diff changeset
301 JVMWrapper("JVM_NanoTime");
a61af66fc99e Initial load
duke
parents:
diff changeset
302 return os::javaTimeNanos();
a61af66fc99e Initial load
duke
parents:
diff changeset
303 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 JVM_ENTRY(void, JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos,
a61af66fc99e Initial load
duke
parents:
diff changeset
307 jobject dst, jint dst_pos, jint length))
a61af66fc99e Initial load
duke
parents:
diff changeset
308 JVMWrapper("JVM_ArrayCopy");
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // Check if we have null pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
310 if (src == NULL || dst == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313 arrayOop s = arrayOop(JNIHandles::resolve_non_null(src));
a61af66fc99e Initial load
duke
parents:
diff changeset
314 arrayOop d = arrayOop(JNIHandles::resolve_non_null(dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
315 assert(s->is_oop(), "JVM_ArrayCopy: src not an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
316 assert(d->is_oop(), "JVM_ArrayCopy: dst not an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // Do copy
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
318 s->klass()->copy_array(s, src_pos, d, dst_pos, length, thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
319 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 static void set_property(Handle props, const char* key, const char* value, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
323 JavaValue r(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // public synchronized Object put(Object key, Object value);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 HandleMark hm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 Handle key_str = java_lang_String::create_from_platform_dependent_str(key, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 Handle value_str = java_lang_String::create_from_platform_dependent_str((value != NULL ? value : ""), CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 JavaCalls::call_virtual(&r,
a61af66fc99e Initial load
duke
parents:
diff changeset
329 props,
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
330 KlassHandle(THREAD, SystemDictionary::Properties_klass()),
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
331 vmSymbols::put_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
332 vmSymbols::object_object_object_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
333 key_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
334 value_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
335 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
336 }
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 #define PUTPROP(props, name, value) set_property((props), (name), (value), CHECK_(properties));
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 JVM_ENTRY(jobject, JVM_InitProperties(JNIEnv *env, jobject properties))
a61af66fc99e Initial load
duke
parents:
diff changeset
343 JVMWrapper("JVM_InitProperties");
a61af66fc99e Initial load
duke
parents:
diff changeset
344 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 Handle props(THREAD, JNIHandles::resolve_non_null(properties));
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // System property list includes both user set via -D option and
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // jvm system specific properties.
a61af66fc99e Initial load
duke
parents:
diff changeset
350 for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 PUTPROP(props, p->key(), p->value());
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // Convert the -XX:MaxDirectMemorySize= command line flag
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // to the sun.nio.MaxDirectMemorySize property.
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // Do this after setting user properties to prevent people
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // from setting the value with a -D option, as requested.
a61af66fc99e Initial load
duke
parents:
diff changeset
358 {
6199
3f1ab0c19c30 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 5967
diff changeset
359 if (FLAG_IS_DEFAULT(MaxDirectMemorySize)) {
3f1ab0c19c30 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 5967
diff changeset
360 PUTPROP(props, "sun.nio.MaxDirectMemorySize", "-1");
3f1ab0c19c30 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 5967
diff changeset
361 } else {
3f1ab0c19c30 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 5967
diff changeset
362 char as_chars[256];
3f1ab0c19c30 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 5967
diff changeset
363 jio_snprintf(as_chars, sizeof(as_chars), UINTX_FORMAT, MaxDirectMemorySize);
3f1ab0c19c30 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 5967
diff changeset
364 PUTPROP(props, "sun.nio.MaxDirectMemorySize", as_chars);
3f1ab0c19c30 7179383: MaxDirectMemorySize argument parsing is broken for values >2G
dholmes
parents: 5967
diff changeset
365 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // JVM monitoring and management support
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // Add the sun.management.compiler property for the compiler's name
a61af66fc99e Initial load
duke
parents:
diff changeset
370 {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 #undef CSIZE
a61af66fc99e Initial load
duke
parents:
diff changeset
372 #if defined(_LP64) || defined(_WIN64)
a61af66fc99e Initial load
duke
parents:
diff changeset
373 #define CSIZE "64-Bit "
a61af66fc99e Initial load
duke
parents:
diff changeset
374 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
375 #define CSIZE
a61af66fc99e Initial load
duke
parents:
diff changeset
376 #endif // 64bit
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
379 const char* compiler_name = "HotSpot " CSIZE "Tiered Compilers";
a61af66fc99e Initial load
duke
parents:
diff changeset
380 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
381 #if defined(COMPILER1)
a61af66fc99e Initial load
duke
parents:
diff changeset
382 const char* compiler_name = "HotSpot " CSIZE "Client Compiler";
a61af66fc99e Initial load
duke
parents:
diff changeset
383 #elif defined(COMPILER2)
a61af66fc99e Initial load
duke
parents:
diff changeset
384 const char* compiler_name = "HotSpot " CSIZE "Server Compiler";
a61af66fc99e Initial load
duke
parents:
diff changeset
385 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
386 const char* compiler_name = "";
a61af66fc99e Initial load
duke
parents:
diff changeset
387 #endif // compilers
a61af66fc99e Initial load
duke
parents:
diff changeset
388 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 if (*compiler_name != '\0' &&
a61af66fc99e Initial load
duke
parents:
diff changeset
391 (Arguments::mode() != Arguments::_int)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 PUTPROP(props, "sun.management.compiler", compiler_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
393 }
a61af66fc99e Initial load
duke
parents:
diff changeset
394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 return properties;
a61af66fc99e Initial load
duke
parents:
diff changeset
397 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399
17962
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
400 /*
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
401 * Return the temporary directory that the VM uses for the attach
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
402 * and perf data files.
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
403 *
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
404 * It is important that this directory is well-known and the
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
405 * same for all VM instances. It cannot be affected by configuration
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
406 * variables such as java.io.tmpdir.
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
407 */
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
408 JVM_ENTRY(jstring, JVM_GetTemporaryDirectory(JNIEnv *env))
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
409 JVMWrapper("JVM_GetTemporaryDirectory");
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
410 HandleMark hm(THREAD);
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
411 const char* temp_dir = os::get_temp_directory();
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
412 Handle h = java_lang_String::create_from_platform_dependent_str(temp_dir, CHECK_NULL);
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
413 return (jstring) JNIHandles::make_local(env, h());
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
414 JVM_END
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
415
a103c376459a 8041980: (hotspot) sun/jvmstat/monitor/MonitoredVm/CR6672135.java failing on all platforms
sla
parents: 17937
diff changeset
416
0
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // java.lang.Runtime /////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
418
a61af66fc99e Initial load
duke
parents:
diff changeset
419 extern volatile jint vm_created;
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 JVM_ENTRY_NO_ENV(void, JVM_Exit(jint code))
a61af66fc99e Initial load
duke
parents:
diff changeset
422 if (vm_created != 0 && (code == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // The VM is about to exit. We call back into Java to check whether finalizers should be run
a61af66fc99e Initial load
duke
parents:
diff changeset
424 Universe::run_finalizers_on_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
426 before_exit(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
427 vm_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
428 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
429
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 JVM_ENTRY_NO_ENV(void, JVM_Halt(jint code))
a61af66fc99e Initial load
duke
parents:
diff changeset
432 before_exit(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
433 vm_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 JVM_LEAF(void, JVM_OnExit(void (*func)(void)))
a61af66fc99e Initial load
duke
parents:
diff changeset
438 register_on_exit_function(func);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 JVM_ENTRY_NO_ENV(void, JVM_GC(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
443 JVMWrapper("JVM_GC");
a61af66fc99e Initial load
duke
parents:
diff changeset
444 if (!DisableExplicitGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 Universe::heap()->collect(GCCause::_java_lang_system_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
446 }
a61af66fc99e Initial load
duke
parents:
diff changeset
447 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 JVM_LEAF(jlong, JVM_MaxObjectInspectionAge(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
451 JVMWrapper("JVM_MaxObjectInspectionAge");
a61af66fc99e Initial load
duke
parents:
diff changeset
452 return Universe::heap()->millis_since_last_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
453 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 JVM_LEAF(void, JVM_TraceInstructions(jboolean on))
a61af66fc99e Initial load
duke
parents:
diff changeset
457 if (PrintJVMWarnings) warning("JVM_TraceInstructions not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
458 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 JVM_LEAF(void, JVM_TraceMethodCalls(jboolean on))
a61af66fc99e Initial load
duke
parents:
diff changeset
462 if (PrintJVMWarnings) warning("JVM_TraceMethodCalls not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
463 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 static inline jlong convert_size_t_to_jlong(size_t val) {
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // In the 64-bit vm, a size_t can overflow a jlong (which is signed).
a61af66fc99e Initial load
duke
parents:
diff changeset
467 NOT_LP64 (return (jlong)val;)
a61af66fc99e Initial load
duke
parents:
diff changeset
468 LP64_ONLY(return (jlong)MIN2(val, (size_t)max_jlong);)
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471 JVM_ENTRY_NO_ENV(jlong, JVM_TotalMemory(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
472 JVMWrapper("JVM_TotalMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
473 size_t n = Universe::heap()->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
474 return convert_size_t_to_jlong(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
475 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 JVM_ENTRY_NO_ENV(jlong, JVM_FreeMemory(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
479 JVMWrapper("JVM_FreeMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
480 CollectedHeap* ch = Universe::heap();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 116
diff changeset
481 size_t n;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 116
diff changeset
482 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 116
diff changeset
483 MutexLocker x(Heap_lock);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 116
diff changeset
484 n = ch->capacity() - ch->used();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 116
diff changeset
485 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
486 return convert_size_t_to_jlong(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
487 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 JVM_ENTRY_NO_ENV(jlong, JVM_MaxMemory(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
491 JVMWrapper("JVM_MaxMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
492 size_t n = Universe::heap()->max_capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
493 return convert_size_t_to_jlong(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 JVM_ENTRY_NO_ENV(jint, JVM_ActiveProcessorCount(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
498 JVMWrapper("JVM_ActiveProcessorCount");
a61af66fc99e Initial load
duke
parents:
diff changeset
499 return os::active_processor_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
500 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 // java.lang.Throwable //////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 JVM_ENTRY(void, JVM_FillInStackTrace(JNIEnv *env, jobject receiver))
a61af66fc99e Initial load
duke
parents:
diff changeset
508 JVMWrapper("JVM_FillInStackTrace");
a61af66fc99e Initial load
duke
parents:
diff changeset
509 Handle exception(thread, JNIHandles::resolve_non_null(receiver));
a61af66fc99e Initial load
duke
parents:
diff changeset
510 java_lang_Throwable::fill_in_stack_trace(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
511 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 JVM_ENTRY(jint, JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable))
a61af66fc99e Initial load
duke
parents:
diff changeset
515 JVMWrapper("JVM_GetStackTraceDepth");
a61af66fc99e Initial load
duke
parents:
diff changeset
516 oop exception = JNIHandles::resolve(throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
517 return java_lang_Throwable::get_stack_trace_depth(exception, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
518 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 JVM_ENTRY(jobject, JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
522 JVMWrapper("JVM_GetStackTraceElement");
a61af66fc99e Initial load
duke
parents:
diff changeset
523 JvmtiVMObjectAllocEventCollector oam; // This ctor (throughout this module) may trigger a safepoint/GC
a61af66fc99e Initial load
duke
parents:
diff changeset
524 oop exception = JNIHandles::resolve(throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
525 oop element = java_lang_Throwable::get_stack_trace_element(exception, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
526 return JNIHandles::make_local(env, element);
a61af66fc99e Initial load
duke
parents:
diff changeset
527 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // java.lang.Object ///////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))
a61af66fc99e Initial load
duke
parents:
diff changeset
534 JVMWrapper("JVM_IHashCode");
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // as implemented in the classic virtual machine; return 0 if object is NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
536 return handle == NULL ? 0 : ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
537 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539
a61af66fc99e Initial load
duke
parents:
diff changeset
540 JVM_ENTRY(void, JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms))
a61af66fc99e Initial load
duke
parents:
diff changeset
541 JVMWrapper("JVM_MonitorWait");
a61af66fc99e Initial load
duke
parents:
diff changeset
542 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
a61af66fc99e Initial load
duke
parents:
diff changeset
543 JavaThreadInObjectWaitState jtiows(thread, ms != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
544 if (JvmtiExport::should_post_monitor_wait()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
545 JvmtiExport::post_monitor_wait((JavaThread *)THREAD, (oop)obj(), ms);
17693
d35df3079834 8028073: race condition in ObjectMonitor implementation causing deadlocks
dcubed
parents: 12824
diff changeset
546
d35df3079834 8028073: race condition in ObjectMonitor implementation causing deadlocks
dcubed
parents: 12824
diff changeset
547 // The current thread already owns the monitor and it has not yet
d35df3079834 8028073: race condition in ObjectMonitor implementation causing deadlocks
dcubed
parents: 12824
diff changeset
548 // been added to the wait queue so the current thread cannot be
d35df3079834 8028073: race condition in ObjectMonitor implementation causing deadlocks
dcubed
parents: 12824
diff changeset
549 // made the successor. This means that the JVMTI_EVENT_MONITOR_WAIT
d35df3079834 8028073: race condition in ObjectMonitor implementation causing deadlocks
dcubed
parents: 12824
diff changeset
550 // event handler cannot accidentally consume an unpark() meant for
d35df3079834 8028073: race condition in ObjectMonitor implementation causing deadlocks
dcubed
parents: 12824
diff changeset
551 // the ParkEvent associated with this ObjectMonitor.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 ObjectSynchronizer::wait(obj, ms, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
554 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
555
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 JVM_ENTRY(void, JVM_MonitorNotify(JNIEnv* env, jobject handle))
a61af66fc99e Initial load
duke
parents:
diff changeset
558 JVMWrapper("JVM_MonitorNotify");
a61af66fc99e Initial load
duke
parents:
diff changeset
559 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
a61af66fc99e Initial load
duke
parents:
diff changeset
560 ObjectSynchronizer::notify(obj, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
561 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564 JVM_ENTRY(void, JVM_MonitorNotifyAll(JNIEnv* env, jobject handle))
a61af66fc99e Initial load
duke
parents:
diff changeset
565 JVMWrapper("JVM_MonitorNotifyAll");
a61af66fc99e Initial load
duke
parents:
diff changeset
566 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
a61af66fc99e Initial load
duke
parents:
diff changeset
567 ObjectSynchronizer::notifyall(obj, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
568 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))
a61af66fc99e Initial load
duke
parents:
diff changeset
572 JVMWrapper("JVM_Clone");
a61af66fc99e Initial load
duke
parents:
diff changeset
573 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
a61af66fc99e Initial load
duke
parents:
diff changeset
574 const KlassHandle klass (THREAD, obj->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
575 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // Just checking that the cloneable flag is set correct
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
579 if (obj->is_array()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
580 guarantee(klass->is_cloneable(), "all arrays are cloneable");
a61af66fc99e Initial load
duke
parents:
diff changeset
581 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
582 guarantee(obj->is_instance(), "should be instanceOop");
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
583 bool cloneable = klass->is_subtype_of(SystemDictionary::Cloneable_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
584 guarantee(cloneable == klass->is_cloneable(), "incorrect cloneable flag");
a61af66fc99e Initial load
duke
parents:
diff changeset
585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
586 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // Check if class of obj supports the Cloneable interface.
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // All arrays are considered to be cloneable (See JLS 20.1.5)
a61af66fc99e Initial load
duke
parents:
diff changeset
590 if (!klass->is_cloneable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
592 THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // Make shallow object copy
a61af66fc99e Initial load
duke
parents:
diff changeset
596 const int size = obj->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
597 oop new_obj = NULL;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
598 if (obj->is_array()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
599 const int length = ((arrayOop)obj())->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
600 new_obj = CollectedHeap::array_allocate(klass, size, length, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
601 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
602 new_obj = CollectedHeap::obj_allocate(klass, size, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // 4839641 (4840070): We must do an oop-atomic copy, because if another thread
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // is modifying a reference field in the clonee, a non-oop-atomic copy might
a61af66fc99e Initial load
duke
parents:
diff changeset
606 // be suspended in the middle of copying the pointer and end up with parts
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // of two different pointers in the field. Subsequent dereferences will crash.
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // 4846409: an oop-copy of objects with long or double fields or arrays of same
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // won't copy the longs/doubles atomically in 32-bit vm's, so we copy jlongs instead
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // of oops. We know objects are aligned on a minimum of an jlong boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // The same is true of StubRoutines::object_copy and the various oop_copy
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // variants, and of the code generated by the inline_native_clone intrinsic.
a61af66fc99e Initial load
duke
parents:
diff changeset
613 assert(MinObjAlignmentInBytes >= BytesPerLong, "objects misaligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
614 Copy::conjoint_jlongs_atomic((jlong*)obj(), (jlong*)new_obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
615 (size_t)align_object_size(size) / HeapWordsPerLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // Clear the header
a61af66fc99e Initial load
duke
parents:
diff changeset
617 new_obj->init_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // Store check (mark entire object and let gc sort it out)
a61af66fc99e Initial load
duke
parents:
diff changeset
620 BarrierSet* bs = Universe::heap()->barrier_set();
a61af66fc99e Initial load
duke
parents:
diff changeset
621 assert(bs->has_write_region_opt(), "Barrier set does not have write_region");
a61af66fc99e Initial load
duke
parents:
diff changeset
622 bs->write_region(MemRegion((HeapWord*)new_obj, size));
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // Caution: this involves a java upcall, so the clone should be
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // "gc-robust" by this stage.
a61af66fc99e Initial load
duke
parents:
diff changeset
626 if (klass->has_finalizer()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
627 assert(obj->is_instance(), "should be instanceOop");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
628 new_obj = InstanceKlass::register_finalizer(instanceOop(new_obj), CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 return JNIHandles::make_local(env, oop(new_obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
632 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 // java.lang.Compiler ////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // The initial cuts of the HotSpot VM will not support JITs, and all existing
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // JITs would need extensive changes to work with HotSpot. The JIT-related JVM
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // functions are all silently ignored unless JVM warnings are printed.
a61af66fc99e Initial load
duke
parents:
diff changeset
639
a61af66fc99e Initial load
duke
parents:
diff changeset
640 JVM_LEAF(void, JVM_InitializeCompiler (JNIEnv *env, jclass compCls))
a61af66fc99e Initial load
duke
parents:
diff changeset
641 if (PrintJVMWarnings) warning("JVM_InitializeCompiler not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
642 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644
a61af66fc99e Initial load
duke
parents:
diff changeset
645 JVM_LEAF(jboolean, JVM_IsSilentCompiler(JNIEnv *env, jclass compCls))
a61af66fc99e Initial load
duke
parents:
diff changeset
646 if (PrintJVMWarnings) warning("JVM_IsSilentCompiler not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
647 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
648 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 JVM_LEAF(jboolean, JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
652 if (PrintJVMWarnings) warning("JVM_CompileClass not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
653 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656
a61af66fc99e Initial load
duke
parents:
diff changeset
657 JVM_LEAF(jboolean, JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname))
a61af66fc99e Initial load
duke
parents:
diff changeset
658 if (PrintJVMWarnings) warning("JVM_CompileClasses not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
659 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
660 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 JVM_LEAF(jobject, JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg))
a61af66fc99e Initial load
duke
parents:
diff changeset
664 if (PrintJVMWarnings) warning("JVM_CompilerCommand not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
665 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
666 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668
a61af66fc99e Initial load
duke
parents:
diff changeset
669 JVM_LEAF(void, JVM_EnableCompiler(JNIEnv *env, jclass compCls))
a61af66fc99e Initial load
duke
parents:
diff changeset
670 if (PrintJVMWarnings) warning("JVM_EnableCompiler not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
671 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673
a61af66fc99e Initial load
duke
parents:
diff changeset
674 JVM_LEAF(void, JVM_DisableCompiler(JNIEnv *env, jclass compCls))
a61af66fc99e Initial load
duke
parents:
diff changeset
675 if (PrintJVMWarnings) warning("JVM_DisableCompiler not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
676 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // Error message support //////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
681
a61af66fc99e Initial load
duke
parents:
diff changeset
682 JVM_LEAF(jint, JVM_GetLastErrorString(char *buf, int len))
a61af66fc99e Initial load
duke
parents:
diff changeset
683 JVMWrapper("JVM_GetLastErrorString");
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
684 return (jint)os::lasterror(buf, len);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
685 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
686
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 // java.io.File ///////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
689
a61af66fc99e Initial load
duke
parents:
diff changeset
690 JVM_LEAF(char*, JVM_NativePath(char* path))
a61af66fc99e Initial load
duke
parents:
diff changeset
691 JVMWrapper2("JVM_NativePath (%s)", path);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
692 return os::native_path(path);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
693 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
694
a61af66fc99e Initial load
duke
parents:
diff changeset
695
a61af66fc99e Initial load
duke
parents:
diff changeset
696 // Misc. class handling ///////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698
a61af66fc99e Initial load
duke
parents:
diff changeset
699 JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env, int depth))
a61af66fc99e Initial load
duke
parents:
diff changeset
700 JVMWrapper("JVM_GetCallerClass");
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
701
12824
615d83933195 8026025: JVM_GetCallerClass allows Reflection.getCallerClass(int depth) to use
dholmes
parents: 12816
diff changeset
702 // Pre-JDK 8 and early builds of JDK 8 don't have a CallerSensitive annotation; or
615d83933195 8026025: JVM_GetCallerClass allows Reflection.getCallerClass(int depth) to use
dholmes
parents: 12816
diff changeset
703 // sun.reflect.Reflection.getCallerClass with a depth parameter is provided
615d83933195 8026025: JVM_GetCallerClass allows Reflection.getCallerClass(int depth) to use
dholmes
parents: 12816
diff changeset
704 // temporarily for existing code to use until a replacement API is defined.
615d83933195 8026025: JVM_GetCallerClass allows Reflection.getCallerClass(int depth) to use
dholmes
parents: 12816
diff changeset
705 if (SystemDictionary::reflect_CallerSensitive_klass() == NULL || depth != JVM_CALLER_DEPTH) {
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
706 Klass* k = thread->security_get_caller_class(depth);
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
707 return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, k->java_mirror());
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
708 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
709
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
710 // Getting the class of the caller frame.
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
711 //
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
712 // The call stack at this point looks something like this:
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
713 //
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
714 // [0] [ @CallerSensitive public sun.reflect.Reflection.getCallerClass ]
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
715 // [1] [ @CallerSensitive API.method ]
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
716 // [.] [ (skipped intermediate frames) ]
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
717 // [n] [ caller ]
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
718 vframeStream vfst(thread);
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
719 // Cf. LibraryCallKit::inline_native_Reflection_getCallerClass
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
720 for (int n = 0; !vfst.at_end(); vfst.security_next(), n++) {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
721 Method* m = vfst.method();
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
722 assert(m != NULL, "sanity");
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
723 switch (n) {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
724 case 0:
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
725 // This must only be called from Reflection.getCallerClass
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
726 if (m->intrinsic_id() != vmIntrinsics::_getCallerClass) {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
727 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "JVM_GetCallerClass must only be called from Reflection.getCallerClass");
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
728 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
729 // fall-through
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
730 case 1:
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
731 // Frame 0 and 1 must be caller sensitive.
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
732 if (!m->caller_sensitive()) {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
733 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), err_msg("CallerSensitive annotation expected at frame %d", n));
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
734 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
735 break;
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
736 default:
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
737 if (!m->is_ignored_by_security_stack_walk()) {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
738 // We have reached the desired frame; return the holder class.
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
739 return (jclass) JNIHandles::make_local(env, m->method_holder()->java_mirror());
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
740 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
741 break;
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
742 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
743 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
744 return NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
745 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
746
a61af66fc99e Initial load
duke
parents:
diff changeset
747
a61af66fc99e Initial load
duke
parents:
diff changeset
748 JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf))
a61af66fc99e Initial load
duke
parents:
diff changeset
749 JVMWrapper("JVM_FindPrimitiveClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
750 oop mirror = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
751 BasicType t = name2type(utf);
a61af66fc99e Initial load
duke
parents:
diff changeset
752 if (t != T_ILLEGAL && t != T_OBJECT && t != T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
753 mirror = Universe::java_mirror(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
755 if (mirror == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
756 THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf);
a61af66fc99e Initial load
duke
parents:
diff changeset
757 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
758 return (jclass) JNIHandles::make_local(env, mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
760 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
761
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 JVM_ENTRY(void, JVM_ResolveClass(JNIEnv* env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
764 JVMWrapper("JVM_ResolveClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
765 if (PrintJVMWarnings) warning("JVM_ResolveClass not implemented");
a61af66fc99e Initial load
duke
parents:
diff changeset
766 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
767
878
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
768
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
769 // Returns a class loaded by the bootstrap class loader; or null
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
770 // if not found. ClassNotFoundException is not thrown.
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
771 //
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
772 // Rationale behind JVM_FindClassFromBootLoader
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
773 // a> JVM_FindClassFromClassLoader was never exported in the export tables.
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
774 // b> because of (a) java.dll has a direct dependecy on the unexported
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
775 // private symbol "_JVM_FindClassFromClassLoader@20".
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
776 // c> the launcher cannot use the private symbol as it dynamically opens
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
777 // the entry point, so if something changes, the launcher will fail
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
778 // unexpectedly at runtime, it is safest for the launcher to dlopen a
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
779 // stable exported interface.
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
780 // d> re-exporting JVM_FindClassFromClassLoader as public, will cause its
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
781 // signature to change from _JVM_FindClassFromClassLoader@20 to
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
782 // JVM_FindClassFromClassLoader and will not be backward compatible
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
783 // with older JDKs.
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
784 // Thus a public/stable exported entry point is the right solution,
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
785 // public here means public in linker semantics, and is exported only
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
786 // to the JDK, and is not intended to be a public API.
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
787
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
788 JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
789 const char* name))
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
790 JVMWrapper2("JVM_FindClassFromBootLoader %s", name);
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
791
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
792 // Java libraries should ensure that name is never null...
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
793 if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
878
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
794 // It's impossible to create this class; the name cannot fit
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
795 // into the constant pool.
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
796 return NULL;
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
797 }
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
798
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
799 TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
800 Klass* k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL);
878
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
801 if (k == NULL) {
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
802 return NULL;
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
803 }
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
804
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
805 if (TraceClassResolution) {
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
806 trace_class_resolution(k);
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
807 }
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
808 return (jclass) JNIHandles::make_local(env, k->java_mirror());
878
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
809 JVM_END
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
810
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
811 JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
812 jboolean init, jobject loader,
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
813 jboolean throwError))
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
814 JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name,
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
815 throwError ? "error" : "exception");
388
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
816 // Java libraries should ensure that name is never null...
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
817 if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
388
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
818 // It's impossible to create this class; the name cannot fit
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
819 // into the constant pool.
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
820 if (throwError) {
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
821 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
822 } else {
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
823 THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
824 }
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
825 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
826 TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
388
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
827 Handle h_loader(THREAD, JNIHandles::resolve(loader));
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
828 jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
829 Handle(), throwError, THREAD);
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
830
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
831 if (TraceClassResolution && result != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
832 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
388
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
833 }
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
834 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
835 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
836
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838 JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
a61af66fc99e Initial load
duke
parents:
diff changeset
839 jboolean init, jclass from))
a61af66fc99e Initial load
duke
parents:
diff changeset
840 JVMWrapper2("JVM_FindClassFromClass %s", name);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
841 if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // It's impossible to create this class; the name cannot fit
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // into the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
844 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
a61af66fc99e Initial load
duke
parents:
diff changeset
845 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
846 TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
847 oop from_class_oop = JNIHandles::resolve(from);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
848 Klass* from_class = (from_class_oop == NULL)
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
849 ? (Klass*)NULL
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
850 : java_lang_Class::as_Klass(from_class_oop);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
851 oop class_loader = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 oop protection_domain = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
853 if (from_class != NULL) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
854 class_loader = from_class->class_loader();
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
855 protection_domain = from_class->protection_domain();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
856 }
a61af66fc99e Initial load
duke
parents:
diff changeset
857 Handle h_loader(THREAD, class_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 Handle h_prot (THREAD, protection_domain);
a61af66fc99e Initial load
duke
parents:
diff changeset
859 jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
860 h_prot, true, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862 if (TraceClassResolution && result != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // this function is generally only used for class loading during verification.
a61af66fc99e Initial load
duke
parents:
diff changeset
864 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
865 oop from_mirror = JNIHandles::resolve_non_null(from);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
866 Klass* from_class = java_lang_Class::as_Klass(from_mirror);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
867 const char * from_name = from_class->external_name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 oop mirror = JNIHandles::resolve_non_null(result);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
870 Klass* to_class = java_lang_Class::as_Klass(mirror);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
871 const char * to = to_class->external_name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
872 tty->print("RESOLVE %s %s (verification)\n", from_name, to);
a61af66fc99e Initial load
duke
parents:
diff changeset
873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
876 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 static void is_lock_held_by_thread(Handle loader, PerfCounter* counter, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
879 if (loader.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
880 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
881 }
a61af66fc99e Initial load
duke
parents:
diff changeset
882
a61af66fc99e Initial load
duke
parents:
diff changeset
883 // check whether the current caller thread holds the lock or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // If not, increment the corresponding counter
a61af66fc99e Initial load
duke
parents:
diff changeset
885 if (ObjectSynchronizer::query_lock_ownership((JavaThread*)THREAD, loader) !=
a61af66fc99e Initial load
duke
parents:
diff changeset
886 ObjectSynchronizer::owner_self) {
a61af66fc99e Initial load
duke
parents:
diff changeset
887 counter->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // common code for JVM_DefineClass() and JVM_DefineClassWithSource()
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
892 // and JVM_DefineClassWithSourceCond()
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
893 static jclass jvm_define_class_common(JNIEnv *env, const char *name,
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
894 jobject loader, const jbyte *buf,
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
895 jsize len, jobject pd, const char *source,
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
896 jboolean verify, TRAPS) {
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 388
diff changeset
897 if (source == NULL) source = "__JVM_DefineClass__";
0
a61af66fc99e Initial load
duke
parents:
diff changeset
898
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
899 assert(THREAD->is_Java_thread(), "must be a JavaThread");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
900 JavaThread* jt = (JavaThread*) THREAD;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
901
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
902 PerfClassTraceTime vmtimer(ClassLoader::perf_define_appclass_time(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
903 ClassLoader::perf_define_appclass_selftime(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
904 ClassLoader::perf_define_appclasses(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
905 jt->get_thread_stat()->perf_recursion_counts_addr(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
906 jt->get_thread_stat()->perf_timers_addr(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
907 PerfClassTraceTime::DEFINE_CLASS);
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
908
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
909 if (UsePerfData) {
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
910 ClassLoader::perf_app_classfile_bytes_read()->inc(len);
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
911 }
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
912
0
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // Since exceptions can be thrown, class initialization can take place
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // if name is NULL no check for class name in .class stream has to be made.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
915 TempNewSymbol class_name = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
916 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
917 const int str_len = (int)strlen(name);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
918 if (str_len > Symbol::max_length()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
919 // It's impossible to create this class; the name cannot fit
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // into the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
921 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
a61af66fc99e Initial load
duke
parents:
diff changeset
922 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
923 class_name = SymbolTable::new_symbol(name, str_len, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
925
a61af66fc99e Initial load
duke
parents:
diff changeset
926 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
927 ClassFileStream st((u1*) buf, len, (char *)source);
a61af66fc99e Initial load
duke
parents:
diff changeset
928 Handle class_loader (THREAD, JNIHandles::resolve(loader));
a61af66fc99e Initial load
duke
parents:
diff changeset
929 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
930 is_lock_held_by_thread(class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
931 ClassLoader::sync_JVMDefineClassLockFreeCounter(),
a61af66fc99e Initial load
duke
parents:
diff changeset
932 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
934 Handle protection_domain (THREAD, JNIHandles::resolve(pd));
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
935 Klass* k = SystemDictionary::resolve_from_stream(class_name, class_loader,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
936 protection_domain, &st,
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
937 verify != 0,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
938 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
939
a61af66fc99e Initial load
duke
parents:
diff changeset
940 if (TraceClassResolution && k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
941 trace_class_resolution(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
944 return (jclass) JNIHandles::make_local(env, k->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
945 }
a61af66fc99e Initial load
duke
parents:
diff changeset
946
a61af66fc99e Initial load
duke
parents:
diff changeset
947
a61af66fc99e Initial load
duke
parents:
diff changeset
948 JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))
a61af66fc99e Initial load
duke
parents:
diff changeset
949 JVMWrapper2("JVM_DefineClass %s", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
950
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
951 return jvm_define_class_common(env, name, loader, buf, len, pd, NULL, true, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
952 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
953
a61af66fc99e Initial load
duke
parents:
diff changeset
954
a61af66fc99e Initial load
duke
parents:
diff changeset
955 JVM_ENTRY(jclass, JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source))
a61af66fc99e Initial load
duke
parents:
diff changeset
956 JVMWrapper2("JVM_DefineClassWithSource %s", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
957
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
958 return jvm_define_class_common(env, name, loader, buf, len, pd, source, true, THREAD);
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
959 JVM_END
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
960
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
961 JVM_ENTRY(jclass, JVM_DefineClassWithSourceCond(JNIEnv *env, const char *name,
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
962 jobject loader, const jbyte *buf,
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
963 jsize len, jobject pd,
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
964 const char *source, jboolean verify))
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
965 JVMWrapper2("JVM_DefineClassWithSourceCond %s", name);
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
966
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
967 return jvm_define_class_common(env, name, loader, buf, len, pd, source, verify, THREAD);
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 878
diff changeset
968 JVM_END
0
a61af66fc99e Initial load
duke
parents:
diff changeset
969
a61af66fc99e Initial load
duke
parents:
diff changeset
970 JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name))
a61af66fc99e Initial load
duke
parents:
diff changeset
971 JVMWrapper("JVM_FindLoadedClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
972 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
973
a61af66fc99e Initial load
duke
parents:
diff changeset
974 Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
975 Handle string = java_lang_String::internalize_classname(h_name, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
976
a61af66fc99e Initial load
duke
parents:
diff changeset
977 const char* str = java_lang_String::as_utf8_string(string());
a61af66fc99e Initial load
duke
parents:
diff changeset
978 // Sanity check, don't expect null
a61af66fc99e Initial load
duke
parents:
diff changeset
979 if (str == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
980
a61af66fc99e Initial load
duke
parents:
diff changeset
981 const int str_len = (int)strlen(str);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
982 if (str_len > Symbol::max_length()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
983 // It's impossible to create this class; the name cannot fit
a61af66fc99e Initial load
duke
parents:
diff changeset
984 // into the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
985 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
986 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
987 TempNewSymbol klass_name = SymbolTable::new_symbol(str, str_len, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
988
a61af66fc99e Initial load
duke
parents:
diff changeset
989 // Security Note:
a61af66fc99e Initial load
duke
parents:
diff changeset
990 // The Java level wrapper will perform the necessary security check allowing
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // us to pass the NULL as the initiating class loader.
a61af66fc99e Initial load
duke
parents:
diff changeset
992 Handle h_loader(THREAD, JNIHandles::resolve(loader));
a61af66fc99e Initial load
duke
parents:
diff changeset
993 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
994 is_lock_held_by_thread(h_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
995 ClassLoader::sync_JVMFindLoadedClassLockFreeCounter(),
a61af66fc99e Initial load
duke
parents:
diff changeset
996 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
997 }
a61af66fc99e Initial load
duke
parents:
diff changeset
998
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
999 Klass* k = SystemDictionary::find_instance_or_array_klass(klass_name,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 h_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 Handle(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 CHECK_NULL);
20375
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
1003 #if INCLUDE_CDS
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
1004 if (k == NULL) {
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
1005 // If the class is not already loaded, try to see if it's in the shared
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
1006 // archive for the current classloader (h_loader).
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
1007 instanceKlassHandle ik = SystemDictionaryShared::find_or_load_shared_class(
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
1008 klass_name, h_loader, CHECK_NULL);
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
1009 k = ik();
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
1010 }
6e0cb14ce59b 8046070: Class Data Sharing clean up and refactoring
iklam
parents: 20197
diff changeset
1011 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 return (k == NULL) ? NULL :
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1013 (jclass) JNIHandles::make_local(env, k->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 // Reflection support //////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 JVM_ENTRY(jstring, JVM_GetClassName(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 assert (cls != NULL, "illegal class");
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 JVMWrapper("JVM_GetClassName");
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 const char* name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 name = type2name(java_lang_Class::primitive_type(JNIHandles::resolve(cls)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // Consider caching interned string in Klass
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1029 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 assert(k->is_klass(), "just checking");
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1031 name = k->external_name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 oop result = StringTable::intern((char*) name, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 return (jstring) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1036
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 JVM_ENTRY(jobjectArray, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 JVMWrapper("JVM_GetClassInterfaces");
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
1042
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 // Special handling for primitive objects
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 if (java_lang_Class::is_primitive(mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 // Primitive objects does not have any interfaces
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1046 objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 return (jobjectArray) JNIHandles::make_local(env, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1049
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1050 KlassHandle klass(thread, java_lang_Class::as_Klass(mirror));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 // Figure size of result array
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 int size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 if (klass->oop_is_instance()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1054 size = InstanceKlass::cast(klass())->local_interfaces()->length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 assert(klass->oop_is_objArray() || klass->oop_is_typeArray(), "Illegal mirror klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 size = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1059
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 // Allocate result array
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1061 objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), size, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 objArrayHandle result (THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // Fill in result
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 if (klass->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // Regular instance klass, fill in all local interfaces
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 for (int index = 0; index < size; index++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1067 Klass* k = InstanceKlass::cast(klass())->local_interfaces()->at(index);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1068 result->obj_at_put(index, k->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 // All arrays implement java.lang.Cloneable and java.io.Serializable
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1072 result->obj_at_put(0, SystemDictionary::Cloneable_klass()->java_mirror());
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1073 result->obj_at_put(1, SystemDictionary::Serializable_klass()->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 return (jobjectArray) JNIHandles::make_local(env, result());
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1077
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 JVM_ENTRY(jobject, JVM_GetClassLoader(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 JVMWrapper("JVM_GetClassLoader");
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1084 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1085 oop loader = k->class_loader();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 return JNIHandles::make_local(env, loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1088
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 JVM_QUICK_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 JVMWrapper("JVM_IsInterface");
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 if (java_lang_Class::is_primitive(mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1096 Klass* k = java_lang_Class::as_Klass(mirror);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1097 jboolean result = k->is_interface();
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1098 assert(!result || k->oop_is_instance(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 "all interfaces are instance types");
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // The compiler intrinsic for isInterface tests the
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 // Klass::_access_flags bits in the same way.
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1104
a61af66fc99e Initial load
duke
parents:
diff changeset
1105
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 JVMWrapper("JVM_GetClassSigners");
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 // There are no signers for primitive types
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1113
10343
6bd680e9ea35 8003421: NPG: Move oops out of InstanceKlass into mirror
coleenp
parents: 10265
diff changeset
1114 objArrayOop signers = java_lang_Class::signers(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1115
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 // If there are no signers set in the class, or if the class
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 // is an array, return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 if (signers == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1119
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 // copy of the signers array
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
1121 Klass* element = ObjArrayKlass::cast(signers->klass())->element_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 objArrayOop signers_copy = oopFactory::new_objArray(element, signers->length(), CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 for (int index = 0; index < signers->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 signers_copy->obj_at_put(index, signers->obj_at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1126
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 // return the copy
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 return (jobjectArray) JNIHandles::make_local(env, signers_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1130
a61af66fc99e Initial load
duke
parents:
diff changeset
1131
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 JVM_ENTRY(void, JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers))
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 JVMWrapper("JVM_SetClassSigners");
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 // This call is ignored for primitive types and arrays.
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 // Signers are only set once, ClassLoader.java, and thus shouldn't
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 // be called with an array. Only the bootstrap loader creates arrays.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1138 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1139 if (k->oop_is_instance()) {
10343
6bd680e9ea35 8003421: NPG: Move oops out of InstanceKlass into mirror
coleenp
parents: 10265
diff changeset
1140 java_lang_Class::set_signers(k->java_mirror(), objArrayOop(JNIHandles::resolve(signers)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1144
a61af66fc99e Initial load
duke
parents:
diff changeset
1145
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 JVM_ENTRY(jobject, JVM_GetProtectionDomain(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 JVMWrapper("JVM_GetProtectionDomain");
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 if (JNIHandles::resolve(cls) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 THROW_(vmSymbols::java_lang_NullPointerException(), NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1151
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 // Primitive types does not have a protection domain.
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1156
10343
6bd680e9ea35 8003421: NPG: Move oops out of InstanceKlass into mirror
coleenp
parents: 10265
diff changeset
1157 oop pd = java_lang_Class::protection_domain(JNIHandles::resolve(cls));
6bd680e9ea35 8003421: NPG: Move oops out of InstanceKlass into mirror
coleenp
parents: 10265
diff changeset
1158 return (jobject) JNIHandles::make_local(env, pd);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1160
a61af66fc99e Initial load
duke
parents:
diff changeset
1161
11010
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1162 static bool is_authorized(Handle context, instanceKlassHandle klass, TRAPS) {
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1163 // If there is a security manager and protection domain, check the access
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1164 // in the protection domain, otherwise it is authorized.
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1165 if (java_lang_System::has_security_manager()) {
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1166
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1167 // For bootstrapping, if pd implies method isn't in the JDK, allow
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1168 // this context to revert to older behavior.
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1169 // In this case the isAuthorized field in AccessControlContext is also not
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1170 // present.
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1171 if (Universe::protection_domain_implies_method() == NULL) {
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1172 return true;
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1173 }
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1174
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1175 // Whitelist certain access control contexts
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1176 if (java_security_AccessControlContext::is_authorized(context)) {
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1177 return true;
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1178 }
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1179
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1180 oop prot = klass->protection_domain();
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1181 if (prot != NULL) {
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1182 // Call pd.implies(new SecurityPermission("createAccessControlContext"))
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1183 // in the new wrapper.
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1184 methodHandle m(THREAD, Universe::protection_domain_implies_method());
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1185 Handle h_prot(THREAD, prot);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1186 JavaValue result(T_BOOLEAN);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1187 JavaCallArguments args(h_prot);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1188 JavaCalls::call(&result, m, &args, CHECK_false);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1189 return (result.get_jboolean() != 0);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1190 }
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1191 }
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1192 return true;
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1193 }
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1194
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1195 // Create an AccessControlContext with a protection domain with null codesource
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1196 // and null permissions - which gives no permissions.
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1197 oop create_dummy_access_control_context(TRAPS) {
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1198 InstanceKlass* pd_klass = InstanceKlass::cast(SystemDictionary::ProtectionDomain_klass());
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1199 // new ProtectionDomain(null,null);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1200 oop null_protection_domain = pd_klass->allocate_instance(CHECK_NULL);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1201 Handle null_pd(THREAD, null_protection_domain);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1202
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1203 // new ProtectionDomain[] {pd};
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1204 objArrayOop context = oopFactory::new_objArray(pd_klass, 1, CHECK_NULL);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1205 context->obj_at_put(0, null_pd());
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1206
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1207 // new AccessControlContext(new ProtectionDomain[] {pd})
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1208 objArrayHandle h_context(THREAD, context);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1209 oop result = java_security_AccessControlContext::create(h_context, false, Handle(), CHECK_NULL);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1210 return result;
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1211 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1212
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 JVM_ENTRY(jobject, JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException))
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 JVMWrapper("JVM_DoPrivileged");
a61af66fc99e Initial load
duke
parents:
diff changeset
1215
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 if (action == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 THROW_MSG_0(vmSymbols::java_lang_NullPointerException(), "Null action");
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1219
11010
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1220 // Compute the frame initiating the do privileged operation and setup the privileged stack
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1221 vframeStream vfst(thread);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1222 vfst.security_get_caller_frame(1);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1223
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1224 if (vfst.at_end()) {
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1225 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "no caller?");
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1226 }
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1227
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1228 Method* method = vfst.method();
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1229 instanceKlassHandle klass (THREAD, method->method_holder());
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1230
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1231 // Check that action object understands "Object run()"
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1232 Handle h_context;
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1233 if (context != NULL) {
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1234 h_context = Handle(THREAD, JNIHandles::resolve(context));
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1235 bool authorized = is_authorized(h_context, klass, CHECK_NULL);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1236 if (!authorized) {
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1237 // Create an unprivileged access control object and call it's run function
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1238 // instead.
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1239 oop noprivs = create_dummy_access_control_context(CHECK_NULL);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1240 h_context = Handle(THREAD, noprivs);
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1241 }
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1242 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1243
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // Check that action object understands "Object run()"
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 Handle object (THREAD, JNIHandles::resolve(action));
a61af66fc99e Initial load
duke
parents:
diff changeset
1246
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // get run() method
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1248 Method* m_oop = object->klass()->uncached_lookup_method(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 vmSymbols::run_method_name(),
17889
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17805
diff changeset
1250 vmSymbols::void_object_signature(),
386dd1c71858 8033150: invokestatic: IncompatibleClassChangeError trying to invoke static method from a parent in presence of conflicting defaults.
lfoltan
parents: 17805
diff changeset
1251 Klass::normal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 methodHandle m (THREAD, m_oop);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1253 if (m.is_null() || !m->is_method() || !m()->is_public() || m()->is_static()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "No run method");
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1256
11010
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1257 // Stack allocated list of privileged stack elements
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1258 PrivilegedElement pi;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 if (!vfst.at_end()) {
11010
b295e132102d 8001330: Improve on checking order
mullan
parents: 8870
diff changeset
1260 pi.initialize(&vfst, h_context(), thread->privileged_stack_top(), CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 thread->set_privileged_stack_top(&pi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1263
a61af66fc99e Initial load
duke
parents:
diff changeset
1264
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 // invoke the Object run() in the action object. We cannot use call_interface here, since the static type
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 // is not really known - it is either java.security.PrivilegedAction or java.security.PrivilegedExceptionAction
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 Handle pending_exception;
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 JavaValue result(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 JavaCallArguments args(object);
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 JavaCalls::call(&result, m, &args, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1271
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 // done with action, remove ourselves from the list
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 if (!vfst.at_end()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 assert(thread->privileged_stack_top() != NULL && thread->privileged_stack_top() == &pi, "wrong top element");
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 thread->set_privileged_stack_top(thread->privileged_stack_top()->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1277
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 pending_exception = Handle(THREAD, PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1281
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1282 if ( pending_exception->is_a(SystemDictionary::Exception_klass()) &&
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1283 !pending_exception->is_a(SystemDictionary::RuntimeException_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 // Throw a java.security.PrivilegedActionException(Exception e) exception
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 JavaCallArguments args(pending_exception);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1286 THROW_ARG_0(vmSymbols::java_security_PrivilegedActionException(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1287 vmSymbols::exception_void_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 &args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1291
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 if (pending_exception.not_null()) THROW_OOP_0(pending_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 return JNIHandles::make_local(env, (oop) result.get_jobject());
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1295
a61af66fc99e Initial load
duke
parents:
diff changeset
1296
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 // Returns the inherited_access_control_context field of the running thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 JVM_ENTRY(jobject, JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 JVMWrapper("JVM_GetInheritedAccessControlContext");
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 oop result = java_lang_Thread::inherited_access_control_context(thread->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1303
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 class RegisterArrayForGC {
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 JavaThread *_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 RegisterArrayForGC(JavaThread *thread, GrowableArray<oop>* array) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 _thread->register_array_for_gc(array);
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1312
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 ~RegisterArrayForGC() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 _thread->register_array_for_gc(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1317
a61af66fc99e Initial load
duke
parents:
diff changeset
1318
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 JVM_ENTRY(jobject, JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 JVMWrapper("JVM_GetStackAccessControlContext");
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 if (!UsePrivilegedStack) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1322
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 GrowableArray<oop>* local_array = new GrowableArray<oop>(12);
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1326
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 // count the protection domains on the execution stack. We collapse
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 // duplicate consecutive protection domains into a single one, as
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 // well as stopping when we hit a privileged frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
1330
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 // Use vframeStream to iterate through Java frames
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 vframeStream vfst(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1333
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 oop previous_protection_domain = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 Handle privileged_context(thread, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 bool is_privileged = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 oop protection_domain = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1338
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 for(; !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 // get method of frame
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1341 Method* method = vfst.method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 intptr_t* frame_id = vfst.frame_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1343
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 // check the privileged frames to see if we have a match
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 if (thread->privileged_stack_top() && thread->privileged_stack_top()->frame_id() == frame_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 // this frame is privileged
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 is_privileged = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 privileged_context = Handle(thread, thread->privileged_stack_top()->privileged_context());
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 protection_domain = thread->privileged_stack_top()->protection_domain();
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 } else {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
1351 protection_domain = method->method_holder()->protection_domain();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1353
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 if ((previous_protection_domain != protection_domain) && (protection_domain != NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 local_array->push(protection_domain);
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 previous_protection_domain = protection_domain;
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1358
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 if (is_privileged) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1361
a61af66fc99e Initial load
duke
parents:
diff changeset
1362
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 // either all the domains on the stack were system domains, or
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 // we had a privileged system domain
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 if (local_array->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 if (is_privileged && privileged_context.is_null()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1367
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 oop result = java_security_AccessControlContext::create(objArrayHandle(), is_privileged, privileged_context, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1371
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 // the resource area must be registered in case of a gc
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 RegisterArrayForGC ragc(thread, local_array);
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1374 objArrayOop context = oopFactory::new_objArray(SystemDictionary::ProtectionDomain_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 local_array->length(), CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 objArrayHandle h_context(thread, context);
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 for (int index = 0; index < local_array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 h_context->obj_at_put(index, local_array->at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1380
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 oop result = java_security_AccessControlContext::create(h_context, is_privileged, privileged_context, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1382
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1385
a61af66fc99e Initial load
duke
parents:
diff changeset
1386
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 JVM_QUICK_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 JVMWrapper("JVM_IsArrayClass");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1389 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1390 return (k != NULL) && k->oop_is_array() ? true : false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1392
a61af66fc99e Initial load
duke
parents:
diff changeset
1393
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 JVM_QUICK_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 JVMWrapper("JVM_IsPrimitiveClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 return (jboolean) java_lang_Class::is_primitive(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1399
a61af66fc99e Initial load
duke
parents:
diff changeset
1400
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 JVM_ENTRY(jclass, JVM_GetComponentType(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 JVMWrapper("JVM_GetComponentType");
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 oop result = Reflection::array_component_type(mirror, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 return (jclass) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1407
a61af66fc99e Initial load
duke
parents:
diff changeset
1408
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 JVM_ENTRY(jint, JVM_GetClassModifiers(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 JVMWrapper("JVM_GetClassModifiers");
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 // Primitive type
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1415
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1416 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 debug_only(int computed_modifiers = k->compute_modifier_flags(CHECK_0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK");
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 return k->modifier_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1421
a61af66fc99e Initial load
duke
parents:
diff changeset
1422
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 // Inner class reflection ///////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
1424
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 // ofClass is a reference to a java_lang_Class object. The mirror object
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1428 // of an InstanceKlass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1429
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1431 ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_instance()) {
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1432 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 return (jobjectArray)JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1435
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1436 instanceKlassHandle k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
5967
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1437 InnerClassesIterator iter(k);
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1438
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1439 if (iter.length() == 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 // Neither an inner nor outer class
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1441 oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 return (jobjectArray)JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1444
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 // find inner class info
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 constantPoolHandle cp(thread, k->constants());
5967
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1447 int length = iter.length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1448
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 // Allocate temp. result array
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1450 objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), length/4, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 objArrayHandle result (THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 int members = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1453
5967
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1454 for (; !iter.done(); iter.next()) {
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1455 int ioff = iter.inner_class_info_index();
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1456 int ooff = iter.outer_class_info_index();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1457
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 if (ioff != 0 && ooff != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 // Check to see if the name matches the class we're looking for
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 // before attempting to find the class.
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 if (cp->klass_name_at_matches(k, ooff)) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1462 Klass* outer_klass = cp->klass_at(ooff, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 if (outer_klass == k()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1464 Klass* ik = cp->klass_at(ioff, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 instanceKlassHandle inner_klass (THREAD, ik);
a61af66fc99e Initial load
duke
parents:
diff changeset
1466
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 // Throws an exception if outer klass has not declared k as
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 // an inner klass
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1469 Reflection::check_for_inner_class(k, inner_klass, true, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1470
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 result->obj_at_put(members, inner_klass->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 members++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1477
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 if (members != length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 // Return array of right length
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1480 objArrayOop res = oopFactory::new_objArray(SystemDictionary::Class_klass(), members, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 for(int i = 0; i < members; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 res->obj_at_put(i, result->obj_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 return (jobjectArray)JNIHandles::make_local(env, res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1486
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 return (jobjectArray)JNIHandles::make_local(env, result());
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1489
a61af66fc99e Initial load
duke
parents:
diff changeset
1490
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1492 {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 // ofClass is a reference to a java_lang_Class object.
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1495 ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_instance()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1498
1126
933a3e806ce6 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 1059
diff changeset
1499 bool inner_is_member = false;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1500 Klass* outer_klass
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1501 = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))
1126
933a3e806ce6 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 1059
diff changeset
1502 )->compute_enclosing_class(&inner_is_member, CHECK_NULL);
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1503 if (outer_klass == NULL) return NULL; // already a top-level class
1126
933a3e806ce6 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 1059
diff changeset
1504 if (!inner_is_member) return NULL; // an anonymous class (inside a method)
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1505 return (jclass) JNIHandles::make_local(env, outer_klass->java_mirror());
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1506 }
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1507 JVM_END
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1508
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1509 // should be in InstanceKlass.cpp, but is here for historical reasons
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1510 Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
1126
933a3e806ce6 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 1059
diff changeset
1511 bool* inner_is_member,
933a3e806ce6 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 1059
diff changeset
1512 TRAPS) {
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1513 Thread* thread = THREAD;
5967
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1514 InnerClassesIterator iter(k);
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1515 if (iter.length() == 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 // No inner class info => no declaring class
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1519
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 constantPoolHandle i_cp(thread, k->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
1521
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 bool found = false;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1523 Klass* ok;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 instanceKlassHandle outer_klass;
1126
933a3e806ce6 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 1059
diff changeset
1525 *inner_is_member = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1526
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 // Find inner_klass attribute
5967
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1528 for (; !iter.done() && !found; iter.next()) {
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1529 int ioff = iter.inner_class_info_index();
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1530 int ooff = iter.outer_class_info_index();
f7c4174b33ba 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 4872
diff changeset
1531 int noff = iter.inner_name_index();
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1532 if (ioff != 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 // Check to see if the name matches the class we're looking for
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 // before attempting to find the class.
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 if (i_cp->klass_name_at_matches(k, ioff)) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1536 Klass* inner_klass = i_cp->klass_at(ioff, CHECK_NULL);
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1537 found = (k() == inner_klass);
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1538 if (found && ooff != 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 ok = i_cp->klass_at(ooff, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 outer_klass = instanceKlassHandle(thread, ok);
1126
933a3e806ce6 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 1059
diff changeset
1541 *inner_is_member = true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1546
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1547 if (found && outer_klass.is_null()) {
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1548 // It may be anonymous; try for that.
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1549 int encl_method_class_idx = k->enclosing_method_class_index();
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1550 if (encl_method_class_idx != 0) {
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1551 ok = i_cp->klass_at(encl_method_class_idx, CHECK_NULL);
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1552 outer_klass = instanceKlassHandle(thread, ok);
1126
933a3e806ce6 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 1059
diff changeset
1553 *inner_is_member = false;
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1554 }
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1555 }
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1556
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 // If no inner class attribute found for this class.
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1558 if (outer_klass.is_null()) return NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1559
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 // Throws an exception if outer klass has not declared k as an inner klass
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1561 // We need evidence that each klass knows about the other, or else
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1562 // the system could allow a spoof of an inner class to gain access rights.
1126
933a3e806ce6 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 1059
diff changeset
1563 Reflection::check_for_inner_class(outer_klass, k, *inner_is_member, CHECK_NULL);
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1564 return outer_klass();
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
1565 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1566
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 assert (cls != NULL, "illegal class");
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 JVMWrapper("JVM_GetClassSignature");
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 // Return null for arrays and primatives
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1574 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1575 if (k->oop_is_instance()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1576 Symbol* sym = InstanceKlass::cast(k)->generic_signature();
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
1577 if (sym == NULL) return NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 return (jstring) JNIHandles::make_local(env, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1584
a61af66fc99e Initial load
duke
parents:
diff changeset
1585
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 assert (cls != NULL, "illegal class");
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 JVMWrapper("JVM_GetClassAnnotations");
8818
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1589
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 // Return null for arrays and primitives
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1592 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1593 if (k->oop_is_instance()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1594 typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1595 return (jbyteArray) JNIHandles::make_local(env, a);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1600
a61af66fc99e Initial load
duke
parents:
diff changeset
1601
8818
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1602 static bool jvm_get_field_common(jobject field, fieldDescriptor& fd, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 // some of this code was adapted from from jni_FromReflectedField
a61af66fc99e Initial load
duke
parents:
diff changeset
1604
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 oop reflected = JNIHandles::resolve_non_null(field);
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 oop mirror = java_lang_reflect_Field::clazz(reflected);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1607 Klass* k = java_lang_Class::as_Klass(mirror);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 int slot = java_lang_reflect_Field::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 int modifiers = java_lang_reflect_Field::modifiers(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1610
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 KlassHandle kh(THREAD, k);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1612 intptr_t offset = InstanceKlass::cast(kh())->field_offset(slot);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1613
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 if (modifiers & JVM_ACC_STATIC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 // for static fields we only look in the current class
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1616 if (!InstanceKlass::cast(kh())->find_local_field_from_offset(offset, true, &fd)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 assert(false, "cannot find static field");
8818
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1618 return false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 // for instance fields we start with the current class and work
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 // our way up through the superclass chain
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1623 if (!InstanceKlass::cast(kh())->find_field_from_offset(offset, false, &fd)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 assert(false, "cannot find instance field");
8818
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1625 return false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 }
8818
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1628 return true;
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1629 }
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1630
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1631 JVM_ENTRY(jbyteArray, JVM_GetFieldAnnotations(JNIEnv *env, jobject field))
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1632 // field is a handle to a java.lang.reflect.Field object
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1633 assert(field != NULL, "illegal field");
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1634 JVMWrapper("JVM_GetFieldAnnotations");
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1635
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1636 fieldDescriptor fd;
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1637 bool gotFd = jvm_get_field_common(field, fd, CHECK_NULL);
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1638 if (!gotFd) {
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1639 return NULL;
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1640 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1641
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1642 return (jbyteArray) JNIHandles::make_local(env, Annotations::make_java_array(fd.annotations(), THREAD));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1644
a61af66fc99e Initial load
duke
parents:
diff changeset
1645
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1646 static Method* jvm_get_method_common(jobject method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 // some of this code was adapted from from jni_FromReflectedMethod
a61af66fc99e Initial load
duke
parents:
diff changeset
1648
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 oop reflected = JNIHandles::resolve_non_null(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 oop mirror = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 int slot = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1652
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1653 if (reflected->klass() == SystemDictionary::reflect_Constructor_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 mirror = java_lang_reflect_Constructor::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 slot = java_lang_reflect_Constructor::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 } else {
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1657 assert(reflected->klass() == SystemDictionary::reflect_Method_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 "wrong type");
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 mirror = java_lang_reflect_Method::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 slot = java_lang_reflect_Method::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1662 Klass* k = java_lang_Class::as_Klass(mirror);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1663
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1664 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
8818
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1665 assert(m != NULL, "cannot find method");
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1666 return m; // caller has to deal with NULL in product mode
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1668
a61af66fc99e Initial load
duke
parents:
diff changeset
1669
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 JVM_ENTRY(jbyteArray, JVM_GetMethodAnnotations(JNIEnv *env, jobject method))
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 JVMWrapper("JVM_GetMethodAnnotations");
a61af66fc99e Initial load
duke
parents:
diff changeset
1672
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 // method is a handle to a java.lang.reflect.Method object
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1674 Method* m = jvm_get_method_common(method);
8818
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1675 if (m == NULL) {
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1676 return NULL;
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1677 }
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1678
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1679 return (jbyteArray) JNIHandles::make_local(env,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1680 Annotations::make_java_array(m->annotations(), THREAD));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1682
a61af66fc99e Initial load
duke
parents:
diff changeset
1683
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 JVM_ENTRY(jbyteArray, JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method))
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 JVMWrapper("JVM_GetMethodDefaultAnnotationValue");
a61af66fc99e Initial load
duke
parents:
diff changeset
1686
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 // method is a handle to a java.lang.reflect.Method object
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1688 Method* m = jvm_get_method_common(method);
8818
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1689 if (m == NULL) {
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1690 return NULL;
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1691 }
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1692
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1693 return (jbyteArray) JNIHandles::make_local(env,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1694 Annotations::make_java_array(m->annotation_default(), THREAD));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1696
a61af66fc99e Initial load
duke
parents:
diff changeset
1697
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 JVM_ENTRY(jbyteArray, JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method))
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 JVMWrapper("JVM_GetMethodParameterAnnotations");
a61af66fc99e Initial load
duke
parents:
diff changeset
1700
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 // method is a handle to a java.lang.reflect.Method object
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1702 Method* m = jvm_get_method_common(method);
8818
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1703 if (m == NULL) {
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1704 return NULL;
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1705 }
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1706
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1707 return (jbyteArray) JNIHandles::make_local(env,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1708 Annotations::make_java_array(m->parameter_annotations(), THREAD));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1710
7457
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1711 /* Type use annotations support (JDK 1.8) */
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1712
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1713 JVM_ENTRY(jbyteArray, JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls))
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1714 assert (cls != NULL, "illegal class");
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1715 JVMWrapper("JVM_GetClassTypeAnnotations");
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1716 ResourceMark rm(THREAD);
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1717 // Return null for arrays and primitives
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1718 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1719 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1720 if (k->oop_is_instance()) {
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 8028
diff changeset
1721 AnnotationArray* type_annotations = InstanceKlass::cast(k)->class_type_annotations();
7611
ff0a7943fd29 8005994: Method annotations are allocated unnecessarily during class file parsing
stefank
parents: 7462
diff changeset
1722 if (type_annotations != NULL) {
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 8028
diff changeset
1723 typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);
7611
ff0a7943fd29 8005994: Method annotations are allocated unnecessarily during class file parsing
stefank
parents: 7462
diff changeset
1724 return (jbyteArray) JNIHandles::make_local(env, a);
ff0a7943fd29 8005994: Method annotations are allocated unnecessarily during class file parsing
stefank
parents: 7462
diff changeset
1725 }
7457
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1726 }
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1727 }
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1728 return NULL;
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1729 JVM_END
35431a769282 8004823: Add VM support for type annotation reflection
stefank
parents: 6983
diff changeset
1730
8818
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1731 JVM_ENTRY(jbyteArray, JVM_GetMethodTypeAnnotations(JNIEnv *env, jobject method))
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1732 assert (method != NULL, "illegal method");
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1733 JVMWrapper("JVM_GetMethodTypeAnnotations");
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1734
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1735 // method is a handle to a java.lang.reflect.Method object
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1736 Method* m = jvm_get_method_common(method);
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1737 if (m == NULL) {
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1738 return NULL;
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1739 }
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1740
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1741 AnnotationArray* type_annotations = m->type_annotations();
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1742 if (type_annotations != NULL) {
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1743 typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1744 return (jbyteArray) JNIHandles::make_local(env, a);
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1745 }
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1746
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1747 return NULL;
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1748 JVM_END
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1749
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1750 JVM_ENTRY(jbyteArray, JVM_GetFieldTypeAnnotations(JNIEnv *env, jobject field))
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1751 assert (field != NULL, "illegal field");
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1752 JVMWrapper("JVM_GetFieldTypeAnnotations");
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1753
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1754 fieldDescriptor fd;
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1755 bool gotFd = jvm_get_field_common(field, fd, CHECK_NULL);
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1756 if (!gotFd) {
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1757 return NULL;
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1758 }
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1759
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1760 return (jbyteArray) JNIHandles::make_local(env, Annotations::make_java_array(fd.type_annotations(), THREAD));
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1761 JVM_END
1916ca1dec2f 8009382: Add JVM_Get{Field|Method}TypeAnnotations
rbackman
parents: 8805
diff changeset
1762
7588
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1763 static void bounds_check(constantPoolHandle cp, jint index, TRAPS) {
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1764 if (!cp->is_within_bounds(index)) {
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1765 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool index out of bounds");
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1766 }
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1767 }
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1768
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1769 JVM_ENTRY(jobjectArray, JVM_GetMethodParameters(JNIEnv *env, jobject method))
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1770 {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1771 JVMWrapper("JVM_GetMethodParameters");
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1772 // method is a handle to a java.lang.reflect.Method object
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1773 Method* method_ptr = jvm_get_method_common(method);
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1774 methodHandle mh (THREAD, method_ptr);
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1775 Handle reflected_method (THREAD, JNIHandles::resolve_non_null(method));
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1776 const int num_params = mh->method_parameters_length();
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1777
7588
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1778 if (0 != num_params) {
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1779 // make sure all the symbols are properly formatted
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1780 for (int i = 0; i < num_params; i++) {
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1781 MethodParametersElement* params = mh->method_parameters_start();
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1782 int index = params[i].name_cp_index;
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1783 bounds_check(mh->constants(), index, CHECK_NULL);
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1784
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1785 if (0 != index && !mh->constants()->tag_at(index).is_utf8()) {
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1786 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1787 "Wrong type at constant pool index");
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1788 }
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1789
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1790 }
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1791
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1792 objArrayOop result_oop = oopFactory::new_objArray(SystemDictionary::reflect_Parameter_klass(), num_params, CHECK_NULL);
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1793 objArrayHandle result (THREAD, result_oop);
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1794
7588
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1795 for (int i = 0; i < num_params; i++) {
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1796 MethodParametersElement* params = mh->method_parameters_start();
7588
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1797 // For a 0 index, give a NULL symbol
10265
92ef81e2f571 8003557: NPG: Klass* const k should be const Klass* k.
minqi
parents: 8870
diff changeset
1798 Symbol* sym = 0 != params[i].name_cp_index ?
7588
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1799 mh->constants()->symbol_at(params[i].name_cp_index) : NULL;
7983
24a91505f9d5 8006949: Update hotspot for MethodParameters format change
emc
parents: 7958
diff changeset
1800 int flags = params[i].flags;
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1801 oop param = Reflection::new_parameter(reflected_method, i, sym,
7588
f9eb431c3efe 8006005: Fix constant pool index validation and alignment trap for method parameter reflection
coleenp
parents: 7462
diff changeset
1802 flags, CHECK_NULL);
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1803 result->obj_at_put(i, param);
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1804 }
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1805 return (jobjectArray)JNIHandles::make_local(env, result());
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1806 } else {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1807 return (jobjectArray)NULL;
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1808 }
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1809 }
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7457
diff changeset
1810 JVM_END
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1811
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 // New (JDK 1.4) reflection implementation /////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
1813
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly))
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 JVMWrapper("JVM_GetClassDeclaredFields");
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1818
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 // Exclude primitive types and array types
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1821 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 // Return empty array
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1823 oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 return (jobjectArray) JNIHandles::make_local(env, res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1826
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1827 instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 constantPoolHandle cp(THREAD, k->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
1829
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 // Ensure class is linked
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 k->link_class(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1832
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 // 4496456 We need to filter out java.lang.Throwable.backtrace
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 bool skip_backtrace = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1835
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 // Allocate result
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 int num_fields;
a61af66fc99e Initial load
duke
parents:
diff changeset
1838
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 if (publicOnly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 num_fields = 0;
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
1841 for (JavaFieldStream fs(k()); !fs.done(); fs.next()) {
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
1842 if (fs.access_flags().is_public()) ++num_fields;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 } else {
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
1845 num_fields = k->java_fields_count();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1846
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1847 if (k() == SystemDictionary::Throwable_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 num_fields--;
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 skip_backtrace = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1852
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
1853 objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), num_fields, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 objArrayHandle result (THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1855
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 int out_idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 fieldDescriptor fd;
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
1858 for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 if (skip_backtrace) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 // 4496456 skip java.lang.Throwable.backtrace
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
1861 int offset = fs.offset();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 if (offset == java_lang_Throwable::get_backtrace_offset()) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1864
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
1865 if (!publicOnly || fs.access_flags().is_public()) {
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 11099
diff changeset
1866 fd.reinitialize(k(), fs.index());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 oop field = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 result->obj_at_put(out_idx, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 ++out_idx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 assert(out_idx == num_fields, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 return (jobjectArray) JNIHandles::make_local(env, result());
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1876
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1877 static bool select_method(methodHandle method, bool want_constructor) {
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1878 if (want_constructor) {
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1879 return (method->is_initializer() && !method->is_static());
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1880 } else {
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1881 return (!method->is_initializer() && !method->is_overpass());
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1882 }
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1883 }
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1884
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1885 static jobjectArray get_class_declared_methods_helper(
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1886 JNIEnv *env,
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1887 jclass ofClass, jboolean publicOnly,
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1888 bool want_constructor,
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1889 Klass* klass, TRAPS) {
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1890
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1892
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 // Exclude primitive types and array types
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1895 || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 // Return empty array
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1897 oop res = oopFactory::new_objArray(klass, 0, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 return (jobjectArray) JNIHandles::make_local(env, res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1900
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1901 instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1902
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 // Ensure class is linked
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 k->link_class(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1905
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1906 Array<Method*>* methods = k->methods();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 int methods_length = methods->length();
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1908
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1909 // Save original method_idnum in case of redefinition, which can change
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1910 // the idnum of obsolete methods. The new method will have the same idnum
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1911 // but if we refresh the methods array, the counts will be wrong.
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1912 ResourceMark rm(THREAD);
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1913 GrowableArray<int>* idnums = new GrowableArray<int>(methods_length);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 int num_methods = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1915
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1916 for (int i = 0; i < methods_length; i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1917 methodHandle method(THREAD, methods->at(i));
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1918 if (select_method(method, want_constructor)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 if (!publicOnly || method->is_public()) {
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1920 idnums->push(method->method_idnum());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 ++num_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1925
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 // Allocate result
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1927 objArrayOop r = oopFactory::new_objArray(klass, num_methods, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 objArrayHandle result (THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1929
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1930 // Now just put the methods that we selected above, but go by their idnum
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1931 // in case of redefinition. The methods can be redefined at any safepoint,
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1932 // so above when allocating the oop array and below when creating reflect
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1933 // objects.
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1934 for (int i = 0; i < num_methods; i++) {
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1935 methodHandle method(THREAD, k->method_with_idnum(idnums->at(i)));
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1936 if (method.is_null()) {
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1937 // Method may have been deleted and seems this API can handle null
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1938 // Otherwise should probably put a method that throws NSME
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1939 result->obj_at_put(i, NULL);
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1940 } else {
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1941 oop m;
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1942 if (want_constructor) {
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1943 m = Reflection::new_constructor(method, CHECK_NULL);
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1944 } else {
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1945 m = Reflection::new_method(method, UseNewReflection, false, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 }
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1947 result->obj_at_put(i, m);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 }
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1950
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 return (jobjectArray) JNIHandles::make_local(env, result());
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 }
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1953
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1954 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1955 {
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1956 JVMWrapper("JVM_GetClassDeclaredMethods");
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1957 return get_class_declared_methods_helper(env, ofClass, publicOnly,
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1958 /*want_constructor*/ false,
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1959 SystemDictionary::reflect_Method_klass(), THREAD);
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1960 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1962
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly))
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 JVMWrapper("JVM_GetClassDeclaredConstructors");
12281
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1966 return get_class_declared_methods_helper(env, ofClass, publicOnly,
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1967 /*want_constructor*/ true,
4f9a42c33738 8022887: Assertion hit while using class and redefining it with RedefineClasses simultaneously
coleenp
parents: 11099
diff changeset
1968 SystemDictionary::reflect_Constructor_klass(), THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1971
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 JVMWrapper("JVM_GetClassAccessFlags");
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 // Primitive type
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1979
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1980 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1984
a61af66fc99e Initial load
duke
parents:
diff changeset
1985
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 // Constant pool access //////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
1987
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 JVMWrapper("JVM_GetClassConstantPool");
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1992
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 // Return null for primitives and arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1995 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1996 if (k->oop_is_instance()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 instanceKlassHandle k_h(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 Handle jcp = sun_reflect_ConstantPool::create(CHECK_NULL);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
1999 sun_reflect_ConstantPool::set_cp(jcp(), k_h->constants());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 return JNIHandles::make_local(jcp());
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2006
a61af66fc99e Initial load
duke
parents:
diff changeset
2007
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2008 JVM_ENTRY(jint, JVM_ConstantPoolGetSize(JNIEnv *env, jobject obj, jobject unused))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 JVMWrapper("JVM_ConstantPoolGetSize");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2011 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 return cp->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2015
a61af66fc99e Initial load
duke
parents:
diff changeset
2016
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2017 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 JVMWrapper("JVM_ConstantPoolGetClassAt");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2020 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 if (!tag.is_klass() && !tag.is_unresolved_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2026 Klass* k = cp->klass_at(index, CHECK_NULL);
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2191
diff changeset
2027 return (jclass) JNIHandles::make_local(k->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2030
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2031 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 JVMWrapper("JVM_ConstantPoolGetClassAtIfLoaded");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2034 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 if (!tag.is_klass() && !tag.is_unresolved_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2040 Klass* k = ConstantPool::klass_at_if_loaded(cp, index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 if (k == NULL) return NULL;
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2191
diff changeset
2042 return (jclass) JNIHandles::make_local(k->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2045
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 static jobject get_method_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 if (!tag.is_method() && !tag.is_interface_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 int klass_ref = cp->uncached_klass_ref_index_at(index);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2052 Klass* k_o;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 if (force_resolution) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 k_o = cp->klass_at(klass_ref, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2056 k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 if (k_o == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 instanceKlassHandle k(THREAD, k_o);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2060 Symbol* name = cp->uncached_name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2061 Symbol* sig = cp->uncached_signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 methodHandle m (THREAD, k->find_method(name, sig));
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 if (m.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up method in target class");
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 oop method;
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 if (!m->is_initializer() || m->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 method = Reflection::new_method(m, true, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 method = Reflection::new_constructor(m, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 return JNIHandles::make_local(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2074
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2075 JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 JVMWrapper("JVM_ConstantPoolGetMethodAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 JvmtiVMObjectAllocEventCollector oam;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2079 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 jobject res = get_method_at_helper(cp, index, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2085
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2086 JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 JVMWrapper("JVM_ConstantPoolGetMethodAtIfLoaded");
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 JvmtiVMObjectAllocEventCollector oam;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2090 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 jobject res = get_method_at_helper(cp, index, false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2096
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 static jobject get_field_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 if (!tag.is_field()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 int klass_ref = cp->uncached_klass_ref_index_at(index);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2103 Klass* k_o;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 if (force_resolution) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 k_o = cp->klass_at(klass_ref, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2107 k_o = ConstantPool::klass_at_if_loaded(cp, klass_ref);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 if (k_o == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 instanceKlassHandle k(THREAD, k_o);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2111 Symbol* name = cp->uncached_name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2112 Symbol* sig = cp->uncached_signature_ref_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 fieldDescriptor fd;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2114 Klass* target_klass = k->find_field(name, sig, &fd);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 if (target_klass == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class");
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 oop field = Reflection::new_field(&fd, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 return JNIHandles::make_local(field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2121
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2122 JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject obj, jobject unusedl, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 JVMWrapper("JVM_ConstantPoolGetFieldAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 JvmtiVMObjectAllocEventCollector oam;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2126 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 jobject res = get_field_at_helper(cp, index, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2132
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2133 JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 JVMWrapper("JVM_ConstantPoolGetFieldAtIfLoaded");
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 JvmtiVMObjectAllocEventCollector oam;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2137 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 jobject res = get_field_at_helper(cp, index, false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2143
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2144 JVM_ENTRY(jobjectArray, JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 JVMWrapper("JVM_ConstantPoolGetMemberRefInfoAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 JvmtiVMObjectAllocEventCollector oam;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2148 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 if (!tag.is_field_or_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 int klass_ref = cp->uncached_klass_ref_index_at(index);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2155 Symbol* klass_name = cp->klass_name_at(klass_ref);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2156 Symbol* member_name = cp->uncached_name_ref_at(index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2157 Symbol* member_sig = cp->uncached_signature_ref_at(index);
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
2158 objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::String_klass(), 3, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 objArrayHandle dest(THREAD, dest_o);
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 Handle str = java_lang_String::create_from_symbol(klass_name, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 dest->obj_at_put(0, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 str = java_lang_String::create_from_symbol(member_name, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 dest->obj_at_put(1, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 dest->obj_at_put(2, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 return (jobjectArray) JNIHandles::make_local(dest());
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2169
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2170 JVM_ENTRY(jint, JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 JVMWrapper("JVM_ConstantPoolGetIntAt");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2173 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 bounds_check(cp, index, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 if (!tag.is_int()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 return cp->int_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2182
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2183 JVM_ENTRY(jlong, JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 JVMWrapper("JVM_ConstantPoolGetLongAt");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2186 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 bounds_check(cp, index, CHECK_(0L));
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 if (!tag.is_long()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 return cp->long_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2195
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2196 JVM_ENTRY(jfloat, JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 JVMWrapper("JVM_ConstantPoolGetFloatAt");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2199 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 bounds_check(cp, index, CHECK_(0.0f));
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 if (!tag.is_float()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 return cp->float_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2208
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2209 JVM_ENTRY(jdouble, JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 JVMWrapper("JVM_ConstantPoolGetDoubleAt");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2212 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 bounds_check(cp, index, CHECK_(0.0));
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 if (!tag.is_double()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 return cp->double_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2221
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2222 JVM_ENTRY(jstring, JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 JVMWrapper("JVM_ConstantPoolGetStringAt");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2225 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 constantTag tag = cp->tag_at(index);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2228 if (!tag.is_string()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 oop str = cp->string_at(index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 return (jstring) JNIHandles::make_local(str);
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2235
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2236 JVM_ENTRY(jstring, JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject obj, jobject unused, jint index))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 JVMWrapper("JVM_ConstantPoolGetUTF8At");
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 JvmtiVMObjectAllocEventCollector oam;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2240 constantPoolHandle cp = constantPoolHandle(THREAD, sun_reflect_ConstantPool::get_cp(JNIHandles::resolve_non_null(obj)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 if (!tag.is_symbol()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2246 Symbol* sym = cp->symbol_at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 return (jstring) JNIHandles::make_local(str());
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2251
a61af66fc99e Initial load
duke
parents:
diff changeset
2252
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 // Assertion support. //////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2254
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 JVM_ENTRY(jboolean, JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 JVMWrapper("JVM_DesiredAssertionStatus");
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 assert(cls != NULL, "bad class");
a61af66fc99e Initial load
duke
parents:
diff changeset
2258
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 oop r = JNIHandles::resolve(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 assert(! java_lang_Class::is_primitive(r), "primitive classes not allowed");
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 if (java_lang_Class::is_primitive(r)) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2262
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2263 Klass* k = java_lang_Class::as_Klass(r);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2264 assert(k->oop_is_instance(), "must be an instance klass");
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2265 if (! k->oop_is_instance()) return false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2266
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 ResourceMark rm(THREAD);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2268 const char* name = k->name()->as_C_string();
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2269 bool system_class = k->class_loader() == NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 return JavaAssertions::enabled(name, system_class);
a61af66fc99e Initial load
duke
parents:
diff changeset
2271
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2273
a61af66fc99e Initial load
duke
parents:
diff changeset
2274
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 // Return a new AssertionStatusDirectives object with the fields filled in with
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 // command-line assertion arguments (i.e., -ea, -da).
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 JVM_ENTRY(jobject, JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused))
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 JVMWrapper("JVM_AssertionStatusDirectives");
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 oop asd = JavaAssertions::createAssertionStatusDirectives(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 return JNIHandles::make_local(env, asd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2283
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 // Verification ////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2285
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 // Reflection for the verifier /////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2287
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 // RedefineClasses support: bug 6214132 caused verification to fail.
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 // All functions from this section should call the jvmtiThreadSate function:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2290 // Klass* class_to_verify_considering_redefinition(Klass* klass).
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2291 // The function returns a Klass* of the _scratch_class if the verifier
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 // was invoked in the middle of the class redefinition.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2293 // Otherwise it returns its argument value which is the _the_class Klass*.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 // Please, refer to the description in the jvmtiThreadSate.hpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
2295
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 JVM_ENTRY(const char*, JVM_GetClassNameUTF(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 JVMWrapper("JVM_GetClassNameUTF");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2298 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2300 return k->name()->as_utf8();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2302
a61af66fc99e Initial load
duke
parents:
diff changeset
2303
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 JVM_QUICK_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types))
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 JVMWrapper("JVM_GetClassCPTypes");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2306 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2308 // types will have length zero if this is not an InstanceKlass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 // (length is determined by call to JVM_GetClassCPEntriesCount)
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2310 if (k->oop_is_instance()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2311 ConstantPool* cp = InstanceKlass::cast(k)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 for (int index = cp->length() - 1; index >= 0; index--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 constantTag tag = cp->tag_at(index);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2314 types[index] = (tag.is_unresolved_klass()) ? JVM_CONSTANT_Class : tag.value();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2318
a61af66fc99e Initial load
duke
parents:
diff changeset
2319
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 JVM_QUICK_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 JVMWrapper("JVM_GetClassCPEntriesCount");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2322 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2324 if (!k->oop_is_instance())
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 return 0;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2326 return InstanceKlass::cast(k)->constants()->length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2328
a61af66fc99e Initial load
duke
parents:
diff changeset
2329
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 JVM_QUICK_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 JVMWrapper("JVM_GetClassFieldsCount");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2332 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2334 if (!k->oop_is_instance())
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 return 0;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2336 return InstanceKlass::cast(k)->java_fields_count();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2338
a61af66fc99e Initial load
duke
parents:
diff changeset
2339
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 JVM_QUICK_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 JVMWrapper("JVM_GetClassMethodsCount");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2342 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2344 if (!k->oop_is_instance())
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 return 0;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2346 return InstanceKlass::cast(k)->methods()->length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2348
a61af66fc99e Initial load
duke
parents:
diff changeset
2349
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 // The following methods, used for the verifier, are never called with
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2351 // array klasses, so a direct cast to InstanceKlass is safe.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 // Typically, these methods are called in a loop with bounds determined
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 // by the results of JVM_GetClass{Fields,Methods}Count, which return
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 // zero for arrays.
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 JVM_QUICK_ENTRY(void, JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions))
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 JVMWrapper("JVM_GetMethodIxExceptionIndexes");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2357 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2359 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2360 int length = method->checked_exceptions_length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 if (length > 0) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2362 CheckedExceptionElement* table= method->checked_exceptions_start();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 exceptions[i] = table[i].class_cp_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2368
a61af66fc99e Initial load
duke
parents:
diff changeset
2369
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 JVMWrapper("JVM_GetMethodIxExceptionsCount");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2372 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2374 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2375 return method->checked_exceptions_length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2377
a61af66fc99e Initial load
duke
parents:
diff changeset
2378
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 JVM_QUICK_ENTRY(void, JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code))
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 JVMWrapper("JVM_GetMethodIxByteCode");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2381 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2383 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2384 memcpy(code, method->code_base(), method->code_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2386
a61af66fc99e Initial load
duke
parents:
diff changeset
2387
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 JVMWrapper("JVM_GetMethodIxByteCodeLength");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2390 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2392 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2393 return method->code_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2395
a61af66fc99e Initial load
duke
parents:
diff changeset
2396
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 JVM_QUICK_ENTRY(void, JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry))
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 JVMWrapper("JVM_GetMethodIxExceptionTableEntry");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2399 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2401 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2402 ExceptionTable extable(method);
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 5967
diff changeset
2403 entry->start_pc = extable.start_pc(entry_index);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 5967
diff changeset
2404 entry->end_pc = extable.end_pc(entry_index);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 5967
diff changeset
2405 entry->handler_pc = extable.handler_pc(entry_index);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 5967
diff changeset
2406 entry->catchType = extable.catch_type_index(entry_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2408
a61af66fc99e Initial load
duke
parents:
diff changeset
2409
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 JVMWrapper("JVM_GetMethodIxExceptionTableLength");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2412 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2414 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2415 return method->exception_table_length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2417
a61af66fc99e Initial load
duke
parents:
diff changeset
2418
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 JVMWrapper("JVM_GetMethodIxModifiers");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2421 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2423 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2424 return method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2426
a61af66fc99e Initial load
duke
parents:
diff changeset
2427
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 JVM_QUICK_ENTRY(jint, JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 JVMWrapper("JVM_GetFieldIxModifiers");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2430 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2431 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2432 return InstanceKlass::cast(k)->field_access_flags(field_index) & JVM_RECOGNIZED_FIELD_MODIFIERS;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2434
a61af66fc99e Initial load
duke
parents:
diff changeset
2435
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 JVMWrapper("JVM_GetMethodIxLocalsCount");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2438 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2440 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2441 return method->max_locals();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2443
a61af66fc99e Initial load
duke
parents:
diff changeset
2444
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 JVMWrapper("JVM_GetMethodIxArgsSize");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2447 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2449 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2450 return method->size_of_parameters();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2452
a61af66fc99e Initial load
duke
parents:
diff changeset
2453
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 JVMWrapper("JVM_GetMethodIxMaxStack");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2456 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2458 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2459 return method->verifier_max_stack();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2461
a61af66fc99e Initial load
duke
parents:
diff changeset
2462
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 JVM_QUICK_ENTRY(jboolean, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 JVMWrapper("JVM_IsConstructorIx");
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 ResourceMark rm(THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2466 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2468 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2469 return method->name() == vmSymbols::object_initializer_name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2471
a61af66fc99e Initial load
duke
parents:
diff changeset
2472
7958
815957d0203e 8004967: Default method cause VerifyError: Illegal use of nonvirtual
acorn
parents: 7951
diff changeset
2473 JVM_QUICK_ENTRY(jboolean, JVM_IsVMGeneratedMethodIx(JNIEnv *env, jclass cls, int method_index))
815957d0203e 8004967: Default method cause VerifyError: Illegal use of nonvirtual
acorn
parents: 7951
diff changeset
2474 JVMWrapper("JVM_IsVMGeneratedMethodIx");
815957d0203e 8004967: Default method cause VerifyError: Illegal use of nonvirtual
acorn
parents: 7951
diff changeset
2475 ResourceMark rm(THREAD);
815957d0203e 8004967: Default method cause VerifyError: Illegal use of nonvirtual
acorn
parents: 7951
diff changeset
2476 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
815957d0203e 8004967: Default method cause VerifyError: Illegal use of nonvirtual
acorn
parents: 7951
diff changeset
2477 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
815957d0203e 8004967: Default method cause VerifyError: Illegal use of nonvirtual
acorn
parents: 7951
diff changeset
2478 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
815957d0203e 8004967: Default method cause VerifyError: Illegal use of nonvirtual
acorn
parents: 7951
diff changeset
2479 return method->is_overpass();
815957d0203e 8004967: Default method cause VerifyError: Illegal use of nonvirtual
acorn
parents: 7951
diff changeset
2480 JVM_END
815957d0203e 8004967: Default method cause VerifyError: Illegal use of nonvirtual
acorn
parents: 7951
diff changeset
2481
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 JVM_ENTRY(const char*, JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 JVMWrapper("JVM_GetMethodIxIxUTF");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2484 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2486 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2487 return method->name()->as_utf8();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2489
a61af66fc99e Initial load
duke
parents:
diff changeset
2490
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 JVM_ENTRY(const char*, JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 JVMWrapper("JVM_GetMethodIxSignatureUTF");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2493 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2495 Method* method = InstanceKlass::cast(k)->methods()->at(method_index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2496 return method->signature()->as_utf8();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2498
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 * All of these JVM_GetCP-xxx methods are used by the old verifier to
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 * read entries in the constant pool. Since the old verifier always
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 * works on a copy of the code, it will not see any rewriting that
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 * may possibly occur in the middle of verification. So it is important
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 * that nothing it calls tries to use the cpCache instead of the raw
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 * constant pool, so we must use cp->uncached_x methods when appropriate.
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 */
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 JVM_ENTRY(const char*, JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 JVMWrapper("JVM_GetCPFieldNameUTF");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2509 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2511 ConstantPool* cp = InstanceKlass::cast(k)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 case JVM_CONSTANT_Fieldref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 return cp->uncached_name_ref_at(cp_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 fatal("JVM_GetCPFieldNameUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2521
a61af66fc99e Initial load
duke
parents:
diff changeset
2522
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 JVM_ENTRY(const char*, JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 JVMWrapper("JVM_GetCPMethodNameUTF");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2525 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2527 ConstantPool* cp = InstanceKlass::cast(k)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 case JVM_CONSTANT_InterfaceMethodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 case JVM_CONSTANT_Methodref:
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 973
diff changeset
2531 case JVM_CONSTANT_NameAndType: // for invokedynamic
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 return cp->uncached_name_ref_at(cp_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 fatal("JVM_GetCPMethodNameUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2539
a61af66fc99e Initial load
duke
parents:
diff changeset
2540
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 JVM_ENTRY(const char*, JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 JVMWrapper("JVM_GetCPMethodSignatureUTF");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2543 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2545 ConstantPool* cp = InstanceKlass::cast(k)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 case JVM_CONSTANT_InterfaceMethodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 case JVM_CONSTANT_Methodref:
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 973
diff changeset
2549 case JVM_CONSTANT_NameAndType: // for invokedynamic
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 return cp->uncached_signature_ref_at(cp_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 fatal("JVM_GetCPMethodSignatureUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2557
a61af66fc99e Initial load
duke
parents:
diff changeset
2558
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 JVM_ENTRY(const char*, JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 JVMWrapper("JVM_GetCPFieldSignatureUTF");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2561 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2563 ConstantPool* cp = InstanceKlass::cast(k)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 case JVM_CONSTANT_Fieldref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 return cp->uncached_signature_ref_at(cp_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 fatal("JVM_GetCPFieldSignatureUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2571 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2573
a61af66fc99e Initial load
duke
parents:
diff changeset
2574
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 JVM_ENTRY(const char*, JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 JVMWrapper("JVM_GetCPClassNameUTF");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2577 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2579 ConstantPool* cp = InstanceKlass::cast(k)->constants();
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2580 Symbol* classname = cp->klass_name_at(cp_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 return classname->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2583
a61af66fc99e Initial load
duke
parents:
diff changeset
2584
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 JVM_ENTRY(const char*, JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 JVMWrapper("JVM_GetCPFieldClassNameUTF");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2587 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2589 ConstantPool* cp = InstanceKlass::cast(k)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 case JVM_CONSTANT_Fieldref: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 int class_index = cp->uncached_klass_ref_index_at(cp_index);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2593 Symbol* classname = cp->klass_name_at(class_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 return classname->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 fatal("JVM_GetCPFieldClassNameUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2602
a61af66fc99e Initial load
duke
parents:
diff changeset
2603
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 JVM_ENTRY(const char*, JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 JVMWrapper("JVM_GetCPMethodClassNameUTF");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2606 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2608 ConstantPool* cp = InstanceKlass::cast(k)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 case JVM_CONSTANT_Methodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 case JVM_CONSTANT_InterfaceMethodref: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 int class_index = cp->uncached_klass_ref_index_at(cp_index);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2613 Symbol* classname = cp->klass_name_at(class_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 return classname->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 fatal("JVM_GetCPMethodClassNameUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2622
a61af66fc99e Initial load
duke
parents:
diff changeset
2623
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
2624 JVM_ENTRY(jint, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 JVMWrapper("JVM_GetCPFieldModifiers");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2626 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2627 Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2630 ConstantPool* cp = InstanceKlass::cast(k)->constants();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2631 ConstantPool* cp_called = InstanceKlass::cast(k_called)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 case JVM_CONSTANT_Fieldref: {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2634 Symbol* name = cp->uncached_name_ref_at(cp_index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2635 Symbol* signature = cp->uncached_signature_ref_at(cp_index);
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
2636 for (JavaFieldStream fs(k_called); !fs.done(); fs.next()) {
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
2637 if (fs.name() == name && fs.signature() == signature) {
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3895
diff changeset
2638 return fs.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 fatal("JVM_GetCPFieldModifiers: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2646 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2649
a61af66fc99e Initial load
duke
parents:
diff changeset
2650
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 JVM_QUICK_ENTRY(jint, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 JVMWrapper("JVM_GetCPMethodModifiers");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2653 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2654 Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2657 ConstantPool* cp = InstanceKlass::cast(k)->constants();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 case JVM_CONSTANT_Methodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 case JVM_CONSTANT_InterfaceMethodref: {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2661 Symbol* name = cp->uncached_name_ref_at(cp_index);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2662 Symbol* signature = cp->uncached_signature_ref_at(cp_index);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2663 Array<Method*>* methods = InstanceKlass::cast(k_called)->methods();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 int methods_count = methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 for (int i = 0; i < methods_count; i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2666 Method* method = methods->at(i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 if (method->name() == name && method->signature() == signature) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 return method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2673 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 fatal("JVM_GetCPMethodModifiers: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2679
a61af66fc99e Initial load
duke
parents:
diff changeset
2680
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 // Misc //////////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2682
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 JVM_LEAF(void, JVM_ReleaseUTF(const char *utf))
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 // So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2686
a61af66fc99e Initial load
duke
parents:
diff changeset
2687
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 JVM_ENTRY(jboolean, JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2))
a61af66fc99e Initial load
duke
parents:
diff changeset
2689 JVMWrapper("JVM_IsSameClassPackage");
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 oop class1_mirror = JNIHandles::resolve_non_null(class1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 oop class2_mirror = JNIHandles::resolve_non_null(class2);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2692 Klass* klass1 = java_lang_Class::as_Klass(class1_mirror);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
2693 Klass* klass2 = java_lang_Class::as_Klass(class2_mirror);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2694 return (jboolean) Reflection::is_same_class_package(klass1, klass2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2696
a61af66fc99e Initial load
duke
parents:
diff changeset
2697
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 // IO functions ////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2699
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 JVM_LEAF(jint, JVM_Open(const char *fname, jint flags, jint mode))
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 JVMWrapper2("JVM_Open (%s)", fname);
a61af66fc99e Initial load
duke
parents:
diff changeset
2702
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
2704 int result = os::open(fname, flags, mode);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2705 if (result >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2706 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 switch(errno) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 case EEXIST:
a61af66fc99e Initial load
duke
parents:
diff changeset
2710 return JVM_EEXIST;
a61af66fc99e Initial load
duke
parents:
diff changeset
2711 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2716
a61af66fc99e Initial load
duke
parents:
diff changeset
2717
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 JVM_LEAF(jint, JVM_Close(jint fd))
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 JVMWrapper2("JVM_Close (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
2721 return os::close(fd);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2722 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2723
a61af66fc99e Initial load
duke
parents:
diff changeset
2724
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 JVM_LEAF(jint, JVM_Read(jint fd, char *buf, jint nbytes))
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 JVMWrapper2("JVM_Read (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2727
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
2729 return (jint)os::restartable_read(fd, buf, nbytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2731
a61af66fc99e Initial load
duke
parents:
diff changeset
2732
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 JVM_LEAF(jint, JVM_Write(jint fd, char *buf, jint nbytes))
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 JVMWrapper2("JVM_Write (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2735
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
2737 return (jint)os::write(fd, buf, nbytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2738 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2739
a61af66fc99e Initial load
duke
parents:
diff changeset
2740
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 JVM_LEAF(jint, JVM_Available(jint fd, jlong *pbytes))
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 JVMWrapper2("JVM_Available (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2743 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
2744 return os::available(fd, pbytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2746
a61af66fc99e Initial load
duke
parents:
diff changeset
2747
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 JVM_LEAF(jlong, JVM_Lseek(jint fd, jlong offset, jint whence))
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17889
diff changeset
2749 JVMWrapper4("JVM_Lseek (0x%x, " INT64_FORMAT ", %d)", fd, (int64_t) offset, whence);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2750 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
2751 return os::lseek(fd, offset, whence);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2752 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2753
a61af66fc99e Initial load
duke
parents:
diff changeset
2754
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 JVM_LEAF(jint, JVM_SetLength(jint fd, jlong length))
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17889
diff changeset
2756 JVMWrapper3("JVM_SetLength (0x%x, " INT64_FORMAT ")", fd, (int64_t) length);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
2757 return os::ftruncate(fd, length);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2759
a61af66fc99e Initial load
duke
parents:
diff changeset
2760
a61af66fc99e Initial load
duke
parents:
diff changeset
2761 JVM_LEAF(jint, JVM_Sync(jint fd))
a61af66fc99e Initial load
duke
parents:
diff changeset
2762 JVMWrapper2("JVM_Sync (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2763 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
2764 return os::fsync(fd);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2765 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2766
a61af66fc99e Initial load
duke
parents:
diff changeset
2767
a61af66fc99e Initial load
duke
parents:
diff changeset
2768 // Printing support //////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2769 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
2770
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17889
diff changeset
2771 ATTRIBUTE_PRINTF(3, 0)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2773 // see bug 4399518, 4417214
a61af66fc99e Initial load
duke
parents:
diff changeset
2774 if ((intptr_t)count <= 0) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2775 return vsnprintf(str, count, fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2777
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17889
diff changeset
2778 ATTRIBUTE_PRINTF(3, 0)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2779 int jio_snprintf(char *str, size_t count, const char *fmt, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2780 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 int len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2782 va_start(args, fmt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 len = jio_vsnprintf(str, count, fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2785 return len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2786 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2787
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17889
diff changeset
2788 ATTRIBUTE_PRINTF(2,3)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2789 int jio_fprintf(FILE* f, const char *fmt, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 int len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 va_start(args, fmt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2793 len = jio_vfprintf(f, fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2794 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 return len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2797
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17889
diff changeset
2798 ATTRIBUTE_PRINTF(2, 0)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 int jio_vfprintf(FILE* f, const char *fmt, va_list args) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 if (Arguments::vfprintf_hook() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2801 return Arguments::vfprintf_hook()(f, fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 return vfprintf(f, fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2806
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17889
diff changeset
2807 ATTRIBUTE_PRINTF(1, 2)
2191
d70fe6ab4436 6588413: Use -fvisibility=hidden for gcc compiles
coleenp
parents: 2177
diff changeset
2808 JNIEXPORT int jio_printf(const char *fmt, ...) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 int len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 va_start(args, fmt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 len = jio_vfprintf(defaultStream::output_stream(), fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 return len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2815 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2816
a61af66fc99e Initial load
duke
parents:
diff changeset
2817
a61af66fc99e Initial load
duke
parents:
diff changeset
2818 // HotSpot specific jio method
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 void jio_print(const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 // Try to make this function as atomic as possible.
a61af66fc99e Initial load
duke
parents:
diff changeset
2821 if (Arguments::vfprintf_hook() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 jio_fprintf(defaultStream::output_stream(), "%s", s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2823 } else {
513
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 431
diff changeset
2824 // Make an unused local variable to avoid warning from gcc 4.x compiler.
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 431
diff changeset
2825 size_t count = ::write(defaultStream::output_fd(), s, (int)strlen(s));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2828
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 } // Extern C
a61af66fc99e Initial load
duke
parents:
diff changeset
2830
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 // java.lang.Thread //////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2832
a61af66fc99e Initial load
duke
parents:
diff changeset
2833 // In most of the JVM Thread support functions we need to be sure to lock the Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 // to prevent the target thread from exiting after we have a pointer to the C++ Thread or
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 // OSThread objects. The exception to this rule is when the target object is the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2836 // doing the operation, in which case we know that the thread won't exit until the
a61af66fc99e Initial load
duke
parents:
diff changeset
2837 // operation is done (all exits being voluntary). There are a few cases where it is
a61af66fc99e Initial load
duke
parents:
diff changeset
2838 // rather silly to do operations on yourself, like resuming yourself or asking whether
a61af66fc99e Initial load
duke
parents:
diff changeset
2839 // you are alive. While these can still happen, they are not subject to deadlocks if
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 // the lock is held while the operation occurs (this is not the case for suspend, for
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 // instance), and are very unlikely. Because IsAlive needs to be fast and its
a61af66fc99e Initial load
duke
parents:
diff changeset
2842 // implementation is local to this file, we always lock Threads_lock for that one.
a61af66fc99e Initial load
duke
parents:
diff changeset
2843
a61af66fc99e Initial load
duke
parents:
diff changeset
2844 static void thread_entry(JavaThread* thread, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 HandleMark hm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2846 Handle obj(THREAD, thread->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
2847 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2848 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
2849 obj,
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
2850 KlassHandle(THREAD, SystemDictionary::Thread_klass()),
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2851 vmSymbols::run_method_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
2852 vmSymbols::void_method_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2853 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2854 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2855
a61af66fc99e Initial load
duke
parents:
diff changeset
2856
a61af66fc99e Initial load
duke
parents:
diff changeset
2857 JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
2858 JVMWrapper("JVM_StartThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2859 JavaThread *native_thread = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2860
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 // We cannot hold the Threads_lock when we throw an exception,
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 // due to rank ordering issues. Example: we might need to grab the
a61af66fc99e Initial load
duke
parents:
diff changeset
2863 // Heap_lock while we construct the exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 bool throw_illegal_thread_state = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2865
a61af66fc99e Initial load
duke
parents:
diff changeset
2866 // We must release the Threads_lock before we can post a jvmti event
a61af66fc99e Initial load
duke
parents:
diff changeset
2867 // in Thread::start.
a61af66fc99e Initial load
duke
parents:
diff changeset
2868 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2869 // Ensure that the C++ Thread and OSThread structures aren't freed before
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 // we operate.
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2872
2162
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2873 // Since JDK 5 the java.lang.Thread threadStatus is used to prevent
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2874 // re-starting an already started thread, so we should usually find
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2875 // that the JavaThread is null. However for a JNI attached thread
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2876 // there is a small window between the Thread object being created
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2877 // (with its JavaThread set) and the update to its threadStatus, so we
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2878 // have to check for this
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2879 if (java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread)) != NULL) {
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2880 throw_illegal_thread_state = true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 } else {
2162
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2882 // We could also check the stillborn flag to see if this thread was already stopped, but
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2883 // for historical reasons we let the thread detect that itself when it starts running
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2884
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 jlong size =
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 java_lang_Thread::stackSize(JNIHandles::resolve_non_null(jthread));
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 // Allocate the C++ Thread structure and create the native thread. The
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 // stack size retrieved from java is signed, but the constructor takes
a61af66fc99e Initial load
duke
parents:
diff changeset
2889 // size_t (an unsigned type), so avoid passing negative values which would
a61af66fc99e Initial load
duke
parents:
diff changeset
2890 // result in really large stacks.
a61af66fc99e Initial load
duke
parents:
diff changeset
2891 size_t sz = size > 0 ? (size_t) size : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2892 native_thread = new JavaThread(&thread_entry, sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
2893
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 // At this point it may be possible that no osthread was created for the
a61af66fc99e Initial load
duke
parents:
diff changeset
2895 // JavaThread due to lack of memory. Check for this situation and throw
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 // an exception if necessary. Eventually we may want to change this so
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 // that we only grab the lock if the thread was created successfully -
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 // then we can also do this check and throw the exception in the
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 // JavaThread constructor.
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 if (native_thread->osthread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2901 // Note: the current thread is not being used within "prepare".
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 native_thread->prepare(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2905 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2906
a61af66fc99e Initial load
duke
parents:
diff changeset
2907 if (throw_illegal_thread_state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 THROW(vmSymbols::java_lang_IllegalThreadStateException());
a61af66fc99e Initial load
duke
parents:
diff changeset
2909 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2910
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 assert(native_thread != NULL, "Starting null thread?");
a61af66fc99e Initial load
duke
parents:
diff changeset
2912
a61af66fc99e Initial load
duke
parents:
diff changeset
2913 if (native_thread->osthread() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2914 // No one should hold a reference to the 'native_thread'.
a61af66fc99e Initial load
duke
parents:
diff changeset
2915 delete native_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
2916 if (JvmtiExport::should_post_resource_exhausted()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2917 JvmtiExport::post_resource_exhausted(
a61af66fc99e Initial load
duke
parents:
diff changeset
2918 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_THREADS,
a61af66fc99e Initial load
duke
parents:
diff changeset
2919 "unable to create new native thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2920 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2921 THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 "unable to create new native thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2924
a61af66fc99e Initial load
duke
parents:
diff changeset
2925 Thread::start(native_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2926
a61af66fc99e Initial load
duke
parents:
diff changeset
2927 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2928
a61af66fc99e Initial load
duke
parents:
diff changeset
2929 // JVM_Stop is implemented using a VM_Operation, so threads are forced to safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
2930 // before the quasi-asynchronous exception is delivered. This is a little obtrusive,
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 // but is thought to be reliable and simple. In the case, where the receiver is the
2162
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2932 // same thread as the sender, no safepoint is needed.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 JVM_ENTRY(void, JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable))
a61af66fc99e Initial load
duke
parents:
diff changeset
2934 JVMWrapper("JVM_StopThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2935
a61af66fc99e Initial load
duke
parents:
diff changeset
2936 oop java_throwable = JNIHandles::resolve(throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
2937 if (java_throwable == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2938 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
2939 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2940 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2941 JavaThread* receiver = java_lang_Thread::thread(java_thread);
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4717
diff changeset
2942 Events::log_exception(JavaThread::current(),
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4717
diff changeset
2943 "JVM_StopThread thread JavaThread " INTPTR_FORMAT " as oop " INTPTR_FORMAT " [exception " INTPTR_FORMAT "]",
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17889
diff changeset
2944 p2i(receiver), p2i((address)java_thread), p2i(throwable));
2162
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2945 // First check if thread is alive
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2946 if (receiver != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2947 // Check if exception is getting thrown at self (use oop equality, since the
a61af66fc99e Initial load
duke
parents:
diff changeset
2948 // target object might exit)
a61af66fc99e Initial load
duke
parents:
diff changeset
2949 if (java_thread == thread->threadObj()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2950 THROW_OOP(java_throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
2951 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 // Enques a VM_Operation to stop all threads and then deliver the exception...
a61af66fc99e Initial load
duke
parents:
diff changeset
2953 Thread::send_async_exception(java_thread, JNIHandles::resolve(throwable));
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2955 }
2162
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2956 else {
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2957 // Either:
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2958 // - target thread has not been started before being stopped, or
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2959 // - target thread already terminated
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2960 // We could read the threadStatus to determine which case it is
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2961 // but that is overkill as it doesn't matter. We must set the
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2962 // stillborn flag for the first case, and if the thread has already
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2963 // exited setting this flag has no affect
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2964 java_lang_Thread::set_stillborn(java_thread);
ccfcb502af3f 6566340: Restore use of stillborn flag to signify a thread that was stopped before it started
dholmes
parents: 1980
diff changeset
2965 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2967
a61af66fc99e Initial load
duke
parents:
diff changeset
2968
a61af66fc99e Initial load
duke
parents:
diff changeset
2969 JVM_ENTRY(jboolean, JVM_IsThreadAlive(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
2970 JVMWrapper("JVM_IsThreadAlive");
a61af66fc99e Initial load
duke
parents:
diff changeset
2971
a61af66fc99e Initial load
duke
parents:
diff changeset
2972 oop thread_oop = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2973 return java_lang_Thread::is_alive(thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2974 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2975
a61af66fc99e Initial load
duke
parents:
diff changeset
2976
a61af66fc99e Initial load
duke
parents:
diff changeset
2977 JVM_ENTRY(void, JVM_SuspendThread(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
2978 JVMWrapper("JVM_SuspendThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2979 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2980 JavaThread* receiver = java_lang_Thread::thread(java_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2981
a61af66fc99e Initial load
duke
parents:
diff changeset
2982 if (receiver != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2983 // thread has run and has not exited (still on threads list)
a61af66fc99e Initial load
duke
parents:
diff changeset
2984
a61af66fc99e Initial load
duke
parents:
diff changeset
2985 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2986 MutexLockerEx ml(receiver->SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 if (receiver->is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2988 // Don't allow nested external suspend requests. We can't return
a61af66fc99e Initial load
duke
parents:
diff changeset
2989 // an error from this interface so just ignore the problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2991 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2992 if (receiver->is_exiting()) { // thread is in the process of exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2994 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2995 receiver->set_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
2996 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2997
a61af66fc99e Initial load
duke
parents:
diff changeset
2998 // java_suspend() will catch threads in the process of exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
2999 // and will ignore them.
a61af66fc99e Initial load
duke
parents:
diff changeset
3000 receiver->java_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
3001
a61af66fc99e Initial load
duke
parents:
diff changeset
3002 // It would be nice to have the following assertion in all the
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 // time, but it is possible for a racing resume request to have
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 // resumed this thread right after we suspended it. Temporarily
a61af66fc99e Initial load
duke
parents:
diff changeset
3005 // enable this assertion if you are chasing a different kind of
a61af66fc99e Initial load
duke
parents:
diff changeset
3006 // bug.
a61af66fc99e Initial load
duke
parents:
diff changeset
3007 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3008 // assert(java_lang_Thread::thread(receiver->threadObj()) == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3009 // receiver->is_being_ext_suspended(), "thread is not suspended");
a61af66fc99e Initial load
duke
parents:
diff changeset
3010 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3011 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3012
a61af66fc99e Initial load
duke
parents:
diff changeset
3013
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 JVM_ENTRY(void, JVM_ResumeThread(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
3015 JVMWrapper("JVM_ResumeThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate.
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 // We need to *always* get the threads lock here, since this operation cannot be allowed during
a61af66fc99e Initial load
duke
parents:
diff changeset
3018 // a safepoint. The safepoint code relies on suspending a thread to examine its state. If other
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 // threads randomly resumes threads, then a thread might not be suspended when the safepoint code
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 // looks at it.
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 MutexLocker ml(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3022 JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
a61af66fc99e Initial load
duke
parents:
diff changeset
3023 if (thr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3024 // the thread has run and is not in the process of exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 thr->java_resume();
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3027 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3028
a61af66fc99e Initial load
duke
parents:
diff changeset
3029
a61af66fc99e Initial load
duke
parents:
diff changeset
3030 JVM_ENTRY(void, JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio))
a61af66fc99e Initial load
duke
parents:
diff changeset
3031 JVMWrapper("JVM_SetThreadPriority");
a61af66fc99e Initial load
duke
parents:
diff changeset
3032 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
a61af66fc99e Initial load
duke
parents:
diff changeset
3033 MutexLocker ml(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3034 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 java_lang_Thread::set_priority(java_thread, (ThreadPriority)prio);
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 JavaThread* thr = java_lang_Thread::thread(java_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 if (thr != NULL) { // Thread not yet started; priority pushed down when it is
a61af66fc99e Initial load
duke
parents:
diff changeset
3038 Thread::set_priority(thr, (ThreadPriority)prio);
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3040 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3041
a61af66fc99e Initial load
duke
parents:
diff changeset
3042
a61af66fc99e Initial load
duke
parents:
diff changeset
3043 JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
3044 JVMWrapper("JVM_Yield");
a61af66fc99e Initial load
duke
parents:
diff changeset
3045 if (os::dont_yield()) return;
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3046 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1144
diff changeset
3047 HS_DTRACE_PROBE0(hotspot, thread__yield);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3048 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3049 HOTSPOT_THREAD_YIELD();
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3050 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3051 // When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
a61af66fc99e Initial load
duke
parents:
diff changeset
3052 // Critical for similar threading behaviour
a61af66fc99e Initial load
duke
parents:
diff changeset
3053 if (ConvertYieldToSleep) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3054 os::sleep(thread, MinSleepInterval, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
3055 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3056 os::yield();
a61af66fc99e Initial load
duke
parents:
diff changeset
3057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3058 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3059
a61af66fc99e Initial load
duke
parents:
diff changeset
3060
a61af66fc99e Initial load
duke
parents:
diff changeset
3061 JVM_ENTRY(void, JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis))
a61af66fc99e Initial load
duke
parents:
diff changeset
3062 JVMWrapper("JVM_Sleep");
a61af66fc99e Initial load
duke
parents:
diff changeset
3063
a61af66fc99e Initial load
duke
parents:
diff changeset
3064 if (millis < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3065 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
a61af66fc99e Initial load
duke
parents:
diff changeset
3066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3067
a61af66fc99e Initial load
duke
parents:
diff changeset
3068 if (Thread::is_interrupted (THREAD, true) && !HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
a61af66fc99e Initial load
duke
parents:
diff changeset
3070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3071
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 // Save current thread state and restore it at the end of this block.
a61af66fc99e Initial load
duke
parents:
diff changeset
3073 // And set new thread state to SLEEPING.
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 JavaThreadSleepState jtss(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3075
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3076 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1144
diff changeset
3077 HS_DTRACE_PROBE1(hotspot, thread__sleep__begin, millis);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3078 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3079 HOTSPOT_THREAD_SLEEP_BEGIN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3080 millis);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3081 #endif /* USDT2 */
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1144
diff changeset
3082
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
3083 EventThreadSleep event;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
3084
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3085 if (millis == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3086 // When ConvertSleepToYield is on, this matches the classic VM implementation of
a61af66fc99e Initial load
duke
parents:
diff changeset
3087 // JVM_Sleep. Critical for similar threading behaviour (Win32)
a61af66fc99e Initial load
duke
parents:
diff changeset
3088 // It appears that in certain GUI contexts, it may be beneficial to do a short sleep
a61af66fc99e Initial load
duke
parents:
diff changeset
3089 // for SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
3090 if (ConvertSleepToYield) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3091 os::yield();
a61af66fc99e Initial load
duke
parents:
diff changeset
3092 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3093 ThreadState old_state = thread->osthread()->get_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
3094 thread->osthread()->set_state(SLEEPING);
a61af66fc99e Initial load
duke
parents:
diff changeset
3095 os::sleep(thread, MinSleepInterval, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 thread->osthread()->set_state(old_state);
a61af66fc99e Initial load
duke
parents:
diff changeset
3097 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3098 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3099 ThreadState old_state = thread->osthread()->get_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
3100 thread->osthread()->set_state(SLEEPING);
a61af66fc99e Initial load
duke
parents:
diff changeset
3101 if (os::sleep(thread, millis, true) == OS_INTRPT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3102 // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
a61af66fc99e Initial load
duke
parents:
diff changeset
3103 // us while we were sleeping. We do not overwrite those.
a61af66fc99e Initial load
duke
parents:
diff changeset
3104 if (!HAS_PENDING_EXCEPTION) {
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
3105 if (event.should_commit()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
3106 event.set_time(millis);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
3107 event.commit();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
3108 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3109 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1144
diff changeset
3110 HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3111 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3112 HOTSPOT_THREAD_SLEEP_END(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3113 1);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3114 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3115 // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
a61af66fc99e Initial load
duke
parents:
diff changeset
3116 // to properly restore the thread state. That's likely wrong.
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
a61af66fc99e Initial load
duke
parents:
diff changeset
3118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 thread->osthread()->set_state(old_state);
a61af66fc99e Initial load
duke
parents:
diff changeset
3121 }
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
3122 if (event.should_commit()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
3123 event.set_time(millis);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
3124 event.commit();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10343
diff changeset
3125 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3126 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 1144
diff changeset
3127 HS_DTRACE_PROBE1(hotspot, thread__sleep__end,0);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3128 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3129 HOTSPOT_THREAD_SLEEP_END(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3130 0);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3131 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3132 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3133
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
3135 JVMWrapper("JVM_CurrentThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
3136 oop jthread = thread->threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
3137 assert (thread != NULL, "no current thread!");
a61af66fc99e Initial load
duke
parents:
diff changeset
3138 return JNIHandles::make_local(env, jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3139 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3140
a61af66fc99e Initial load
duke
parents:
diff changeset
3141
a61af66fc99e Initial load
duke
parents:
diff changeset
3142 JVM_ENTRY(jint, JVM_CountStackFrames(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
3143 JVMWrapper("JVM_CountStackFrames");
a61af66fc99e Initial load
duke
parents:
diff changeset
3144
a61af66fc99e Initial load
duke
parents:
diff changeset
3145 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
a61af66fc99e Initial load
duke
parents:
diff changeset
3146 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3147 bool throw_illegal_thread_state = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3148 int count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3149
a61af66fc99e Initial load
duke
parents:
diff changeset
3150 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3151 MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3152 // We need to re-resolve the java_thread, since a GC might have happened during the
a61af66fc99e Initial load
duke
parents:
diff changeset
3153 // acquire of the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3154 JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
a61af66fc99e Initial load
duke
parents:
diff changeset
3155
a61af66fc99e Initial load
duke
parents:
diff changeset
3156 if (thr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3157 // do nothing
a61af66fc99e Initial load
duke
parents:
diff changeset
3158 } else if(! thr->is_external_suspend() || ! thr->frame_anchor()->walkable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3159 // Check whether this java thread has been suspended already. If not, throws
a61af66fc99e Initial load
duke
parents:
diff changeset
3160 // IllegalThreadStateException. We defer to throw that exception until
a61af66fc99e Initial load
duke
parents:
diff changeset
3161 // Threads_lock is released since loading exception class has to leave VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
3162 // The correct way to test a thread is actually suspended is
a61af66fc99e Initial load
duke
parents:
diff changeset
3163 // wait_for_ext_suspend_completion(), but we can't call that while holding
a61af66fc99e Initial load
duke
parents:
diff changeset
3164 // the Threads_lock. The above tests are sufficient for our purposes
a61af66fc99e Initial load
duke
parents:
diff changeset
3165 // provided the walkability of the stack is stable - which it isn't
a61af66fc99e Initial load
duke
parents:
diff changeset
3166 // 100% but close enough for most practical purposes.
a61af66fc99e Initial load
duke
parents:
diff changeset
3167 throw_illegal_thread_state = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3168 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3169 // Count all java activation, i.e., number of vframes
a61af66fc99e Initial load
duke
parents:
diff changeset
3170 for(vframeStream vfst(thr); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3171 // Native frames are not counted
a61af66fc99e Initial load
duke
parents:
diff changeset
3172 if (!vfst.method()->is_native()) count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3176
a61af66fc99e Initial load
duke
parents:
diff changeset
3177 if (throw_illegal_thread_state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3178 THROW_MSG_0(vmSymbols::java_lang_IllegalThreadStateException(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3179 "this thread is not suspended");
a61af66fc99e Initial load
duke
parents:
diff changeset
3180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3181 return count;
a61af66fc99e Initial load
duke
parents:
diff changeset
3182 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3183
a61af66fc99e Initial load
duke
parents:
diff changeset
3184 // Consider: A better way to implement JVM_Interrupt() is to acquire
a61af66fc99e Initial load
duke
parents:
diff changeset
3185 // Threads_lock to resolve the jthread into a Thread pointer, fetch
a61af66fc99e Initial load
duke
parents:
diff changeset
3186 // Thread->platformevent, Thread->native_thr, Thread->parker, etc.,
a61af66fc99e Initial load
duke
parents:
diff changeset
3187 // drop Threads_lock, and the perform the unpark() and thr_kill() operations
a61af66fc99e Initial load
duke
parents:
diff changeset
3188 // outside the critical section. Threads_lock is hot so we want to minimize
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 // the hold-time. A cleaner interface would be to decompose interrupt into
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 // two steps. The 1st phase, performed under Threads_lock, would return
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 // a closure that'd be invoked after Threads_lock was dropped.
a61af66fc99e Initial load
duke
parents:
diff changeset
3192 // This tactic is safe as PlatformEvent and Parkers are type-stable (TSM) and
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 // admit spurious wakeups.
a61af66fc99e Initial load
duke
parents:
diff changeset
3194
a61af66fc99e Initial load
duke
parents:
diff changeset
3195 JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
3196 JVMWrapper("JVM_Interrupt");
a61af66fc99e Initial load
duke
parents:
diff changeset
3197
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3200 MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 // We need to re-resolve the java_thread, since a GC might have happened during the
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 // acquire of the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
a61af66fc99e Initial load
duke
parents:
diff changeset
3204 if (thr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 Thread::interrupt(thr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3207 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3208
a61af66fc99e Initial load
duke
parents:
diff changeset
3209
a61af66fc99e Initial load
duke
parents:
diff changeset
3210 JVM_QUICK_ENTRY(jboolean, JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted))
a61af66fc99e Initial load
duke
parents:
diff changeset
3211 JVMWrapper("JVM_IsInterrupted");
a61af66fc99e Initial load
duke
parents:
diff changeset
3212
a61af66fc99e Initial load
duke
parents:
diff changeset
3213 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
a61af66fc99e Initial load
duke
parents:
diff changeset
3214 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3215 MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3216 // We need to re-resolve the java_thread, since a GC might have happened during the
a61af66fc99e Initial load
duke
parents:
diff changeset
3217 // acquire of the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3218 JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
a61af66fc99e Initial load
duke
parents:
diff changeset
3219 if (thr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3220 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3221 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3222 return (jboolean) Thread::is_interrupted(thr, clear_interrupted != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3224 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3225
a61af66fc99e Initial load
duke
parents:
diff changeset
3226
a61af66fc99e Initial load
duke
parents:
diff changeset
3227 // Return true iff the current thread has locked the object passed in
a61af66fc99e Initial load
duke
parents:
diff changeset
3228
a61af66fc99e Initial load
duke
parents:
diff changeset
3229 JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
3230 JVMWrapper("JVM_HoldsLock");
a61af66fc99e Initial load
duke
parents:
diff changeset
3231 assert(THREAD->is_Java_thread(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
3232 if (obj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3233 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
a61af66fc99e Initial load
duke
parents:
diff changeset
3234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3235 Handle h_obj(THREAD, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
3236 return ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD, h_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
3237 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3238
a61af66fc99e Initial load
duke
parents:
diff changeset
3239
a61af66fc99e Initial load
duke
parents:
diff changeset
3240 JVM_ENTRY(void, JVM_DumpAllStacks(JNIEnv* env, jclass))
a61af66fc99e Initial load
duke
parents:
diff changeset
3241 JVMWrapper("JVM_DumpAllStacks");
a61af66fc99e Initial load
duke
parents:
diff changeset
3242 VM_PrintThreads op;
a61af66fc99e Initial load
duke
parents:
diff changeset
3243 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
3244 if (JvmtiExport::should_post_data_dump()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 JvmtiExport::post_data_dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
3246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3247 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3248
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3249 JVM_ENTRY(void, JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3250 JVMWrapper("JVM_SetNativeThreadName");
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3251 ResourceMark rm(THREAD);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3252 oop java_thread = JNIHandles::resolve_non_null(jthread);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3253 JavaThread* thr = java_lang_Thread::thread(java_thread);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3254 // Thread naming only supported for the current thread, doesn't work for
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3255 // target threads.
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3256 if (Thread::current() == thr && !thr->has_attached_via_jni()) {
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3257 // we don't set the name of an attached thread to avoid stepping
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3258 // on other programs
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3259 const char *thread_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3260 os::set_native_thread_name(thread_name);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3261 }
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3262 JVM_END
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3263
a61af66fc99e Initial load
duke
parents:
diff changeset
3264 // java.lang.SecurityManager ///////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3265
a61af66fc99e Initial load
duke
parents:
diff changeset
3266 static bool is_trusted_frame(JavaThread* jthread, vframeStream* vfst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3267 assert(jthread->is_Java_thread(), "must be a Java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
3268 if (jthread->privileged_stack_top() == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3269 if (jthread->privileged_stack_top()->frame_id() == vfst->frame_id()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3270 oop loader = jthread->privileged_stack_top()->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 if (loader == NULL) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 bool trusted = java_lang_ClassLoader::is_trusted_loader(loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
3273 if (trusted) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3275 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3277
a61af66fc99e Initial load
duke
parents:
diff changeset
3278 JVM_ENTRY(jclass, JVM_CurrentLoadedClass(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
3279 JVMWrapper("JVM_CurrentLoadedClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
3280 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3281
a61af66fc99e Initial load
duke
parents:
diff changeset
3282 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3283 // if a method in a class in a trusted loader is in a doPrivileged, return NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3284 bool trusted = is_trusted_frame(thread, &vfst);
a61af66fc99e Initial load
duke
parents:
diff changeset
3285 if (trusted) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3286
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3287 Method* m = vfst.method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3288 if (!m->is_native()) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3289 InstanceKlass* holder = m->method_holder();
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3290 oop loader = holder->class_loader();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3291 if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3292 return (jclass) JNIHandles::make_local(env, holder->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3297 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3298
a61af66fc99e Initial load
duke
parents:
diff changeset
3299
a61af66fc99e Initial load
duke
parents:
diff changeset
3300 JVM_ENTRY(jobject, JVM_CurrentClassLoader(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
3301 JVMWrapper("JVM_CurrentClassLoader");
a61af66fc99e Initial load
duke
parents:
diff changeset
3302 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3303
a61af66fc99e Initial load
duke
parents:
diff changeset
3304 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3305
a61af66fc99e Initial load
duke
parents:
diff changeset
3306 // if a method in a class in a trusted loader is in a doPrivileged, return NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3307 bool trusted = is_trusted_frame(thread, &vfst);
a61af66fc99e Initial load
duke
parents:
diff changeset
3308 if (trusted) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3309
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3310 Method* m = vfst.method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3311 if (!m->is_native()) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3312 InstanceKlass* holder = m->method_holder();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3313 assert(holder->is_klass(), "just checking");
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3314 oop loader = holder->class_loader();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3315 if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3316 return JNIHandles::make_local(env, loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
3317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3320 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3321 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3322
a61af66fc99e Initial load
duke
parents:
diff changeset
3323
a61af66fc99e Initial load
duke
parents:
diff changeset
3324 JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
3325 JVMWrapper("JVM_GetClassContext");
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3327 JvmtiVMObjectAllocEventCollector oam;
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3328 vframeStream vfst(thread);
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3329
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3330 if (SystemDictionary::reflect_CallerSensitive_klass() != NULL) {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3331 // This must only be called from SecurityManager.getClassContext
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3332 Method* m = vfst.method();
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3333 if (!(m->method_holder() == SystemDictionary::SecurityManager_klass() &&
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3334 m->name() == vmSymbols::getClassContext_name() &&
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3335 m->signature() == vmSymbols::void_class_array_signature())) {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3336 THROW_MSG_NULL(vmSymbols::java_lang_InternalError(), "JVM_GetClassContext must only be called from SecurityManager.getClassContext");
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3337 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3338 }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3339
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3340 // Collect method holders
11001
c52abc8a0b08 8010124: JVM_GetClassContext: use GrowableArray instead of KlassLink
drchase
parents: 10343
diff changeset
3341 GrowableArray<KlassHandle>* klass_array = new GrowableArray<KlassHandle>();
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3342 for (; !vfst.at_end(); vfst.security_next()) {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3343 Method* m = vfst.method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3344 // Native frames are not returned
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3345 if (!m->is_ignored_by_security_stack_walk() && !m->is_native()) {
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8031
diff changeset
3346 Klass* holder = m->method_holder();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 assert(holder->is_klass(), "just checking");
11001
c52abc8a0b08 8010124: JVM_GetClassContext: use GrowableArray instead of KlassLink
drchase
parents: 10343
diff changeset
3348 klass_array->append(holder);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3351
a61af66fc99e Initial load
duke
parents:
diff changeset
3352 // Create result array of type [Ljava/lang/Class;
11001
c52abc8a0b08 8010124: JVM_GetClassContext: use GrowableArray instead of KlassLink
drchase
parents: 10343
diff changeset
3353 objArrayOop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), klass_array->length(), CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3354 // Fill in mirrors corresponding to method holders
11001
c52abc8a0b08 8010124: JVM_GetClassContext: use GrowableArray instead of KlassLink
drchase
parents: 10343
diff changeset
3355 for (int i = 0; i < klass_array->length(); i++) {
c52abc8a0b08 8010124: JVM_GetClassContext: use GrowableArray instead of KlassLink
drchase
parents: 10343
diff changeset
3356 result->obj_at_put(i, klass_array->at(i)->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3358
a61af66fc99e Initial load
duke
parents:
diff changeset
3359 return (jobjectArray) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3361
a61af66fc99e Initial load
duke
parents:
diff changeset
3362
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 JVM_ENTRY(jint, JVM_ClassDepth(JNIEnv *env, jstring name))
a61af66fc99e Initial load
duke
parents:
diff changeset
3364 JVMWrapper("JVM_ClassDepth");
a61af66fc99e Initial load
duke
parents:
diff changeset
3365 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3366 Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
3367 Handle class_name_str = java_lang_String::internalize_classname(h_name, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3368
a61af66fc99e Initial load
duke
parents:
diff changeset
3369 const char* str = java_lang_String::as_utf8_string(class_name_str());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
3370 TempNewSymbol class_name_sym = SymbolTable::probe(str, (int)strlen(str));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
3371 if (class_name_sym == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3372 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3374
a61af66fc99e Initial load
duke
parents:
diff changeset
3375 int depth = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3376
a61af66fc99e Initial load
duke
parents:
diff changeset
3377 for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3378 if (!vfst.method()->is_native()) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3379 InstanceKlass* holder = vfst.method()->method_holder();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 assert(holder->is_klass(), "just checking");
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3381 if (holder->name() == class_name_sym) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3382 return depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
3383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3384 depth++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3387 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3388 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3389
a61af66fc99e Initial load
duke
parents:
diff changeset
3390
a61af66fc99e Initial load
duke
parents:
diff changeset
3391 JVM_ENTRY(jint, JVM_ClassLoaderDepth(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
3392 JVMWrapper("JVM_ClassLoaderDepth");
a61af66fc99e Initial load
duke
parents:
diff changeset
3393 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3394 int depth = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3395 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3396 // if a method in a class in a trusted loader is in a doPrivileged, return -1
a61af66fc99e Initial load
duke
parents:
diff changeset
3397 bool trusted = is_trusted_frame(thread, &vfst);
a61af66fc99e Initial load
duke
parents:
diff changeset
3398 if (trusted) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3399
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3400 Method* m = vfst.method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3401 if (!m->is_native()) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3402 InstanceKlass* holder = m->method_holder();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 assert(holder->is_klass(), "just checking");
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3404 oop loader = holder->class_loader();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3405 if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3406 return depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
3407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3408 depth++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3411 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3412 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3413
a61af66fc99e Initial load
duke
parents:
diff changeset
3414
a61af66fc99e Initial load
duke
parents:
diff changeset
3415 // java.lang.Package ////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3416
a61af66fc99e Initial load
duke
parents:
diff changeset
3417
a61af66fc99e Initial load
duke
parents:
diff changeset
3418 JVM_ENTRY(jstring, JVM_GetSystemPackage(JNIEnv *env, jstring name))
a61af66fc99e Initial load
duke
parents:
diff changeset
3419 JVMWrapper("JVM_GetSystemPackage");
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3422 char* str = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
3423 oop result = ClassLoader::get_system_package(str, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3424 return (jstring) JNIHandles::make_local(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3425 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3426
a61af66fc99e Initial load
duke
parents:
diff changeset
3427
a61af66fc99e Initial load
duke
parents:
diff changeset
3428 JVM_ENTRY(jobjectArray, JVM_GetSystemPackages(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
3429 JVMWrapper("JVM_GetSystemPackages");
a61af66fc99e Initial load
duke
parents:
diff changeset
3430 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3431 objArrayOop result = ClassLoader::get_system_packages(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3432 return (jobjectArray) JNIHandles::make_local(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3433 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3434
a61af66fc99e Initial load
duke
parents:
diff changeset
3435
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 // ObjectInputStream ///////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3437
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3438 bool force_verify_field_access(Klass* current_class, Klass* field_class, AccessFlags access, bool classloader_only) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3439 if (current_class == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3440 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3442 if ((current_class == field_class) || access.is_public()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3443 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3445
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 if (access.is_protected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3447 // See if current_class is a subclass of field_class
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
3448 if (current_class->is_subclass_of(field_class)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3452
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3453 return (!access.is_private() && InstanceKlass::cast(current_class)->is_same_class_package(field_class));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3455
a61af66fc99e Initial load
duke
parents:
diff changeset
3456
a61af66fc99e Initial load
duke
parents:
diff changeset
3457 // JVM_AllocateNewObject and JVM_AllocateNewArray are unused as of 1.4
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 JVM_ENTRY(jobject, JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
3459 JVMWrapper("JVM_AllocateNewObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
3460 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3461 // Receiver is not used
a61af66fc99e Initial load
duke
parents:
diff changeset
3462 oop curr_mirror = JNIHandles::resolve_non_null(currClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 oop init_mirror = JNIHandles::resolve_non_null(initClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3464
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 // Cannot instantiate primitive types
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 if (java_lang_Class::is_primitive(curr_mirror) || java_lang_Class::is_primitive(init_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3467 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 THROW_0(vmSymbols::java_lang_InvalidClassException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3470
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 // Arrays not allowed here, must use JVM_AllocateNewArray
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
3472 if (java_lang_Class::as_Klass(curr_mirror)->oop_is_array() ||
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
3473 java_lang_Class::as_Klass(init_mirror)->oop_is_array()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3474 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 THROW_0(vmSymbols::java_lang_InvalidClassException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3477
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3478 instanceKlassHandle curr_klass (THREAD, java_lang_Class::as_Klass(curr_mirror));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3479 instanceKlassHandle init_klass (THREAD, java_lang_Class::as_Klass(init_mirror));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3480
a61af66fc99e Initial load
duke
parents:
diff changeset
3481 assert(curr_klass->is_subclass_of(init_klass()), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3482
a61af66fc99e Initial load
duke
parents:
diff changeset
3483 // Interfaces, abstract classes, and java.lang.Class classes cannot be instantiated directly.
a61af66fc99e Initial load
duke
parents:
diff changeset
3484 curr_klass->check_valid_for_instantiation(false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3485
a61af66fc99e Initial load
duke
parents:
diff changeset
3486 // Make sure klass is initialized, since we are about to instantiate one of them.
a61af66fc99e Initial load
duke
parents:
diff changeset
3487 curr_klass->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3488
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 methodHandle m (THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
3490 init_klass->find_method(vmSymbols::object_initializer_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3491 vmSymbols::void_method_signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3492 if (m.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3493 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3494 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
3495 Method::name_and_sig_as_C_string(init_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 vmSymbols::object_initializer_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3497 vmSymbols::void_method_signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3499
a61af66fc99e Initial load
duke
parents:
diff changeset
3500 if (curr_klass == init_klass && !m->is_public()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 // Calling the constructor for class 'curr_klass'.
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 // Only allow calls to a public no-arg constructor.
a61af66fc99e Initial load
duke
parents:
diff changeset
3503 // This path corresponds to creating an Externalizable object.
a61af66fc99e Initial load
duke
parents:
diff changeset
3504 THROW_0(vmSymbols::java_lang_IllegalAccessException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3506
a61af66fc99e Initial load
duke
parents:
diff changeset
3507 if (!force_verify_field_access(curr_klass(), init_klass(), m->access_flags(), false)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3508 // subclass 'curr_klass' does not have access to no-arg constructor of 'initcb'
a61af66fc99e Initial load
duke
parents:
diff changeset
3509 THROW_0(vmSymbols::java_lang_IllegalAccessException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3511
a61af66fc99e Initial load
duke
parents:
diff changeset
3512 Handle obj = curr_klass->allocate_instance_handle(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3513 // Call constructor m. This might call a constructor higher up in the hierachy
a61af66fc99e Initial load
duke
parents:
diff changeset
3514 JavaCalls::call_default_constructor(thread, m, obj, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3515
a61af66fc99e Initial load
duke
parents:
diff changeset
3516 return JNIHandles::make_local(obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
3517 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3518
a61af66fc99e Initial load
duke
parents:
diff changeset
3519
a61af66fc99e Initial load
duke
parents:
diff changeset
3520 JVM_ENTRY(jobject, JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length))
a61af66fc99e Initial load
duke
parents:
diff changeset
3521 JVMWrapper("JVM_AllocateNewArray");
a61af66fc99e Initial load
duke
parents:
diff changeset
3522 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 oop mirror = JNIHandles::resolve_non_null(currClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3524
a61af66fc99e Initial load
duke
parents:
diff changeset
3525 if (java_lang_Class::is_primitive(mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3526 THROW_0(vmSymbols::java_lang_InvalidClassException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3527 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3528 Klass* k = java_lang_Class::as_Klass(mirror);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3529 oop result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3530
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3531 if (k->oop_is_typeArray()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3532 // typeArray
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
3533 result = TypeArrayKlass::cast(k)->allocate(length, CHECK_NULL);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3534 } else if (k->oop_is_objArray()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3535 // objArray
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
3536 ObjArrayKlass* oak = ObjArrayKlass::cast(k);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3537 oak->initialize(CHECK_NULL); // make sure class is initialized (matches Classic VM behavior)
a61af66fc99e Initial load
duke
parents:
diff changeset
3538 result = oak->allocate(length, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3539 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 THROW_0(vmSymbols::java_lang_InvalidClassException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3542 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3544
a61af66fc99e Initial load
duke
parents:
diff changeset
3545
a61af66fc99e Initial load
duke
parents:
diff changeset
3546 // Return the first non-null class loader up the execution stack, or null
a61af66fc99e Initial load
duke
parents:
diff changeset
3547 // if only code from the null class loader is on the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
3548
a61af66fc99e Initial load
duke
parents:
diff changeset
3549 JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
3550 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3551 // UseNewReflection
a61af66fc99e Initial load
duke
parents:
diff changeset
3552 vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3553 oop loader = vfst.method()->method_holder()->class_loader();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3554 if (loader != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3555 return JNIHandles::make_local(env, loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
3556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3558 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3560
a61af66fc99e Initial load
duke
parents:
diff changeset
3561
a61af66fc99e Initial load
duke
parents:
diff changeset
3562 // Load a class relative to the most recent class on the stack with a non-null
a61af66fc99e Initial load
duke
parents:
diff changeset
3563 // classloader.
a61af66fc99e Initial load
duke
parents:
diff changeset
3564 // This function has been deprecated and should not be considered part of the
a61af66fc99e Initial load
duke
parents:
diff changeset
3565 // specified JVM interface.
a61af66fc99e Initial load
duke
parents:
diff changeset
3566
a61af66fc99e Initial load
duke
parents:
diff changeset
3567 JVM_ENTRY(jclass, JVM_LoadClass0(JNIEnv *env, jobject receiver,
a61af66fc99e Initial load
duke
parents:
diff changeset
3568 jclass currClass, jstring currClassName))
a61af66fc99e Initial load
duke
parents:
diff changeset
3569 JVMWrapper("JVM_LoadClass0");
a61af66fc99e Initial load
duke
parents:
diff changeset
3570 // Receiver is not used
a61af66fc99e Initial load
duke
parents:
diff changeset
3571 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3572
a61af66fc99e Initial load
duke
parents:
diff changeset
3573 // Class name argument is not guaranteed to be in internal format
a61af66fc99e Initial load
duke
parents:
diff changeset
3574 Handle classname (THREAD, JNIHandles::resolve_non_null(currClassName));
a61af66fc99e Initial load
duke
parents:
diff changeset
3575 Handle string = java_lang_String::internalize_classname(classname, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3576
a61af66fc99e Initial load
duke
parents:
diff changeset
3577 const char* str = java_lang_String::as_utf8_string(string());
a61af66fc99e Initial load
duke
parents:
diff changeset
3578
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
3579 if (str == NULL || (int)strlen(str) > Symbol::max_length()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3580 // It's impossible to create this class; the name cannot fit
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 // into the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
3582 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), str);
a61af66fc99e Initial load
duke
parents:
diff changeset
3583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3584
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
3585 TempNewSymbol name = SymbolTable::new_symbol(str, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3586 Handle curr_klass (THREAD, JNIHandles::resolve(currClass));
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 // Find the most recent class on the stack with a non-null classloader
a61af66fc99e Initial load
duke
parents:
diff changeset
3588 oop loader = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 oop protection_domain = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3590 if (curr_klass.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 for (vframeStream vfst(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3592 !vfst.at_end() && loader == NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3593 vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3594 if (!vfst.method()->is_native()) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3595 InstanceKlass* holder = vfst.method()->method_holder();
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3596 loader = holder->class_loader();
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6831
diff changeset
3597 protection_domain = holder->protection_domain();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3598 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3601 Klass* curr_klass_oop = java_lang_Class::as_Klass(curr_klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3602 loader = InstanceKlass::cast(curr_klass_oop)->class_loader();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3603 protection_domain = InstanceKlass::cast(curr_klass_oop)->protection_domain();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 Handle h_loader(THREAD, loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 Handle h_prot (THREAD, protection_domain);
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
3607 jclass result = find_class_from_class_loader(env, name, true, h_loader, h_prot,
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
3608 false, thread);
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
3609 if (TraceClassResolution && result != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3610 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
3611 }
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
3612 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3613 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3614
a61af66fc99e Initial load
duke
parents:
diff changeset
3615
a61af66fc99e Initial load
duke
parents:
diff changeset
3616 // Array ///////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3617
a61af66fc99e Initial load
duke
parents:
diff changeset
3618
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 // resolve array handle and check arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
3620 static inline arrayOop check_array(JNIEnv *env, jobject arr, bool type_array_only, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 if (arr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3622 THROW_0(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3623 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3624 oop a = JNIHandles::resolve_non_null(arr);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
3625 if (!a->is_array() || (type_array_only && !a->is_typeArray())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3626 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array");
a61af66fc99e Initial load
duke
parents:
diff changeset
3627 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3628 return arrayOop(a);
a61af66fc99e Initial load
duke
parents:
diff changeset
3629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3630
a61af66fc99e Initial load
duke
parents:
diff changeset
3631
a61af66fc99e Initial load
duke
parents:
diff changeset
3632 JVM_ENTRY(jint, JVM_GetArrayLength(JNIEnv *env, jobject arr))
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 JVMWrapper("JVM_GetArrayLength");
a61af66fc99e Initial load
duke
parents:
diff changeset
3634 arrayOop a = check_array(env, arr, false, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3635 return a->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
3636 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3637
a61af66fc99e Initial load
duke
parents:
diff changeset
3638
a61af66fc99e Initial load
duke
parents:
diff changeset
3639 JVM_ENTRY(jobject, JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
3640 JVMWrapper("JVM_Array_Get");
a61af66fc99e Initial load
duke
parents:
diff changeset
3641 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3642 arrayOop a = check_array(env, arr, false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3643 jvalue value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 BasicType type = Reflection::array_get(&value, a, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3645 oop box = Reflection::box(&value, type, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3646 return JNIHandles::make_local(env, box);
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3648
a61af66fc99e Initial load
duke
parents:
diff changeset
3649
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 JVM_ENTRY(jvalue, JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode))
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 JVMWrapper("JVM_GetPrimitiveArrayElement");
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 jvalue value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 value.i = 0; // to initialize value before getting used in CHECK
a61af66fc99e Initial load
duke
parents:
diff changeset
3654 arrayOop a = check_array(env, arr, true, CHECK_(value));
a61af66fc99e Initial load
duke
parents:
diff changeset
3655 assert(a->is_typeArray(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3656 BasicType type = Reflection::array_get(&value, a, index, CHECK_(value));
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 BasicType wide_type = (BasicType) wCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
3658 if (type != wide_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3659 Reflection::widen(&value, type, wide_type, CHECK_(value));
a61af66fc99e Initial load
duke
parents:
diff changeset
3660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3661 return value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3662 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3663
a61af66fc99e Initial load
duke
parents:
diff changeset
3664
a61af66fc99e Initial load
duke
parents:
diff changeset
3665 JVM_ENTRY(void, JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val))
a61af66fc99e Initial load
duke
parents:
diff changeset
3666 JVMWrapper("JVM_SetArrayElement");
a61af66fc99e Initial load
duke
parents:
diff changeset
3667 arrayOop a = check_array(env, arr, false, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3668 oop box = JNIHandles::resolve(val);
a61af66fc99e Initial load
duke
parents:
diff changeset
3669 jvalue value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3670 value.i = 0; // to initialize value before getting used in CHECK
a61af66fc99e Initial load
duke
parents:
diff changeset
3671 BasicType value_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
3672 if (a->is_objArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3673 // Make sure we do no unbox e.g. java/lang/Integer instances when storing into an object array
a61af66fc99e Initial load
duke
parents:
diff changeset
3674 value_type = Reflection::unbox_for_regular_object(box, &value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3675 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 value_type = Reflection::unbox_for_primitive(box, &value, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3677 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3678 Reflection::array_set(&value, a, index, value_type, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3679 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3680
a61af66fc99e Initial load
duke
parents:
diff changeset
3681
a61af66fc99e Initial load
duke
parents:
diff changeset
3682 JVM_ENTRY(void, JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode))
a61af66fc99e Initial load
duke
parents:
diff changeset
3683 JVMWrapper("JVM_SetPrimitiveArrayElement");
a61af66fc99e Initial load
duke
parents:
diff changeset
3684 arrayOop a = check_array(env, arr, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3685 assert(a->is_typeArray(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3686 BasicType value_type = (BasicType) vCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
3687 Reflection::array_set(&v, a, index, value_type, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3689
a61af66fc99e Initial load
duke
parents:
diff changeset
3690
a61af66fc99e Initial load
duke
parents:
diff changeset
3691 JVM_ENTRY(jobject, JVM_NewArray(JNIEnv *env, jclass eltClass, jint length))
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 JVMWrapper("JVM_NewArray");
a61af66fc99e Initial load
duke
parents:
diff changeset
3693 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3694 oop element_mirror = JNIHandles::resolve(eltClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3695 oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3696 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3697 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3698
a61af66fc99e Initial load
duke
parents:
diff changeset
3699
a61af66fc99e Initial load
duke
parents:
diff changeset
3700 JVM_ENTRY(jobject, JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim))
a61af66fc99e Initial load
duke
parents:
diff changeset
3701 JVMWrapper("JVM_NewMultiArray");
a61af66fc99e Initial load
duke
parents:
diff changeset
3702 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3703 arrayOop dim_array = check_array(env, dim, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3704 oop element_mirror = JNIHandles::resolve(eltClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3705 assert(dim_array->is_typeArray(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3706 oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3707 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3708 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3709
a61af66fc99e Initial load
duke
parents:
diff changeset
3710
a61af66fc99e Initial load
duke
parents:
diff changeset
3711 // Networking library support ////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3712
a61af66fc99e Initial load
duke
parents:
diff changeset
3713 JVM_LEAF(jint, JVM_InitializeSocketLibrary())
a61af66fc99e Initial load
duke
parents:
diff changeset
3714 JVMWrapper("JVM_InitializeSocketLibrary");
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3715 return 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3716 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3717
a61af66fc99e Initial load
duke
parents:
diff changeset
3718
a61af66fc99e Initial load
duke
parents:
diff changeset
3719 JVM_LEAF(jint, JVM_Socket(jint domain, jint type, jint protocol))
a61af66fc99e Initial load
duke
parents:
diff changeset
3720 JVMWrapper("JVM_Socket");
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3721 return os::socket(domain, type, protocol);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3722 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3723
a61af66fc99e Initial load
duke
parents:
diff changeset
3724
a61af66fc99e Initial load
duke
parents:
diff changeset
3725 JVM_LEAF(jint, JVM_SocketClose(jint fd))
a61af66fc99e Initial load
duke
parents:
diff changeset
3726 JVMWrapper2("JVM_SocketClose (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3727 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3728 return os::socket_close(fd);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3729 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3730
a61af66fc99e Initial load
duke
parents:
diff changeset
3731
a61af66fc99e Initial load
duke
parents:
diff changeset
3732 JVM_LEAF(jint, JVM_SocketShutdown(jint fd, jint howto))
a61af66fc99e Initial load
duke
parents:
diff changeset
3733 JVMWrapper2("JVM_SocketShutdown (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3734 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3735 return os::socket_shutdown(fd, howto);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3736 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3737
a61af66fc99e Initial load
duke
parents:
diff changeset
3738
a61af66fc99e Initial load
duke
parents:
diff changeset
3739 JVM_LEAF(jint, JVM_Recv(jint fd, char *buf, jint nBytes, jint flags))
a61af66fc99e Initial load
duke
parents:
diff changeset
3740 JVMWrapper2("JVM_Recv (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3741 //%note jvm_r6
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3742 return os::recv(fd, buf, (size_t)nBytes, (uint)flags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3743 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3744
a61af66fc99e Initial load
duke
parents:
diff changeset
3745
a61af66fc99e Initial load
duke
parents:
diff changeset
3746 JVM_LEAF(jint, JVM_Send(jint fd, char *buf, jint nBytes, jint flags))
a61af66fc99e Initial load
duke
parents:
diff changeset
3747 JVMWrapper2("JVM_Send (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3748 //%note jvm_r6
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3749 return os::send(fd, buf, (size_t)nBytes, (uint)flags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3750 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3751
a61af66fc99e Initial load
duke
parents:
diff changeset
3752
a61af66fc99e Initial load
duke
parents:
diff changeset
3753 JVM_LEAF(jint, JVM_Timeout(int fd, long timeout))
a61af66fc99e Initial load
duke
parents:
diff changeset
3754 JVMWrapper2("JVM_Timeout (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3755 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3756 return os::timeout(fd, timeout);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3757 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3758
a61af66fc99e Initial load
duke
parents:
diff changeset
3759
a61af66fc99e Initial load
duke
parents:
diff changeset
3760 JVM_LEAF(jint, JVM_Listen(jint fd, jint count))
a61af66fc99e Initial load
duke
parents:
diff changeset
3761 JVMWrapper2("JVM_Listen (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3762 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3763 return os::listen(fd, count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3764 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3765
a61af66fc99e Initial load
duke
parents:
diff changeset
3766
a61af66fc99e Initial load
duke
parents:
diff changeset
3767 JVM_LEAF(jint, JVM_Connect(jint fd, struct sockaddr *him, jint len))
a61af66fc99e Initial load
duke
parents:
diff changeset
3768 JVMWrapper2("JVM_Connect (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3769 //%note jvm_r6
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3770 return os::connect(fd, him, (socklen_t)len);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3771 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3772
a61af66fc99e Initial load
duke
parents:
diff changeset
3773
a61af66fc99e Initial load
duke
parents:
diff changeset
3774 JVM_LEAF(jint, JVM_Bind(jint fd, struct sockaddr *him, jint len))
a61af66fc99e Initial load
duke
parents:
diff changeset
3775 JVMWrapper2("JVM_Bind (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3776 //%note jvm_r6
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3777 return os::bind(fd, him, (socklen_t)len);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3778 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3779
a61af66fc99e Initial load
duke
parents:
diff changeset
3780
a61af66fc99e Initial load
duke
parents:
diff changeset
3781 JVM_LEAF(jint, JVM_Accept(jint fd, struct sockaddr *him, jint *len))
a61af66fc99e Initial load
duke
parents:
diff changeset
3782 JVMWrapper2("JVM_Accept (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3783 //%note jvm_r6
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3784 socklen_t socklen = (socklen_t)(*len);
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3785 jint result = os::accept(fd, him, &socklen);
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3786 *len = (jint)socklen;
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3787 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3788 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3789
a61af66fc99e Initial load
duke
parents:
diff changeset
3790
a61af66fc99e Initial load
duke
parents:
diff changeset
3791 JVM_LEAF(jint, JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen))
a61af66fc99e Initial load
duke
parents:
diff changeset
3792 JVMWrapper2("JVM_RecvFrom (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3793 //%note jvm_r6
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3794 socklen_t socklen = (socklen_t)(*fromlen);
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3795 jint result = os::recvfrom(fd, buf, (size_t)nBytes, (uint)flags, from, &socklen);
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3796 *fromlen = (int)socklen;
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3797 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3798 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3799
a61af66fc99e Initial load
duke
parents:
diff changeset
3800
a61af66fc99e Initial load
duke
parents:
diff changeset
3801 JVM_LEAF(jint, JVM_GetSockName(jint fd, struct sockaddr *him, int *len))
a61af66fc99e Initial load
duke
parents:
diff changeset
3802 JVMWrapper2("JVM_GetSockName (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3803 //%note jvm_r6
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3804 socklen_t socklen = (socklen_t)(*len);
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3805 jint result = os::get_sock_name(fd, him, &socklen);
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3806 *len = (int)socklen;
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3807 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3808 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3809
a61af66fc99e Initial load
duke
parents:
diff changeset
3810
a61af66fc99e Initial load
duke
parents:
diff changeset
3811 JVM_LEAF(jint, JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen))
a61af66fc99e Initial load
duke
parents:
diff changeset
3812 JVMWrapper2("JVM_SendTo (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3813 //%note jvm_r6
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3814 return os::sendto(fd, buf, (size_t)len, (uint)flags, to, (socklen_t)tolen);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3815 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3816
a61af66fc99e Initial load
duke
parents:
diff changeset
3817
a61af66fc99e Initial load
duke
parents:
diff changeset
3818 JVM_LEAF(jint, JVM_SocketAvailable(jint fd, jint *pbytes))
a61af66fc99e Initial load
duke
parents:
diff changeset
3819 JVMWrapper2("JVM_SocketAvailable (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3820 //%note jvm_r6
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3821 return os::socket_available(fd, pbytes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3822 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3823
a61af66fc99e Initial load
duke
parents:
diff changeset
3824
a61af66fc99e Initial load
duke
parents:
diff changeset
3825 JVM_LEAF(jint, JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen))
a61af66fc99e Initial load
duke
parents:
diff changeset
3826 JVMWrapper2("JVM_GetSockOpt (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3827 //%note jvm_r6
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3828 socklen_t socklen = (socklen_t)(*optlen);
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3829 jint result = os::get_sock_opt(fd, level, optname, optval, &socklen);
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3830 *optlen = (int)socklen;
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3831 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3832 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3833
a61af66fc99e Initial load
duke
parents:
diff changeset
3834
a61af66fc99e Initial load
duke
parents:
diff changeset
3835 JVM_LEAF(jint, JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen))
a61af66fc99e Initial load
duke
parents:
diff changeset
3836 JVMWrapper2("JVM_GetSockOpt (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3837 //%note jvm_r6
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3838 return os::set_sock_opt(fd, level, optname, optval, (socklen_t)optlen);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3839 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3840
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3841
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3842 JVM_LEAF(int, JVM_GetHostName(char* name, int namelen))
a61af66fc99e Initial load
duke
parents:
diff changeset
3843 JVMWrapper("JVM_GetHostName");
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3844 return os::get_host_name(name, namelen);
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3845 JVM_END
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3846
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3847
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3848 // Library support ///////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3849
a61af66fc99e Initial load
duke
parents:
diff changeset
3850 JVM_ENTRY_NO_ENV(void*, JVM_LoadLibrary(const char* name))
a61af66fc99e Initial load
duke
parents:
diff changeset
3851 //%note jvm_ct
a61af66fc99e Initial load
duke
parents:
diff changeset
3852 JVMWrapper2("JVM_LoadLibrary (%s)", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
3853 char ebuf[1024];
a61af66fc99e Initial load
duke
parents:
diff changeset
3854 void *load_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3855 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3856 ThreadToNativeFromVM ttnfvm(thread);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3857 load_result = os::dll_load(name, ebuf, sizeof ebuf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3858 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3859 if (load_result == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3860 char msg[1024];
a61af66fc99e Initial load
duke
parents:
diff changeset
3861 jio_snprintf(msg, sizeof msg, "%s: %s", name, ebuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3862 // Since 'ebuf' may contain a string encoded using
a61af66fc99e Initial load
duke
parents:
diff changeset
3863 // platform encoding scheme, we need to pass
a61af66fc99e Initial load
duke
parents:
diff changeset
3864 // Exceptions::unsafe_to_utf8 to the new_exception method
a61af66fc99e Initial load
duke
parents:
diff changeset
3865 // as the last argument. See bug 6367357.
a61af66fc99e Initial load
duke
parents:
diff changeset
3866 Handle h_exception =
a61af66fc99e Initial load
duke
parents:
diff changeset
3867 Exceptions::new_exception(thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
3868 vmSymbols::java_lang_UnsatisfiedLinkError(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3869 msg, Exceptions::unsafe_to_utf8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3870
a61af66fc99e Initial load
duke
parents:
diff changeset
3871 THROW_HANDLE_0(h_exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
3872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3873 return load_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3874 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3875
a61af66fc99e Initial load
duke
parents:
diff changeset
3876
a61af66fc99e Initial load
duke
parents:
diff changeset
3877 JVM_LEAF(void, JVM_UnloadLibrary(void* handle))
a61af66fc99e Initial load
duke
parents:
diff changeset
3878 JVMWrapper("JVM_UnloadLibrary");
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3879 os::dll_unload(handle);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3880 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3881
a61af66fc99e Initial load
duke
parents:
diff changeset
3882
a61af66fc99e Initial load
duke
parents:
diff changeset
3883 JVM_LEAF(void*, JVM_FindLibraryEntry(void* handle, const char* name))
a61af66fc99e Initial load
duke
parents:
diff changeset
3884 JVMWrapper2("JVM_FindLibraryEntry (%s)", name);
1980
828eafbd85cc 6348631: remove the use of the HPI library from Hotspot
ikrylov
parents: 1972
diff changeset
3885 return os::dll_lookup(handle, name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3886 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3887
4717
11c26bfcf8c7 7091417: recvfrom's 6th input should be of type socklen_t
phh
parents: 4006
diff changeset
3888
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3889 // Floating point support ////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3890
a61af66fc99e Initial load
duke
parents:
diff changeset
3891 JVM_LEAF(jboolean, JVM_IsNaN(jdouble a))
a61af66fc99e Initial load
duke
parents:
diff changeset
3892 JVMWrapper("JVM_IsNaN");
a61af66fc99e Initial load
duke
parents:
diff changeset
3893 return g_isnan(a);
a61af66fc99e Initial load
duke
parents:
diff changeset
3894 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3895
a61af66fc99e Initial load
duke
parents:
diff changeset
3896
a61af66fc99e Initial load
duke
parents:
diff changeset
3897 // JNI version ///////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3898
a61af66fc99e Initial load
duke
parents:
diff changeset
3899 JVM_LEAF(jboolean, JVM_IsSupportedJNIVersion(jint version))
a61af66fc99e Initial load
duke
parents:
diff changeset
3900 JVMWrapper2("JVM_IsSupportedJNIVersion (%d)", version);
a61af66fc99e Initial load
duke
parents:
diff changeset
3901 return Threads::is_supported_jni_version_including_1_1(version);
a61af66fc99e Initial load
duke
parents:
diff changeset
3902 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3903
a61af66fc99e Initial load
duke
parents:
diff changeset
3904
a61af66fc99e Initial load
duke
parents:
diff changeset
3905 // String support ///////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3906
a61af66fc99e Initial load
duke
parents:
diff changeset
3907 JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
a61af66fc99e Initial load
duke
parents:
diff changeset
3908 JVMWrapper("JVM_InternString");
a61af66fc99e Initial load
duke
parents:
diff changeset
3909 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3910 if (str == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3911 oop string = JNIHandles::resolve_non_null(str);
a61af66fc99e Initial load
duke
parents:
diff changeset
3912 oop result = StringTable::intern(string, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3913 return (jstring) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3914 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3915
a61af66fc99e Initial load
duke
parents:
diff changeset
3916
a61af66fc99e Initial load
duke
parents:
diff changeset
3917 // Raw monitor support //////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3918
a61af66fc99e Initial load
duke
parents:
diff changeset
3919 // The lock routine below calls lock_without_safepoint_check in order to get a raw lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3920 // without interfering with the safepoint mechanism. The routines are not JVM_LEAF because
a61af66fc99e Initial load
duke
parents:
diff changeset
3921 // they might be called by non-java threads. The JVM_LEAF installs a NoHandleMark check
a61af66fc99e Initial load
duke
parents:
diff changeset
3922 // that only works with java threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
3923
a61af66fc99e Initial load
duke
parents:
diff changeset
3924
a61af66fc99e Initial load
duke
parents:
diff changeset
3925 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3926 VM_Exit::block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
3927 JVMWrapper("JVM_RawMonitorCreate");
a61af66fc99e Initial load
duke
parents:
diff changeset
3928 return new Mutex(Mutex::native, "JVM_RawMonitorCreate");
a61af66fc99e Initial load
duke
parents:
diff changeset
3929 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3930
a61af66fc99e Initial load
duke
parents:
diff changeset
3931
a61af66fc99e Initial load
duke
parents:
diff changeset
3932 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3933 VM_Exit::block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
3934 JVMWrapper("JVM_RawMonitorDestroy");
a61af66fc99e Initial load
duke
parents:
diff changeset
3935 delete ((Mutex*) mon);
a61af66fc99e Initial load
duke
parents:
diff changeset
3936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3937
a61af66fc99e Initial load
duke
parents:
diff changeset
3938
a61af66fc99e Initial load
duke
parents:
diff changeset
3939 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3940 VM_Exit::block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
3941 JVMWrapper("JVM_RawMonitorEnter");
a61af66fc99e Initial load
duke
parents:
diff changeset
3942 ((Mutex*) mon)->jvm_raw_lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
3943 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3944 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3945
a61af66fc99e Initial load
duke
parents:
diff changeset
3946
a61af66fc99e Initial load
duke
parents:
diff changeset
3947 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3948 VM_Exit::block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
3949 JVMWrapper("JVM_RawMonitorExit");
a61af66fc99e Initial load
duke
parents:
diff changeset
3950 ((Mutex*) mon)->jvm_raw_unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
3951 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3952
a61af66fc99e Initial load
duke
parents:
diff changeset
3953
a61af66fc99e Initial load
duke
parents:
diff changeset
3954 // Support for Serialization
a61af66fc99e Initial load
duke
parents:
diff changeset
3955
a61af66fc99e Initial load
duke
parents:
diff changeset
3956 typedef jfloat (JNICALL *IntBitsToFloatFn )(JNIEnv* env, jclass cb, jint value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3957 typedef jdouble (JNICALL *LongBitsToDoubleFn)(JNIEnv* env, jclass cb, jlong value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3958 typedef jint (JNICALL *FloatToIntBitsFn )(JNIEnv* env, jclass cb, jfloat value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3959 typedef jlong (JNICALL *DoubleToLongBitsFn)(JNIEnv* env, jclass cb, jdouble value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3960
a61af66fc99e Initial load
duke
parents:
diff changeset
3961 static IntBitsToFloatFn int_bits_to_float_fn = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3962 static LongBitsToDoubleFn long_bits_to_double_fn = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3963 static FloatToIntBitsFn float_to_int_bits_fn = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3964 static DoubleToLongBitsFn double_to_long_bits_fn = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3965
a61af66fc99e Initial load
duke
parents:
diff changeset
3966
a61af66fc99e Initial load
duke
parents:
diff changeset
3967 void initialize_converter_functions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3968 if (JDK_Version::is_gte_jdk14x_version()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3969 // These functions only exist for compatibility with 1.3.1 and earlier
a61af66fc99e Initial load
duke
parents:
diff changeset
3970 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3971 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3972
a61af66fc99e Initial load
duke
parents:
diff changeset
3973 // called from universe_post_init()
a61af66fc99e Initial load
duke
parents:
diff changeset
3974 assert(
a61af66fc99e Initial load
duke
parents:
diff changeset
3975 int_bits_to_float_fn == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3976 long_bits_to_double_fn == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3977 float_to_int_bits_fn == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3978 double_to_long_bits_fn == NULL ,
a61af66fc99e Initial load
duke
parents:
diff changeset
3979 "initialization done twice"
a61af66fc99e Initial load
duke
parents:
diff changeset
3980 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3981 // initialize
a61af66fc99e Initial load
duke
parents:
diff changeset
3982 int_bits_to_float_fn = CAST_TO_FN_PTR(IntBitsToFloatFn , NativeLookup::base_library_lookup("java/lang/Float" , "intBitsToFloat" , "(I)F"));
a61af66fc99e Initial load
duke
parents:
diff changeset
3983 long_bits_to_double_fn = CAST_TO_FN_PTR(LongBitsToDoubleFn, NativeLookup::base_library_lookup("java/lang/Double", "longBitsToDouble", "(J)D"));
a61af66fc99e Initial load
duke
parents:
diff changeset
3984 float_to_int_bits_fn = CAST_TO_FN_PTR(FloatToIntBitsFn , NativeLookup::base_library_lookup("java/lang/Float" , "floatToIntBits" , "(F)I"));
a61af66fc99e Initial load
duke
parents:
diff changeset
3985 double_to_long_bits_fn = CAST_TO_FN_PTR(DoubleToLongBitsFn, NativeLookup::base_library_lookup("java/lang/Double", "doubleToLongBits", "(D)J"));
a61af66fc99e Initial load
duke
parents:
diff changeset
3986 // verify
a61af66fc99e Initial load
duke
parents:
diff changeset
3987 assert(
a61af66fc99e Initial load
duke
parents:
diff changeset
3988 int_bits_to_float_fn != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3989 long_bits_to_double_fn != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3990 float_to_int_bits_fn != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3991 double_to_long_bits_fn != NULL ,
a61af66fc99e Initial load
duke
parents:
diff changeset
3992 "initialization failed"
a61af66fc99e Initial load
duke
parents:
diff changeset
3993 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3994 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3995
a61af66fc99e Initial load
duke
parents:
diff changeset
3996
a61af66fc99e Initial load
duke
parents:
diff changeset
3997
a61af66fc99e Initial load
duke
parents:
diff changeset
3998 // Shared JNI/JVM entry points //////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3999
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
4000 jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4001 // Security Note:
a61af66fc99e Initial load
duke
parents:
diff changeset
4002 // The Java level wrapper will perform the necessary security check allowing
a61af66fc99e Initial load
duke
parents:
diff changeset
4003 // us to pass the NULL as the initiating class loader.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
4004 Klass* klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL);
878
abe076e3636f 6864003: Modify JVM_FindClassFromBootLoader to return null if class not found
mchung
parents: 875
diff changeset
4005
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4006 KlassHandle klass_handle(THREAD, klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
4007 // Check if we should initialize the class
a61af66fc99e Initial load
duke
parents:
diff changeset
4008 if (init && klass_handle->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4009 klass_handle->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4010 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4011 return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
4012 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4013
a61af66fc99e Initial load
duke
parents:
diff changeset
4014
a61af66fc99e Initial load
duke
parents:
diff changeset
4015 // Internal SQE debugging support ///////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
4016
a61af66fc99e Initial load
duke
parents:
diff changeset
4017 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
4018
a61af66fc99e Initial load
duke
parents:
diff changeset
4019 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
4020 JNIEXPORT jboolean JNICALL JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get);
a61af66fc99e Initial load
duke
parents:
diff changeset
4021 JNIEXPORT jboolean JNICALL JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get);
a61af66fc99e Initial load
duke
parents:
diff changeset
4022 JNIEXPORT void JNICALL JVM_VMBreakPoint(JNIEnv *env, jobject obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
4023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4024
a61af66fc99e Initial load
duke
parents:
diff changeset
4025 JVM_LEAF(jboolean, JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get))
a61af66fc99e Initial load
duke
parents:
diff changeset
4026 JVMWrapper("JVM_AccessBoolVMFlag");
12322
72b7e96c1922 8024545: make develop and notproduct flag values available in product builds
twisti
parents: 12264
diff changeset
4027 return is_get ? CommandLineFlags::boolAt((char*) name, (bool*) value) : CommandLineFlags::boolAtPut((char*) name, (bool*) value, Flag::INTERNAL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4028 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4029
a61af66fc99e Initial load
duke
parents:
diff changeset
4030 JVM_LEAF(jboolean, JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get))
a61af66fc99e Initial load
duke
parents:
diff changeset
4031 JVMWrapper("JVM_AccessVMIntFlag");
a61af66fc99e Initial load
duke
parents:
diff changeset
4032 intx v;
12322
72b7e96c1922 8024545: make develop and notproduct flag values available in product builds
twisti
parents: 12264
diff changeset
4033 jboolean result = is_get ? CommandLineFlags::intxAt((char*) name, &v) : CommandLineFlags::intxAtPut((char*) name, &v, Flag::INTERNAL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4034 *value = (jint)v;
a61af66fc99e Initial load
duke
parents:
diff changeset
4035 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
4036 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4037
a61af66fc99e Initial load
duke
parents:
diff changeset
4038
a61af66fc99e Initial load
duke
parents:
diff changeset
4039 JVM_ENTRY(void, JVM_VMBreakPoint(JNIEnv *env, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
4040 JVMWrapper("JVM_VMBreakPoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
4041 oop the_obj = JNIHandles::resolve(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
4042 BREAKPOINT;
a61af66fc99e Initial load
duke
parents:
diff changeset
4043 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4044
a61af66fc99e Initial load
duke
parents:
diff changeset
4045
a61af66fc99e Initial load
duke
parents:
diff changeset
4046 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
4047
a61af66fc99e Initial load
duke
parents:
diff changeset
4048
a61af66fc99e Initial load
duke
parents:
diff changeset
4049 // Method ///////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
4050
a61af66fc99e Initial load
duke
parents:
diff changeset
4051 JVM_ENTRY(jobject, JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0))
a61af66fc99e Initial load
duke
parents:
diff changeset
4052 JVMWrapper("JVM_InvokeMethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
4053 Handle method_handle;
a61af66fc99e Initial load
duke
parents:
diff changeset
4054 if (thread->stack_available((address) &method_handle) >= JVMInvokeMethodSlack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4055 method_handle = Handle(THREAD, JNIHandles::resolve(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
4056 Handle receiver(THREAD, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
4057 objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
a61af66fc99e Initial load
duke
parents:
diff changeset
4058 oop result = Reflection::invoke_method(method_handle(), receiver, args, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4059 jobject res = JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
4060 if (JvmtiExport::should_post_vm_object_alloc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4061 oop ret_type = java_lang_reflect_Method::return_type(method_handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
4062 assert(ret_type != NULL, "sanity check: ret_type oop must not be NULL!");
a61af66fc99e Initial load
duke
parents:
diff changeset
4063 if (java_lang_Class::is_primitive(ret_type)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4064 // Only for primitive type vm allocates memory for java object.
a61af66fc99e Initial load
duke
parents:
diff changeset
4065 // See box() method.
a61af66fc99e Initial load
duke
parents:
diff changeset
4066 JvmtiExport::post_vm_object_alloc(JavaThread::current(), result);
a61af66fc99e Initial load
duke
parents:
diff changeset
4067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4069 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
4070 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4071 THROW_0(vmSymbols::java_lang_StackOverflowError());
a61af66fc99e Initial load
duke
parents:
diff changeset
4072 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4073 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4074
a61af66fc99e Initial load
duke
parents:
diff changeset
4075
a61af66fc99e Initial load
duke
parents:
diff changeset
4076 JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0))
a61af66fc99e Initial load
duke
parents:
diff changeset
4077 JVMWrapper("JVM_NewInstanceFromConstructor");
a61af66fc99e Initial load
duke
parents:
diff changeset
4078 oop constructor_mirror = JNIHandles::resolve(c);
a61af66fc99e Initial load
duke
parents:
diff changeset
4079 objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
a61af66fc99e Initial load
duke
parents:
diff changeset
4080 oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4081 jobject res = JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
4082 if (JvmtiExport::should_post_vm_object_alloc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4083 JvmtiExport::post_vm_object_alloc(JavaThread::current(), result);
a61af66fc99e Initial load
duke
parents:
diff changeset
4084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4085 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
4086 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4087
a61af66fc99e Initial load
duke
parents:
diff changeset
4088 // Atomic ///////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
4089
a61af66fc99e Initial load
duke
parents:
diff changeset
4090 JVM_LEAF(jboolean, JVM_SupportsCX8())
a61af66fc99e Initial load
duke
parents:
diff changeset
4091 JVMWrapper("JVM_SupportsCX8");
a61af66fc99e Initial load
duke
parents:
diff changeset
4092 return VM_Version::supports_cx8();
a61af66fc99e Initial load
duke
parents:
diff changeset
4093 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4094
a61af66fc99e Initial load
duke
parents:
diff changeset
4095
a61af66fc99e Initial load
duke
parents:
diff changeset
4096 JVM_ENTRY(jboolean, JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal))
a61af66fc99e Initial load
duke
parents:
diff changeset
4097 JVMWrapper("JVM_CX8Field");
a61af66fc99e Initial load
duke
parents:
diff changeset
4098 jlong res;
a61af66fc99e Initial load
duke
parents:
diff changeset
4099 oop o = JNIHandles::resolve(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
4100 intptr_t fldOffs = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid);
a61af66fc99e Initial load
duke
parents:
diff changeset
4101 volatile jlong* addr = (volatile jlong*)((address)o + fldOffs);
a61af66fc99e Initial load
duke
parents:
diff changeset
4102
a61af66fc99e Initial load
duke
parents:
diff changeset
4103 assert(VM_Version::supports_cx8(), "cx8 not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
4104 res = Atomic::cmpxchg(newVal, addr, oldVal);
a61af66fc99e Initial load
duke
parents:
diff changeset
4105
a61af66fc99e Initial load
duke
parents:
diff changeset
4106 return res == oldVal;
a61af66fc99e Initial load
duke
parents:
diff changeset
4107 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4108
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4109 // DTrace ///////////////////////////////////////////////////////////////////
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4110
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4111 JVM_ENTRY(jint, JVM_DTraceGetVersion(JNIEnv* env))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4112 JVMWrapper("JVM_DTraceGetVersion");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4113 return (jint)JVM_TRACING_DTRACE_VERSION;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4114 JVM_END
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4115
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4116 JVM_ENTRY(jlong,JVM_DTraceActivate(
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4117 JNIEnv* env, jint version, jstring module_name, jint providers_count,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4118 JVM_DTraceProvider* providers))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4119 JVMWrapper("JVM_DTraceActivate");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4120 return DTraceJSDT::activate(
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4121 version, module_name, providers_count, providers, CHECK_0);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4122 JVM_END
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4123
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4124 JVM_ENTRY(jboolean,JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4125 JVMWrapper("JVM_DTraceIsProbeEnabled");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4126 return DTraceJSDT::is_probe_enabled(method);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4127 JVM_END
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4128
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4129 JVM_ENTRY(void,JVM_DTraceDispose(JNIEnv* env, jlong handle))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4130 JVMWrapper("JVM_DTraceDispose");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4131 DTraceJSDT::dispose(handle);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4132 JVM_END
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4133
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4134 JVM_ENTRY(jboolean,JVM_DTraceIsSupported(JNIEnv* env))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4135 JVMWrapper("JVM_DTraceIsSupported");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4136 return DTraceJSDT::is_supported();
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4137 JVM_END
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4138
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4139 // Returns an array of all live Thread objects (VM internal JavaThreads,
a61af66fc99e Initial load
duke
parents:
diff changeset
4140 // jvmti agent threads, and JNI attaching threads are skipped)
a61af66fc99e Initial load
duke
parents:
diff changeset
4141 // See CR 6404306 regarding JNI attaching threads
a61af66fc99e Initial load
duke
parents:
diff changeset
4142 JVM_ENTRY(jobjectArray, JVM_GetAllThreads(JNIEnv *env, jclass dummy))
a61af66fc99e Initial load
duke
parents:
diff changeset
4143 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4144 ThreadsListEnumerator tle(THREAD, false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
4145 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
4146
a61af66fc99e Initial load
duke
parents:
diff changeset
4147 int num_threads = tle.num_threads();
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
4148 objArrayOop r = oopFactory::new_objArray(SystemDictionary::Thread_klass(), num_threads, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4149 objArrayHandle threads_ah(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4150
a61af66fc99e Initial load
duke
parents:
diff changeset
4151 for (int i = 0; i < num_threads; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4152 Handle h = tle.get_threadObj(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
4153 threads_ah->obj_at_put(i, h());
a61af66fc99e Initial load
duke
parents:
diff changeset
4154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4155
a61af66fc99e Initial load
duke
parents:
diff changeset
4156 return (jobjectArray) JNIHandles::make_local(env, threads_ah());
a61af66fc99e Initial load
duke
parents:
diff changeset
4157 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4158
a61af66fc99e Initial load
duke
parents:
diff changeset
4159
a61af66fc99e Initial load
duke
parents:
diff changeset
4160 // Support for java.lang.Thread.getStackTrace() and getAllStackTraces() methods
a61af66fc99e Initial load
duke
parents:
diff changeset
4161 // Return StackTraceElement[][], each element is the stack trace of a thread in
a61af66fc99e Initial load
duke
parents:
diff changeset
4162 // the corresponding entry in the given threads array
a61af66fc99e Initial load
duke
parents:
diff changeset
4163 JVM_ENTRY(jobjectArray, JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads))
a61af66fc99e Initial load
duke
parents:
diff changeset
4164 JVMWrapper("JVM_DumpThreads");
a61af66fc99e Initial load
duke
parents:
diff changeset
4165 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
4166
a61af66fc99e Initial load
duke
parents:
diff changeset
4167 // Check if threads is null
a61af66fc99e Initial load
duke
parents:
diff changeset
4168 if (threads == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4169 THROW_(vmSymbols::java_lang_NullPointerException(), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4171
a61af66fc99e Initial load
duke
parents:
diff changeset
4172 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(threads));
a61af66fc99e Initial load
duke
parents:
diff changeset
4173 objArrayHandle ah(THREAD, a);
a61af66fc99e Initial load
duke
parents:
diff changeset
4174 int num_threads = ah->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
4175 // check if threads is non-empty array
a61af66fc99e Initial load
duke
parents:
diff changeset
4176 if (num_threads == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4177 THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4179
a61af66fc99e Initial load
duke
parents:
diff changeset
4180 // check if threads is not an array of objects of Thread class
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
4181 Klass* k = ObjArrayKlass::cast(ah->klass())->element_klass();
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
4182 if (k != SystemDictionary::Thread_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4183 THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4185
a61af66fc99e Initial load
duke
parents:
diff changeset
4186 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4187
a61af66fc99e Initial load
duke
parents:
diff changeset
4188 GrowableArray<instanceHandle>* thread_handle_array = new GrowableArray<instanceHandle>(num_threads);
a61af66fc99e Initial load
duke
parents:
diff changeset
4189 for (int i = 0; i < num_threads; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4190 oop thread_obj = ah->obj_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
4191 instanceHandle h(THREAD, (instanceOop) thread_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
4192 thread_handle_array->append(h);
a61af66fc99e Initial load
duke
parents:
diff changeset
4193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4194
a61af66fc99e Initial load
duke
parents:
diff changeset
4195 Handle stacktraces = ThreadService::dump_stack_traces(thread_handle_array, num_threads, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4196 return (jobjectArray)JNIHandles::make_local(env, stacktraces());
a61af66fc99e Initial load
duke
parents:
diff changeset
4197
a61af66fc99e Initial load
duke
parents:
diff changeset
4198 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4199
a61af66fc99e Initial load
duke
parents:
diff changeset
4200 // JVM monitoring and management support
a61af66fc99e Initial load
duke
parents:
diff changeset
4201 JVM_ENTRY_NO_ENV(void*, JVM_GetManagement(jint version))
a61af66fc99e Initial load
duke
parents:
diff changeset
4202 return Management::get_jmm_interface(version);
a61af66fc99e Initial load
duke
parents:
diff changeset
4203 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4204
a61af66fc99e Initial load
duke
parents:
diff changeset
4205 // com.sun.tools.attach.VirtualMachine agent properties support
a61af66fc99e Initial load
duke
parents:
diff changeset
4206 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4207 // Initialize the agent properties with the properties maintained in the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
4208 JVM_ENTRY(jobject, JVM_InitAgentProperties(JNIEnv *env, jobject properties))
a61af66fc99e Initial load
duke
parents:
diff changeset
4209 JVMWrapper("JVM_InitAgentProperties");
a61af66fc99e Initial load
duke
parents:
diff changeset
4210 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
4211
a61af66fc99e Initial load
duke
parents:
diff changeset
4212 Handle props(THREAD, JNIHandles::resolve_non_null(properties));
a61af66fc99e Initial load
duke
parents:
diff changeset
4213
a61af66fc99e Initial load
duke
parents:
diff changeset
4214 PUTPROP(props, "sun.java.command", Arguments::java_command());
a61af66fc99e Initial load
duke
parents:
diff changeset
4215 PUTPROP(props, "sun.jvm.flags", Arguments::jvm_flags());
a61af66fc99e Initial load
duke
parents:
diff changeset
4216 PUTPROP(props, "sun.jvm.args", Arguments::jvm_args());
a61af66fc99e Initial load
duke
parents:
diff changeset
4217 return properties;
a61af66fc99e Initial load
duke
parents:
diff changeset
4218 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4219
a61af66fc99e Initial load
duke
parents:
diff changeset
4220 JVM_ENTRY(jobjectArray, JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
4221 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4222 JVMWrapper("JVM_GetEnclosingMethodInfo");
a61af66fc99e Initial load
duke
parents:
diff changeset
4223 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
4224
a61af66fc99e Initial load
duke
parents:
diff changeset
4225 if (ofClass == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4226 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4228 Handle mirror(THREAD, JNIHandles::resolve_non_null(ofClass));
a61af66fc99e Initial load
duke
parents:
diff changeset
4229 // Special handling for primitive objects
a61af66fc99e Initial load
duke
parents:
diff changeset
4230 if (java_lang_Class::is_primitive(mirror())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4231 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4232 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
4233 Klass* k = java_lang_Class::as_Klass(mirror());
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
4234 if (!k->oop_is_instance()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4235 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4236 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4237 instanceKlassHandle ik_h(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
4238 int encl_method_class_idx = ik_h->enclosing_method_class_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
4239 if (encl_method_class_idx == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4240 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4241 }
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
4242 objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::Object_klass(), 3, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4243 objArrayHandle dest(THREAD, dest_o);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
4244 Klass* enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
4245 dest->obj_at_put(0, enc_k->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4246 int encl_method_method_idx = ik_h->enclosing_method_method_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
4247 if (encl_method_method_idx != 0) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
4248 Symbol* sym = ik_h->constants()->symbol_at(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4249 extract_low_short_from_int(
a61af66fc99e Initial load
duke
parents:
diff changeset
4250 ik_h->constants()->name_and_type_at(encl_method_method_idx)));
a61af66fc99e Initial load
duke
parents:
diff changeset
4251 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4252 dest->obj_at_put(1, str());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2162
diff changeset
4253 sym = ik_h->constants()->symbol_at(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4254 extract_high_short_from_int(
a61af66fc99e Initial load
duke
parents:
diff changeset
4255 ik_h->constants()->name_and_type_at(encl_method_method_idx)));
a61af66fc99e Initial load
duke
parents:
diff changeset
4256 str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4257 dest->obj_at_put(2, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
4258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4259 return (jobjectArray) JNIHandles::make_local(dest());
a61af66fc99e Initial load
duke
parents:
diff changeset
4260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4261 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4262
a61af66fc99e Initial load
duke
parents:
diff changeset
4263 JVM_ENTRY(jintArray, JVM_GetThreadStateValues(JNIEnv* env,
a61af66fc99e Initial load
duke
parents:
diff changeset
4264 jint javaThreadState))
a61af66fc99e Initial load
duke
parents:
diff changeset
4265 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4266 // If new thread states are added in future JDK and VM versions,
a61af66fc99e Initial load
duke
parents:
diff changeset
4267 // this should check if the JDK version is compatible with thread
a61af66fc99e Initial load
duke
parents:
diff changeset
4268 // states supported by the VM. Return NULL if not compatible.
a61af66fc99e Initial load
duke
parents:
diff changeset
4269 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4270 // This function must map the VM java_lang_Thread::ThreadStatus
a61af66fc99e Initial load
duke
parents:
diff changeset
4271 // to the Java thread state that the JDK supports.
a61af66fc99e Initial load
duke
parents:
diff changeset
4272 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4273
a61af66fc99e Initial load
duke
parents:
diff changeset
4274 typeArrayHandle values_h;
a61af66fc99e Initial load
duke
parents:
diff changeset
4275 switch (javaThreadState) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4276 case JAVA_THREAD_STATE_NEW : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4277 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4278 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4279 values_h->int_at_put(0, java_lang_Thread::NEW);
a61af66fc99e Initial load
duke
parents:
diff changeset
4280 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4282 case JAVA_THREAD_STATE_RUNNABLE : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4283 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4284 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4285 values_h->int_at_put(0, java_lang_Thread::RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
4286 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4288 case JAVA_THREAD_STATE_BLOCKED : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4289 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4290 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4291 values_h->int_at_put(0, java_lang_Thread::BLOCKED_ON_MONITOR_ENTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4292 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4294 case JAVA_THREAD_STATE_WAITING : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4295 typeArrayOop r = oopFactory::new_typeArray(T_INT, 2, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4296 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4297 values_h->int_at_put(0, java_lang_Thread::IN_OBJECT_WAIT);
a61af66fc99e Initial load
duke
parents:
diff changeset
4298 values_h->int_at_put(1, java_lang_Thread::PARKED);
a61af66fc99e Initial load
duke
parents:
diff changeset
4299 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4301 case JAVA_THREAD_STATE_TIMED_WAITING : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4302 typeArrayOop r = oopFactory::new_typeArray(T_INT, 3, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4303 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4304 values_h->int_at_put(0, java_lang_Thread::SLEEPING);
a61af66fc99e Initial load
duke
parents:
diff changeset
4305 values_h->int_at_put(1, java_lang_Thread::IN_OBJECT_WAIT_TIMED);
a61af66fc99e Initial load
duke
parents:
diff changeset
4306 values_h->int_at_put(2, java_lang_Thread::PARKED_TIMED);
a61af66fc99e Initial load
duke
parents:
diff changeset
4307 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4309 case JAVA_THREAD_STATE_TERMINATED : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4310 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4311 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4312 values_h->int_at_put(0, java_lang_Thread::TERMINATED);
a61af66fc99e Initial load
duke
parents:
diff changeset
4313 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4315 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
4316 // Unknown state - probably incompatible JDK version
a61af66fc99e Initial load
duke
parents:
diff changeset
4317 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4319
a61af66fc99e Initial load
duke
parents:
diff changeset
4320 return (jintArray) JNIHandles::make_local(env, values_h());
a61af66fc99e Initial load
duke
parents:
diff changeset
4321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4322 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4323
a61af66fc99e Initial load
duke
parents:
diff changeset
4324
a61af66fc99e Initial load
duke
parents:
diff changeset
4325 JVM_ENTRY(jobjectArray, JVM_GetThreadStateNames(JNIEnv* env,
a61af66fc99e Initial load
duke
parents:
diff changeset
4326 jint javaThreadState,
a61af66fc99e Initial load
duke
parents:
diff changeset
4327 jintArray values))
a61af66fc99e Initial load
duke
parents:
diff changeset
4328 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4329 // If new thread states are added in future JDK and VM versions,
a61af66fc99e Initial load
duke
parents:
diff changeset
4330 // this should check if the JDK version is compatible with thread
a61af66fc99e Initial load
duke
parents:
diff changeset
4331 // states supported by the VM. Return NULL if not compatible.
a61af66fc99e Initial load
duke
parents:
diff changeset
4332 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4333 // This function must map the VM java_lang_Thread::ThreadStatus
a61af66fc99e Initial load
duke
parents:
diff changeset
4334 // to the Java thread state that the JDK supports.
a61af66fc99e Initial load
duke
parents:
diff changeset
4335 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4336
a61af66fc99e Initial load
duke
parents:
diff changeset
4337 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
4338
a61af66fc99e Initial load
duke
parents:
diff changeset
4339 // Check if threads is null
a61af66fc99e Initial load
duke
parents:
diff changeset
4340 if (values == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4341 THROW_(vmSymbols::java_lang_NullPointerException(), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4343
a61af66fc99e Initial load
duke
parents:
diff changeset
4344 typeArrayOop v = typeArrayOop(JNIHandles::resolve_non_null(values));
a61af66fc99e Initial load
duke
parents:
diff changeset
4345 typeArrayHandle values_h(THREAD, v);
a61af66fc99e Initial load
duke
parents:
diff changeset
4346
a61af66fc99e Initial load
duke
parents:
diff changeset
4347 objArrayHandle names_h;
a61af66fc99e Initial load
duke
parents:
diff changeset
4348 switch (javaThreadState) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4349 case JAVA_THREAD_STATE_NEW : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4350 assert(values_h->length() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4351 values_h->int_at(0) == java_lang_Thread::NEW,
a61af66fc99e Initial load
duke
parents:
diff changeset
4352 "Invalid threadStatus value");
a61af66fc99e Initial load
duke
parents:
diff changeset
4353
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
4354 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4355 1, /* only 1 substate */
a61af66fc99e Initial load
duke
parents:
diff changeset
4356 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4357 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4358 Handle name = java_lang_String::create_from_str("NEW", CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4359 names_h->obj_at_put(0, name());
a61af66fc99e Initial load
duke
parents:
diff changeset
4360 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4362 case JAVA_THREAD_STATE_RUNNABLE : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4363 assert(values_h->length() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4364 values_h->int_at(0) == java_lang_Thread::RUNNABLE,
a61af66fc99e Initial load
duke
parents:
diff changeset
4365 "Invalid threadStatus value");
a61af66fc99e Initial load
duke
parents:
diff changeset
4366
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
4367 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4368 1, /* only 1 substate */
a61af66fc99e Initial load
duke
parents:
diff changeset
4369 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4370 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4371 Handle name = java_lang_String::create_from_str("RUNNABLE", CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4372 names_h->obj_at_put(0, name());
a61af66fc99e Initial load
duke
parents:
diff changeset
4373 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4374 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4375 case JAVA_THREAD_STATE_BLOCKED : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4376 assert(values_h->length() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4377 values_h->int_at(0) == java_lang_Thread::BLOCKED_ON_MONITOR_ENTER,
a61af66fc99e Initial load
duke
parents:
diff changeset
4378 "Invalid threadStatus value");
a61af66fc99e Initial load
duke
parents:
diff changeset
4379
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
4380 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4381 1, /* only 1 substate */
a61af66fc99e Initial load
duke
parents:
diff changeset
4382 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4383 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4384 Handle name = java_lang_String::create_from_str("BLOCKED", CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4385 names_h->obj_at_put(0, name());
a61af66fc99e Initial load
duke
parents:
diff changeset
4386 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4388 case JAVA_THREAD_STATE_WAITING : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4389 assert(values_h->length() == 2 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4390 values_h->int_at(0) == java_lang_Thread::IN_OBJECT_WAIT &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4391 values_h->int_at(1) == java_lang_Thread::PARKED,
a61af66fc99e Initial load
duke
parents:
diff changeset
4392 "Invalid threadStatus value");
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
4393 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4394 2, /* number of substates */
a61af66fc99e Initial load
duke
parents:
diff changeset
4395 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4396 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4397 Handle name0 = java_lang_String::create_from_str("WAITING.OBJECT_WAIT",
a61af66fc99e Initial load
duke
parents:
diff changeset
4398 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4399 Handle name1 = java_lang_String::create_from_str("WAITING.PARKED",
a61af66fc99e Initial load
duke
parents:
diff changeset
4400 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4401 names_h->obj_at_put(0, name0());
a61af66fc99e Initial load
duke
parents:
diff changeset
4402 names_h->obj_at_put(1, name1());
a61af66fc99e Initial load
duke
parents:
diff changeset
4403 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4404 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4405 case JAVA_THREAD_STATE_TIMED_WAITING : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4406 assert(values_h->length() == 3 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4407 values_h->int_at(0) == java_lang_Thread::SLEEPING &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4408 values_h->int_at(1) == java_lang_Thread::IN_OBJECT_WAIT_TIMED &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4409 values_h->int_at(2) == java_lang_Thread::PARKED_TIMED,
a61af66fc99e Initial load
duke
parents:
diff changeset
4410 "Invalid threadStatus value");
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
4411 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4412 3, /* number of substates */
a61af66fc99e Initial load
duke
parents:
diff changeset
4413 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4414 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4415 Handle name0 = java_lang_String::create_from_str("TIMED_WAITING.SLEEPING",
a61af66fc99e Initial load
duke
parents:
diff changeset
4416 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4417 Handle name1 = java_lang_String::create_from_str("TIMED_WAITING.OBJECT_WAIT",
a61af66fc99e Initial load
duke
parents:
diff changeset
4418 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4419 Handle name2 = java_lang_String::create_from_str("TIMED_WAITING.PARKED",
a61af66fc99e Initial load
duke
parents:
diff changeset
4420 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4421 names_h->obj_at_put(0, name0());
a61af66fc99e Initial load
duke
parents:
diff changeset
4422 names_h->obj_at_put(1, name1());
a61af66fc99e Initial load
duke
parents:
diff changeset
4423 names_h->obj_at_put(2, name2());
a61af66fc99e Initial load
duke
parents:
diff changeset
4424 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4426 case JAVA_THREAD_STATE_TERMINATED : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4427 assert(values_h->length() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4428 values_h->int_at(0) == java_lang_Thread::TERMINATED,
a61af66fc99e Initial load
duke
parents:
diff changeset
4429 "Invalid threadStatus value");
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1059
diff changeset
4430 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4431 1, /* only 1 substate */
a61af66fc99e Initial load
duke
parents:
diff changeset
4432 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4433 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4434 Handle name = java_lang_String::create_from_str("TERMINATED", CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4435 names_h->obj_at_put(0, name());
a61af66fc99e Initial load
duke
parents:
diff changeset
4436 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4438 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
4439 // Unknown state - probably incompatible JDK version
a61af66fc99e Initial load
duke
parents:
diff changeset
4440 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4442 return (jobjectArray) JNIHandles::make_local(env, names_h());
a61af66fc99e Initial load
duke
parents:
diff changeset
4443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4444 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4445
a61af66fc99e Initial load
duke
parents:
diff changeset
4446 JVM_ENTRY(void, JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size))
a61af66fc99e Initial load
duke
parents:
diff changeset
4447 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4448 memset(info, 0, sizeof(info_size));
a61af66fc99e Initial load
duke
parents:
diff changeset
4449
a61af66fc99e Initial load
duke
parents:
diff changeset
4450 info->jvm_version = Abstract_VM_Version::jvm_version();
a61af66fc99e Initial load
duke
parents:
diff changeset
4451 info->update_version = 0; /* 0 in HotSpot Express VM */
a61af66fc99e Initial load
duke
parents:
diff changeset
4452 info->special_update_version = 0; /* 0 in HotSpot Express VM */
a61af66fc99e Initial load
duke
parents:
diff changeset
4453
a61af66fc99e Initial load
duke
parents:
diff changeset
4454 // when we add a new capability in the jvm_version_info struct, we should also
a61af66fc99e Initial load
duke
parents:
diff changeset
4455 // consider to expose this new capability in the sun.rt.jvmCapabilities jvmstat
a61af66fc99e Initial load
duke
parents:
diff changeset
4456 // counter defined in runtimeService.cpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
4457 info->is_attachable = AttachListener::is_attach_supported();
a61af66fc99e Initial load
duke
parents:
diff changeset
4458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4459 JVM_END