annotate src/share/vm/prims/unsafe.cpp @ 7588:f9eb431c3efe

8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
author coleenp
date Mon, 14 Jan 2013 11:01:39 -0500
parents 1e41b0bc58a0
children db9981fd3124 96a337d307bd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 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/vmSymbols.hpp"
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
27 #ifndef SERIALGC
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
28 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
29 #endif // SERIALGC
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "prims/jni.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "prims/jvm.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "runtime/globals.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "runtime/reflection.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #include "runtime/synchronizer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 #include "services/threadService.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #include "utilities/copy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
39 #include "utilities/dtrace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
40
0
a61af66fc99e Initial load
duke
parents:
diff changeset
41 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
42 * Implementation of class sun.misc.Unsafe
a61af66fc99e Initial load
duke
parents:
diff changeset
43 */
a61af66fc99e Initial load
duke
parents:
diff changeset
44
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
45 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 845
diff changeset
46 HS_DTRACE_PROBE_DECL3(hotspot, thread__park__begin, uintptr_t, int, long long);
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 845
diff changeset
47 HS_DTRACE_PROBE_DECL1(hotspot, thread__park__end, uintptr_t);
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 845
diff changeset
48 HS_DTRACE_PROBE_DECL1(hotspot, thread__unpark, uintptr_t);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
49 #endif /* !USDT2 */
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 845
diff changeset
50
0
a61af66fc99e Initial load
duke
parents:
diff changeset
51 #define MAX_OBJECT_SIZE \
a61af66fc99e Initial load
duke
parents:
diff changeset
52 ( arrayOopDesc::header_size(T_DOUBLE) * HeapWordSize \
a61af66fc99e Initial load
duke
parents:
diff changeset
53 + ((julong)max_jint * sizeof(double)) )
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 #define UNSAFE_ENTRY(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
57 JVM_ENTRY(result_type, header)
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // Can't use UNSAFE_LEAF because it has the signature of a straight
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // call into the runtime (just like JVM_LEAF, funny that) but it's
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // called like a Java Native and thus the wrapper built for it passes
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // arguments like a JNI call. It expects those arguments to be popped
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // from the stack on Intel like all good JNI args are, and adjusts the
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // stack according. Since the JVM_LEAF call expects no extra
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // arguments the stack isn't popped in the C code, is pushed by the
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // wrapper and we get sick.
a61af66fc99e Initial load
duke
parents:
diff changeset
67 //#define UNSAFE_LEAF(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // JVM_LEAF(result_type, header)
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 #define UNSAFE_END JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 #define UnsafeWrapper(arg) /*nothing, for the present*/
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 inline void* addr_from_java(jlong addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // This assert fails in a variety of ways on 32-bit systems.
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // It is impossible to predict whether native code that converts
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // pointers to longs will sign-extend or zero-extend the addresses.
a61af66fc99e Initial load
duke
parents:
diff changeset
79 //assert(addr == (uintptr_t)addr, "must not be odd high bits");
a61af66fc99e Initial load
duke
parents:
diff changeset
80 return (void*)(uintptr_t)addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 inline jlong addr_to_java(void* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 assert(p == (void*)(uintptr_t)p, "must not be odd high bits");
a61af66fc99e Initial load
duke
parents:
diff changeset
85 return (uintptr_t)p;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Note: The VM's obj_field and related accessors use byte-scaled
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // ("unscaled") offsets, just as the unsafe methods do.
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // However, the method Unsafe.fieldOffset explicitly declines to
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // guarantee this. The field offset values manipulated by the Java user
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // through the Unsafe API are opaque cookies that just happen to be byte
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // offsets. We represent this state of affairs by passing the cookies
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // through conversion functions when going between the VM and the Unsafe API.
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // The conversion functions just happen to be no-ops at present.
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 inline jlong field_offset_to_byte_offset(jlong field_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
100 return field_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 inline jlong field_offset_from_byte_offset(jlong byte_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 return byte_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 inline jint invocation_key_from_method_slot(jint slot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 return slot;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 inline jint invocation_key_to_method_slot(jint key) {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 return key;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 inline void* index_oop_from_field_offset_long(oop p, jlong field_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 jlong byte_offset = field_offset_to_byte_offset(field_offset);
2316
d411927672ed 7012072: CompileTheWorld causes incorrect class initialization
never
parents: 2177
diff changeset
117 // Don't allow unsafe to be used to read or write the header word of oops
d411927672ed 7012072: CompileTheWorld causes incorrect class initialization
never
parents: 2177
diff changeset
118 assert(p == NULL || field_offset >= oopDesc::header_size(), "offset must be outside of header");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
119 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
120 if (p != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 assert(byte_offset >= 0 && byte_offset <= (jlong)MAX_OBJECT_SIZE, "sane offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
122 if (byte_offset == (jint)byte_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 void* ptr_plus_disp = (address)p + byte_offset;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
124 assert((void*)p->obj_field_addr<oop>((jint)byte_offset) == ptr_plus_disp,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
125 "raw [ptr+disp] must be consistent with oop::field_base");
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
6889
e81a8af10cd9 8001071: Add simple range check into VM implemenation of Unsafe access methods
kvn
parents: 6831
diff changeset
127 jlong p_size = HeapWordSize * (jlong)(p->size());
e81a8af10cd9 8001071: Add simple range check into VM implemenation of Unsafe access methods
kvn
parents: 6831
diff changeset
128 assert(byte_offset < p_size, err_msg("Unsafe access: offset " INT64_FORMAT " > object's size " INT64_FORMAT, byte_offset, p_size));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
131 if (sizeof(char*) == sizeof(jint)) // (this constant folds!)
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return (address)p + (jint) byte_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 else
a61af66fc99e Initial load
duke
parents:
diff changeset
134 return (address)p + byte_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // Externally callable versions:
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // (Use these in compiler intrinsics which emulate unsafe primitives.)
a61af66fc99e Initial load
duke
parents:
diff changeset
139 jlong Unsafe_field_offset_to_byte_offset(jlong field_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 return field_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 jlong Unsafe_field_offset_from_byte_offset(jlong byte_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 return byte_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145 jint Unsafe_invocation_key_from_method_slot(jint slot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 return invocation_key_from_method_slot(slot);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 jint Unsafe_invocation_key_to_method_slot(jint key) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 return invocation_key_to_method_slot(key);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 ///// Data in the Java heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 #define GET_FIELD(obj, offset, type_name, v) \
a61af66fc99e Initial load
duke
parents:
diff changeset
156 oop p = JNIHandles::resolve(obj); \
a61af66fc99e Initial load
duke
parents:
diff changeset
157 type_name v = *(type_name*)index_oop_from_field_offset_long(p, offset)
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 #define SET_FIELD(obj, offset, type_name, x) \
a61af66fc99e Initial load
duke
parents:
diff changeset
160 oop p = JNIHandles::resolve(obj); \
a61af66fc99e Initial load
duke
parents:
diff changeset
161 *(type_name*)index_oop_from_field_offset_long(p, offset) = x
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 #define GET_FIELD_VOLATILE(obj, offset, type_name, v) \
a61af66fc99e Initial load
duke
parents:
diff changeset
164 oop p = JNIHandles::resolve(obj); \
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
165 volatile type_name v = OrderAccess::load_acquire((volatile type_name*)index_oop_from_field_offset_long(p, offset));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 #define SET_FIELD_VOLATILE(obj, offset, type_name, x) \
a61af66fc99e Initial load
duke
parents:
diff changeset
168 oop p = JNIHandles::resolve(obj); \
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
169 OrderAccess::release_store_fence((volatile type_name*)index_oop_from_field_offset_long(p, offset), x);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
170
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
171 // Macros for oops that check UseCompressedOops
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
172
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
173 #define GET_OOP_FIELD(obj, offset, v) \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
174 oop p = JNIHandles::resolve(obj); \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
175 oop v; \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
176 if (UseCompressedOops) { \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
177 narrowOop n = *(narrowOop*)index_oop_from_field_offset_long(p, offset); \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
178 v = oopDesc::decode_heap_oop(n); \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
179 } else { \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
180 v = *(oop*)index_oop_from_field_offset_long(p, offset); \
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
181 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
182
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
183
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Get/SetObject must be special-cased, since it works with handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // The xxx140 variants for backward compatibility do not allow a full-width offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
187 UNSAFE_ENTRY(jobject, Unsafe_GetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset))
a61af66fc99e Initial load
duke
parents:
diff changeset
188 UnsafeWrapper("Unsafe_GetObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if (obj == NULL) THROW_0(vmSymbols::java_lang_NullPointerException());
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
190 GET_OOP_FIELD(obj, offset, v)
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
191 jobject ret = JNIHandles::make_local(env, v);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
192 #ifndef SERIALGC
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
193 // We could be accessing the referent field in a reference
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
194 // object. If G1 is enabled then we need to register a non-null
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
195 // referent with the SATB barrier.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
196 if (UseG1GC) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
197 bool needs_barrier = false;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
198
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
199 if (ret != NULL) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
200 if (offset == java_lang_ref_Reference::referent_offset) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
201 oop o = JNIHandles::resolve_non_null(obj);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
202 Klass* k = o->klass();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
203 if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
204 assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
205 needs_barrier = true;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
206 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
207 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
208 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
209
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
210 if (needs_barrier) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
211 oop referent = JNIHandles::resolve(ret);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
212 G1SATBCardTableModRefBS::enqueue(referent);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
213 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
214 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
215 #endif // SERIALGC
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
216 return ret;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
217 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 UNSAFE_ENTRY(void, Unsafe_SetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset, jobject x_h))
a61af66fc99e Initial load
duke
parents:
diff changeset
220 UnsafeWrapper("Unsafe_SetObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
221 if (obj == NULL) THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
222 oop x = JNIHandles::resolve(x_h);
a61af66fc99e Initial load
duke
parents:
diff changeset
223 //SET_FIELD(obj, offset, oop, x);
a61af66fc99e Initial load
duke
parents:
diff changeset
224 oop p = JNIHandles::resolve(obj);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
225 if (UseCompressedOops) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
226 if (x != NULL) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
227 // If there is a heap base pointer, we are obliged to emit a store barrier.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
228 oop_store((narrowOop*)index_oop_from_field_offset_long(p, offset), x);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
229 } else {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
230 narrowOop n = oopDesc::encode_heap_oop_not_null(x);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
231 *(narrowOop*)index_oop_from_field_offset_long(p, offset) = n;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
232 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
233 } else {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
234 if (x != NULL) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
235 // If there is a heap base pointer, we are obliged to emit a store barrier.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
236 oop_store((oop*)index_oop_from_field_offset_long(p, offset), x);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
237 } else {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
238 *(oop*)index_oop_from_field_offset_long(p, offset) = x;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
239 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
241 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // The normal variants allow a null base pointer with an arbitrary address.
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // But if the base pointer is non-null, the offset should make some sense.
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // That is, it should be in the range [0, MAX_OBJECT_SIZE].
a61af66fc99e Initial load
duke
parents:
diff changeset
246 UNSAFE_ENTRY(jobject, Unsafe_GetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
a61af66fc99e Initial load
duke
parents:
diff changeset
247 UnsafeWrapper("Unsafe_GetObject");
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
248 GET_OOP_FIELD(obj, offset, v)
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
249 jobject ret = JNIHandles::make_local(env, v);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
250 #ifndef SERIALGC
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
251 // We could be accessing the referent field in a reference
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
252 // object. If G1 is enabled then we need to register non-null
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
253 // referent with the SATB barrier.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
254 if (UseG1GC) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
255 bool needs_barrier = false;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
256
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
257 if (ret != NULL) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
258 if (offset == java_lang_ref_Reference::referent_offset && obj != NULL) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
259 oop o = JNIHandles::resolve(obj);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
260 Klass* k = o->klass();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
261 if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
262 assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
263 needs_barrier = true;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
264 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
265 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
266 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
267
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
268 if (needs_barrier) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
269 oop referent = JNIHandles::resolve(ret);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
270 G1SATBCardTableModRefBS::enqueue(referent);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
271 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
272 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
273 #endif // SERIALGC
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
274 return ret;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
275 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 UNSAFE_ENTRY(void, Unsafe_SetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
a61af66fc99e Initial load
duke
parents:
diff changeset
278 UnsafeWrapper("Unsafe_SetObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
279 oop x = JNIHandles::resolve(x_h);
a61af66fc99e Initial load
duke
parents:
diff changeset
280 oop p = JNIHandles::resolve(obj);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
281 if (UseCompressedOops) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
282 oop_store((narrowOop*)index_oop_from_field_offset_long(p, offset), x);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
283 } else {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
284 oop_store((oop*)index_oop_from_field_offset_long(p, offset), x);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
285 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
286 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 UNSAFE_ENTRY(jobject, Unsafe_GetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
a61af66fc99e Initial load
duke
parents:
diff changeset
289 UnsafeWrapper("Unsafe_GetObjectVolatile");
6224
56c4f88474b3 7087357: JSR 292: remove obsolete code after 7085860
twisti
parents: 4043
diff changeset
290 oop p = JNIHandles::resolve(obj);
56c4f88474b3 7087357: JSR 292: remove obsolete code after 7085860
twisti
parents: 4043
diff changeset
291 void* addr = index_oop_from_field_offset_long(p, offset);
56c4f88474b3 7087357: JSR 292: remove obsolete code after 7085860
twisti
parents: 4043
diff changeset
292 volatile oop v;
56c4f88474b3 7087357: JSR 292: remove obsolete code after 7085860
twisti
parents: 4043
diff changeset
293 if (UseCompressedOops) {
56c4f88474b3 7087357: JSR 292: remove obsolete code after 7085860
twisti
parents: 4043
diff changeset
294 volatile narrowOop n = *(volatile narrowOop*) addr;
56c4f88474b3 7087357: JSR 292: remove obsolete code after 7085860
twisti
parents: 4043
diff changeset
295 v = oopDesc::decode_heap_oop(n);
56c4f88474b3 7087357: JSR 292: remove obsolete code after 7085860
twisti
parents: 4043
diff changeset
296 } else {
56c4f88474b3 7087357: JSR 292: remove obsolete code after 7085860
twisti
parents: 4043
diff changeset
297 v = *(volatile oop*) addr;
56c4f88474b3 7087357: JSR 292: remove obsolete code after 7085860
twisti
parents: 4043
diff changeset
298 }
56c4f88474b3 7087357: JSR 292: remove obsolete code after 7085860
twisti
parents: 4043
diff changeset
299 OrderAccess::acquire();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 return JNIHandles::make_local(env, v);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 UNSAFE_ENTRY(void, Unsafe_SetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
a61af66fc99e Initial load
duke
parents:
diff changeset
304 UnsafeWrapper("Unsafe_SetObjectVolatile");
a61af66fc99e Initial load
duke
parents:
diff changeset
305 oop x = JNIHandles::resolve(x_h);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 oop p = JNIHandles::resolve(obj);
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
307 void* addr = index_oop_from_field_offset_long(p, offset);
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
308 OrderAccess::release();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
309 if (UseCompressedOops) {
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
310 oop_store((narrowOop*)addr, x);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
311 } else {
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
312 oop_store((oop*)addr, x);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
313 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
314 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
315 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
316
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
317 #if defined(SPARC) || defined(X86)
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
318 // Sparc and X86 have atomic jlong (8 bytes) instructions
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
319
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
320 #else
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
321 // Keep old code for platforms which may not have atomic jlong (8 bytes) instructions
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
322
0
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // Volatile long versions must use locks if !VM_Version::supports_cx8().
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // support_cx8 is a surrogate for 'supports atomic long memory ops'.
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 UNSAFE_ENTRY(jlong, Unsafe_GetLongVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
a61af66fc99e Initial load
duke
parents:
diff changeset
327 UnsafeWrapper("Unsafe_GetLongVolatile");
a61af66fc99e Initial load
duke
parents:
diff changeset
328 {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 if (VM_Version::supports_cx8()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 GET_FIELD_VOLATILE(obj, offset, jlong, v);
a61af66fc99e Initial load
duke
parents:
diff changeset
331 return v;
a61af66fc99e Initial load
duke
parents:
diff changeset
332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
333 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 Handle p (THREAD, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
335 jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
336 ObjectLocker ol(p, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
337 jlong value = *addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 return value;
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
341 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 UNSAFE_ENTRY(void, Unsafe_SetLongVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong x))
a61af66fc99e Initial load
duke
parents:
diff changeset
344 UnsafeWrapper("Unsafe_SetLongVolatile");
a61af66fc99e Initial load
duke
parents:
diff changeset
345 {
a61af66fc99e Initial load
duke
parents:
diff changeset
346 if (VM_Version::supports_cx8()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 SET_FIELD_VOLATILE(obj, offset, jlong, x);
a61af66fc99e Initial load
duke
parents:
diff changeset
348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
349 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 Handle p (THREAD, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
351 jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
352 ObjectLocker ol(p, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
353 *addr = x;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
357
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
358 #endif // not SPARC and not X86
0
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 #define DEFINE_GETSETOOP(jboolean, Boolean) \
a61af66fc99e Initial load
duke
parents:
diff changeset
361 \
a61af66fc99e Initial load
duke
parents:
diff changeset
362 UNSAFE_ENTRY(jboolean, Unsafe_Get##Boolean##140(JNIEnv *env, jobject unsafe, jobject obj, jint offset)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
363 UnsafeWrapper("Unsafe_Get"#Boolean); \
a61af66fc99e Initial load
duke
parents:
diff changeset
364 if (obj == NULL) THROW_0(vmSymbols::java_lang_NullPointerException()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
365 GET_FIELD(obj, offset, jboolean, v); \
a61af66fc99e Initial load
duke
parents:
diff changeset
366 return v; \
a61af66fc99e Initial load
duke
parents:
diff changeset
367 UNSAFE_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
368 \
a61af66fc99e Initial load
duke
parents:
diff changeset
369 UNSAFE_ENTRY(void, Unsafe_Set##Boolean##140(JNIEnv *env, jobject unsafe, jobject obj, jint offset, jboolean x)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
370 UnsafeWrapper("Unsafe_Set"#Boolean); \
a61af66fc99e Initial load
duke
parents:
diff changeset
371 if (obj == NULL) THROW(vmSymbols::java_lang_NullPointerException()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
372 SET_FIELD(obj, offset, jboolean, x); \
a61af66fc99e Initial load
duke
parents:
diff changeset
373 UNSAFE_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
374 \
a61af66fc99e Initial load
duke
parents:
diff changeset
375 UNSAFE_ENTRY(jboolean, Unsafe_Get##Boolean(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
376 UnsafeWrapper("Unsafe_Get"#Boolean); \
a61af66fc99e Initial load
duke
parents:
diff changeset
377 GET_FIELD(obj, offset, jboolean, v); \
a61af66fc99e Initial load
duke
parents:
diff changeset
378 return v; \
a61af66fc99e Initial load
duke
parents:
diff changeset
379 UNSAFE_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
380 \
a61af66fc99e Initial load
duke
parents:
diff changeset
381 UNSAFE_ENTRY(void, Unsafe_Set##Boolean(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jboolean x)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
382 UnsafeWrapper("Unsafe_Set"#Boolean); \
a61af66fc99e Initial load
duke
parents:
diff changeset
383 SET_FIELD(obj, offset, jboolean, x); \
a61af66fc99e Initial load
duke
parents:
diff changeset
384 UNSAFE_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
385 \
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // END DEFINE_GETSETOOP.
a61af66fc99e Initial load
duke
parents:
diff changeset
387
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
388 DEFINE_GETSETOOP(jboolean, Boolean)
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
389 DEFINE_GETSETOOP(jbyte, Byte)
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
390 DEFINE_GETSETOOP(jshort, Short);
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
391 DEFINE_GETSETOOP(jchar, Char);
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
392 DEFINE_GETSETOOP(jint, Int);
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
393 DEFINE_GETSETOOP(jlong, Long);
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
394 DEFINE_GETSETOOP(jfloat, Float);
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
395 DEFINE_GETSETOOP(jdouble, Double);
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
396
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
397 #undef DEFINE_GETSETOOP
0
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 #define DEFINE_GETSETOOP_VOLATILE(jboolean, Boolean) \
a61af66fc99e Initial load
duke
parents:
diff changeset
400 \
a61af66fc99e Initial load
duke
parents:
diff changeset
401 UNSAFE_ENTRY(jboolean, Unsafe_Get##Boolean##Volatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
402 UnsafeWrapper("Unsafe_Get"#Boolean); \
a61af66fc99e Initial load
duke
parents:
diff changeset
403 GET_FIELD_VOLATILE(obj, offset, jboolean, v); \
a61af66fc99e Initial load
duke
parents:
diff changeset
404 return v; \
a61af66fc99e Initial load
duke
parents:
diff changeset
405 UNSAFE_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
406 \
a61af66fc99e Initial load
duke
parents:
diff changeset
407 UNSAFE_ENTRY(void, Unsafe_Set##Boolean##Volatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jboolean x)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
408 UnsafeWrapper("Unsafe_Set"#Boolean); \
a61af66fc99e Initial load
duke
parents:
diff changeset
409 SET_FIELD_VOLATILE(obj, offset, jboolean, x); \
a61af66fc99e Initial load
duke
parents:
diff changeset
410 UNSAFE_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
411 \
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // END DEFINE_GETSETOOP_VOLATILE.
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414 DEFINE_GETSETOOP_VOLATILE(jboolean, Boolean)
a61af66fc99e Initial load
duke
parents:
diff changeset
415 DEFINE_GETSETOOP_VOLATILE(jbyte, Byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
416 DEFINE_GETSETOOP_VOLATILE(jshort, Short);
a61af66fc99e Initial load
duke
parents:
diff changeset
417 DEFINE_GETSETOOP_VOLATILE(jchar, Char);
a61af66fc99e Initial load
duke
parents:
diff changeset
418 DEFINE_GETSETOOP_VOLATILE(jint, Int);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 DEFINE_GETSETOOP_VOLATILE(jfloat, Float);
a61af66fc99e Initial load
duke
parents:
diff changeset
420 DEFINE_GETSETOOP_VOLATILE(jdouble, Double);
a61af66fc99e Initial load
duke
parents:
diff changeset
421
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
422 #if defined(SPARC) || defined(X86)
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
423 // Sparc and X86 have atomic jlong (8 bytes) instructions
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
424 DEFINE_GETSETOOP_VOLATILE(jlong, Long);
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
425 #endif
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
426
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
427 #undef DEFINE_GETSETOOP_VOLATILE
0
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // The non-intrinsified versions of setOrdered just use setVolatile
a61af66fc99e Initial load
duke
parents:
diff changeset
430
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
431 UNSAFE_ENTRY(void, Unsafe_SetOrderedInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint x))
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
432 UnsafeWrapper("Unsafe_SetOrderedInt");
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
433 SET_FIELD_VOLATILE(obj, offset, jint, x);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
434 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 UNSAFE_ENTRY(void, Unsafe_SetOrderedObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
a61af66fc99e Initial load
duke
parents:
diff changeset
437 UnsafeWrapper("Unsafe_SetOrderedObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
438 oop x = JNIHandles::resolve(x_h);
a61af66fc99e Initial load
duke
parents:
diff changeset
439 oop p = JNIHandles::resolve(obj);
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
440 void* addr = index_oop_from_field_offset_long(p, offset);
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
441 OrderAccess::release();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
442 if (UseCompressedOops) {
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
443 oop_store((narrowOop*)addr, x);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
444 } else {
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
445 oop_store((oop*)addr, x);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
446 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
447 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
448 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 UNSAFE_ENTRY(void, Unsafe_SetOrderedLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong x))
a61af66fc99e Initial load
duke
parents:
diff changeset
451 UnsafeWrapper("Unsafe_SetOrderedLong");
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
452 #if defined(SPARC) || defined(X86)
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
453 // Sparc and X86 have atomic jlong (8 bytes) instructions
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
454 SET_FIELD_VOLATILE(obj, offset, jlong, x);
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
455 #else
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
456 // Keep old code for platforms which may not have atomic long (8 bytes) instructions
0
a61af66fc99e Initial load
duke
parents:
diff changeset
457 {
a61af66fc99e Initial load
duke
parents:
diff changeset
458 if (VM_Version::supports_cx8()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 SET_FIELD_VOLATILE(obj, offset, jlong, x);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 Handle p (THREAD, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
463 jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
464 ObjectLocker ol(p, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
465 *addr = x;
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
2114
4fc084dac61e 7009756: volatile variables could be broken throw reflection API
kvn
parents: 1972
diff changeset
468 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
469 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
470
7425
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
471 UNSAFE_ENTRY(void, Unsafe_LoadFence(JNIEnv *env, jobject unsafe))
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
472 UnsafeWrapper("Unsafe_LoadFence");
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
473 OrderAccess::acquire();
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
474 UNSAFE_END
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
475
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
476 UNSAFE_ENTRY(void, Unsafe_StoreFence(JNIEnv *env, jobject unsafe))
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
477 UnsafeWrapper("Unsafe_StoreFence");
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
478 OrderAccess::release();
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
479 UNSAFE_END
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
480
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
481 UNSAFE_ENTRY(void, Unsafe_FullFence(JNIEnv *env, jobject unsafe))
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
482 UnsafeWrapper("Unsafe_FullFence");
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
483 OrderAccess::fence();
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
484 UNSAFE_END
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
485
0
a61af66fc99e Initial load
duke
parents:
diff changeset
486 ////// Data in the C heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // Note: These do not throw NullPointerException for bad pointers.
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // They just crash. Only a oop base pointer can generate a NullPointerException.
a61af66fc99e Initial load
duke
parents:
diff changeset
490 //
a61af66fc99e Initial load
duke
parents:
diff changeset
491 #define DEFINE_GETSETNATIVE(java_type, Type, native_type) \
a61af66fc99e Initial load
duke
parents:
diff changeset
492 \
a61af66fc99e Initial load
duke
parents:
diff changeset
493 UNSAFE_ENTRY(java_type, Unsafe_GetNative##Type(JNIEnv *env, jobject unsafe, jlong addr)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
494 UnsafeWrapper("Unsafe_GetNative"#Type); \
a61af66fc99e Initial load
duke
parents:
diff changeset
495 void* p = addr_from_java(addr); \
a61af66fc99e Initial load
duke
parents:
diff changeset
496 JavaThread* t = JavaThread::current(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
497 t->set_doing_unsafe_access(true); \
a61af66fc99e Initial load
duke
parents:
diff changeset
498 java_type x = *(volatile native_type*)p; \
a61af66fc99e Initial load
duke
parents:
diff changeset
499 t->set_doing_unsafe_access(false); \
a61af66fc99e Initial load
duke
parents:
diff changeset
500 return x; \
a61af66fc99e Initial load
duke
parents:
diff changeset
501 UNSAFE_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
502 \
a61af66fc99e Initial load
duke
parents:
diff changeset
503 UNSAFE_ENTRY(void, Unsafe_SetNative##Type(JNIEnv *env, jobject unsafe, jlong addr, java_type x)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
504 UnsafeWrapper("Unsafe_SetNative"#Type); \
a61af66fc99e Initial load
duke
parents:
diff changeset
505 JavaThread* t = JavaThread::current(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
506 t->set_doing_unsafe_access(true); \
a61af66fc99e Initial load
duke
parents:
diff changeset
507 void* p = addr_from_java(addr); \
a61af66fc99e Initial load
duke
parents:
diff changeset
508 *(volatile native_type*)p = x; \
a61af66fc99e Initial load
duke
parents:
diff changeset
509 t->set_doing_unsafe_access(false); \
a61af66fc99e Initial load
duke
parents:
diff changeset
510 UNSAFE_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
511 \
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // END DEFINE_GETSETNATIVE.
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 DEFINE_GETSETNATIVE(jbyte, Byte, signed char)
a61af66fc99e Initial load
duke
parents:
diff changeset
515 DEFINE_GETSETNATIVE(jshort, Short, signed short);
a61af66fc99e Initial load
duke
parents:
diff changeset
516 DEFINE_GETSETNATIVE(jchar, Char, unsigned short);
a61af66fc99e Initial load
duke
parents:
diff changeset
517 DEFINE_GETSETNATIVE(jint, Int, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // no long -- handled specially
a61af66fc99e Initial load
duke
parents:
diff changeset
519 DEFINE_GETSETNATIVE(jfloat, Float, float);
a61af66fc99e Initial load
duke
parents:
diff changeset
520 DEFINE_GETSETNATIVE(jdouble, Double, double);
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 #undef DEFINE_GETSETNATIVE
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 UNSAFE_ENTRY(jlong, Unsafe_GetNativeLong(JNIEnv *env, jobject unsafe, jlong addr))
a61af66fc99e Initial load
duke
parents:
diff changeset
525 UnsafeWrapper("Unsafe_GetNativeLong");
a61af66fc99e Initial load
duke
parents:
diff changeset
526 JavaThread* t = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // We do it this way to avoid problems with access to heap using 64
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // bit loads, as jlong in heap could be not 64-bit aligned, and on
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // some CPUs (SPARC) it leads to SIGBUS.
a61af66fc99e Initial load
duke
parents:
diff changeset
530 t->set_doing_unsafe_access(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
531 void* p = addr_from_java(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
532 jlong x;
a61af66fc99e Initial load
duke
parents:
diff changeset
533 if (((intptr_t)p & 7) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // jlong is aligned, do a volatile access
a61af66fc99e Initial load
duke
parents:
diff changeset
535 x = *(volatile jlong*)p;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 jlong_accessor acc;
a61af66fc99e Initial load
duke
parents:
diff changeset
538 acc.words[0] = ((volatile jint*)p)[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
539 acc.words[1] = ((volatile jint*)p)[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
540 x = acc.long_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
542 t->set_doing_unsafe_access(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
543 return x;
a61af66fc99e Initial load
duke
parents:
diff changeset
544 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 UNSAFE_ENTRY(void, Unsafe_SetNativeLong(JNIEnv *env, jobject unsafe, jlong addr, jlong x))
a61af66fc99e Initial load
duke
parents:
diff changeset
547 UnsafeWrapper("Unsafe_SetNativeLong");
a61af66fc99e Initial load
duke
parents:
diff changeset
548 JavaThread* t = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // see comment for Unsafe_GetNativeLong
a61af66fc99e Initial load
duke
parents:
diff changeset
550 t->set_doing_unsafe_access(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
551 void* p = addr_from_java(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
552 if (((intptr_t)p & 7) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // jlong is aligned, do a volatile access
a61af66fc99e Initial load
duke
parents:
diff changeset
554 *(volatile jlong*)p = x;
a61af66fc99e Initial load
duke
parents:
diff changeset
555 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
556 jlong_accessor acc;
a61af66fc99e Initial load
duke
parents:
diff changeset
557 acc.long_value = x;
a61af66fc99e Initial load
duke
parents:
diff changeset
558 ((volatile jint*)p)[0] = acc.words[0];
a61af66fc99e Initial load
duke
parents:
diff changeset
559 ((volatile jint*)p)[1] = acc.words[1];
a61af66fc99e Initial load
duke
parents:
diff changeset
560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
561 t->set_doing_unsafe_access(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
562 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564
a61af66fc99e Initial load
duke
parents:
diff changeset
565 UNSAFE_ENTRY(jlong, Unsafe_GetNativeAddress(JNIEnv *env, jobject unsafe, jlong addr))
a61af66fc99e Initial load
duke
parents:
diff changeset
566 UnsafeWrapper("Unsafe_GetNativeAddress");
a61af66fc99e Initial load
duke
parents:
diff changeset
567 void* p = addr_from_java(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
568 return addr_to_java(*(void**)p);
a61af66fc99e Initial load
duke
parents:
diff changeset
569 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 UNSAFE_ENTRY(void, Unsafe_SetNativeAddress(JNIEnv *env, jobject unsafe, jlong addr, jlong x))
a61af66fc99e Initial load
duke
parents:
diff changeset
572 UnsafeWrapper("Unsafe_SetNativeAddress");
a61af66fc99e Initial load
duke
parents:
diff changeset
573 void* p = addr_from_java(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
574 *(void**)p = addr_from_java(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
575 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578 ////// Allocation requests
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 UNSAFE_ENTRY(jobject, Unsafe_AllocateInstance(JNIEnv *env, jobject unsafe, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
581 UnsafeWrapper("Unsafe_AllocateInstance");
a61af66fc99e Initial load
duke
parents:
diff changeset
582 {
a61af66fc99e Initial load
duke
parents:
diff changeset
583 ThreadToNativeFromVM ttnfv(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
584 return env->AllocObject(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
586 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 UNSAFE_ENTRY(jlong, Unsafe_AllocateMemory(JNIEnv *env, jobject unsafe, jlong size))
a61af66fc99e Initial load
duke
parents:
diff changeset
589 UnsafeWrapper("Unsafe_AllocateMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
590 size_t sz = (size_t)size;
a61af66fc99e Initial load
duke
parents:
diff changeset
591 if (sz != (julong)size || size < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
592 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594 if (sz == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
595 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
597 sz = round_to(sz, HeapWordSize);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4043
diff changeset
598 void* x = os::malloc(sz, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
599 if (x == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
600 THROW_0(vmSymbols::java_lang_OutOfMemoryError());
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602 //Copy::fill_to_words((HeapWord*)x, sz / HeapWordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
603 return addr_to_java(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
604 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
605
a61af66fc99e Initial load
duke
parents:
diff changeset
606 UNSAFE_ENTRY(jlong, Unsafe_ReallocateMemory(JNIEnv *env, jobject unsafe, jlong addr, jlong size))
a61af66fc99e Initial load
duke
parents:
diff changeset
607 UnsafeWrapper("Unsafe_ReallocateMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
608 void* p = addr_from_java(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
609 size_t sz = (size_t)size;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 if (sz != (julong)size || size < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
611 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
a61af66fc99e Initial load
duke
parents:
diff changeset
612 }
a61af66fc99e Initial load
duke
parents:
diff changeset
613 if (sz == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
614 os::free(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
615 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617 sz = round_to(sz, HeapWordSize);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4043
diff changeset
618 void* x = (p == NULL) ? os::malloc(sz, mtInternal) : os::realloc(p, sz, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
619 if (x == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
620 THROW_0(vmSymbols::java_lang_OutOfMemoryError());
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622 return addr_to_java(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
623 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625 UNSAFE_ENTRY(void, Unsafe_FreeMemory(JNIEnv *env, jobject unsafe, jlong addr))
a61af66fc99e Initial load
duke
parents:
diff changeset
626 UnsafeWrapper("Unsafe_FreeMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
627 void* p = addr_from_java(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
628 if (p == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
629 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
631 os::free(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
632 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 UNSAFE_ENTRY(void, Unsafe_SetMemory(JNIEnv *env, jobject unsafe, jlong addr, jlong size, jbyte value))
a61af66fc99e Initial load
duke
parents:
diff changeset
635 UnsafeWrapper("Unsafe_SetMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
636 size_t sz = (size_t)size;
a61af66fc99e Initial load
duke
parents:
diff changeset
637 if (sz != (julong)size || size < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
638 THROW(vmSymbols::java_lang_IllegalArgumentException());
a61af66fc99e Initial load
duke
parents:
diff changeset
639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
640 char* p = (char*) addr_from_java(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
641 Copy::fill_to_memory_atomic(p, sz, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
642 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 UNSAFE_ENTRY(void, Unsafe_SetMemory2(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong size, jbyte value))
a61af66fc99e Initial load
duke
parents:
diff changeset
645 UnsafeWrapper("Unsafe_SetMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
646 size_t sz = (size_t)size;
a61af66fc99e Initial load
duke
parents:
diff changeset
647 if (sz != (julong)size || size < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
648 THROW(vmSymbols::java_lang_IllegalArgumentException());
a61af66fc99e Initial load
duke
parents:
diff changeset
649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
650 oop base = JNIHandles::resolve(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
651 void* p = index_oop_from_field_offset_long(base, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
652 Copy::fill_to_memory_atomic(p, sz, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
653 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 UNSAFE_ENTRY(void, Unsafe_CopyMemory(JNIEnv *env, jobject unsafe, jlong srcAddr, jlong dstAddr, jlong size))
a61af66fc99e Initial load
duke
parents:
diff changeset
656 UnsafeWrapper("Unsafe_CopyMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
657 if (size == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660 size_t sz = (size_t)size;
a61af66fc99e Initial load
duke
parents:
diff changeset
661 if (sz != (julong)size || size < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 THROW(vmSymbols::java_lang_IllegalArgumentException());
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664 void* src = addr_from_java(srcAddr);
a61af66fc99e Initial load
duke
parents:
diff changeset
665 void* dst = addr_from_java(dstAddr);
a61af66fc99e Initial load
duke
parents:
diff changeset
666 Copy::conjoint_memory_atomic(src, dst, sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
667 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
668
a61af66fc99e Initial load
duke
parents:
diff changeset
669 UNSAFE_ENTRY(void, Unsafe_CopyMemory2(JNIEnv *env, jobject unsafe, jobject srcObj, jlong srcOffset, jobject dstObj, jlong dstOffset, jlong size))
a61af66fc99e Initial load
duke
parents:
diff changeset
670 UnsafeWrapper("Unsafe_CopyMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
671 if (size == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
672 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
674 size_t sz = (size_t)size;
a61af66fc99e Initial load
duke
parents:
diff changeset
675 if (sz != (julong)size || size < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
676 THROW(vmSymbols::java_lang_IllegalArgumentException());
a61af66fc99e Initial load
duke
parents:
diff changeset
677 }
a61af66fc99e Initial load
duke
parents:
diff changeset
678 oop srcp = JNIHandles::resolve(srcObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 oop dstp = JNIHandles::resolve(dstObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
680 if (dstp != NULL && !dstp->is_typeArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // NYI: This works only for non-oop arrays at present.
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // Generalizing it would be reasonable, but requires card marking.
a61af66fc99e Initial load
duke
parents:
diff changeset
683 // Also, autoboxing a Long from 0L in copyMemory(x,y, 0L,z, n) would be bad.
a61af66fc99e Initial load
duke
parents:
diff changeset
684 THROW(vmSymbols::java_lang_IllegalArgumentException());
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686 void* src = index_oop_from_field_offset_long(srcp, srcOffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
687 void* dst = index_oop_from_field_offset_long(dstp, dstOffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
688 Copy::conjoint_memory_atomic(src, dst, sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
689 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 ////// Random queries
a61af66fc99e Initial load
duke
parents:
diff changeset
693
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // See comment at file start about UNSAFE_LEAF
a61af66fc99e Initial load
duke
parents:
diff changeset
695 //UNSAFE_LEAF(jint, Unsafe_AddressSize())
a61af66fc99e Initial load
duke
parents:
diff changeset
696 UNSAFE_ENTRY(jint, Unsafe_AddressSize(JNIEnv *env, jobject unsafe))
a61af66fc99e Initial load
duke
parents:
diff changeset
697 UnsafeWrapper("Unsafe_AddressSize");
a61af66fc99e Initial load
duke
parents:
diff changeset
698 return sizeof(void*);
a61af66fc99e Initial load
duke
parents:
diff changeset
699 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
700
a61af66fc99e Initial load
duke
parents:
diff changeset
701 // See comment at file start about UNSAFE_LEAF
a61af66fc99e Initial load
duke
parents:
diff changeset
702 //UNSAFE_LEAF(jint, Unsafe_PageSize())
a61af66fc99e Initial load
duke
parents:
diff changeset
703 UNSAFE_ENTRY(jint, Unsafe_PageSize(JNIEnv *env, jobject unsafe))
a61af66fc99e Initial load
duke
parents:
diff changeset
704 UnsafeWrapper("Unsafe_PageSize");
a61af66fc99e Initial load
duke
parents:
diff changeset
705 return os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
706 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
707
a61af66fc99e Initial load
duke
parents:
diff changeset
708 jint find_field_offset(jobject field, int must_be_static, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
709 if (field == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
710 THROW_0(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
711 }
a61af66fc99e Initial load
duke
parents:
diff changeset
712
a61af66fc99e Initial load
duke
parents:
diff changeset
713 oop reflected = JNIHandles::resolve_non_null(field);
a61af66fc99e Initial load
duke
parents:
diff changeset
714 oop mirror = java_lang_reflect_Field::clazz(reflected);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
715 Klass* k = java_lang_Class::as_Klass(mirror);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
716 int slot = java_lang_reflect_Field::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
717 int modifiers = java_lang_reflect_Field::modifiers(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 if (must_be_static >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
720 int really_is_static = ((modifiers & JVM_ACC_STATIC) != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 if (must_be_static != really_is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
722 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
a61af66fc99e Initial load
duke
parents:
diff changeset
723 }
a61af66fc99e Initial load
duke
parents:
diff changeset
724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
725
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
726 int offset = InstanceKlass::cast(k)->field_offset(slot);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
727 return field_offset_from_byte_offset(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 UNSAFE_ENTRY(jlong, Unsafe_ObjectFieldOffset(JNIEnv *env, jobject unsafe, jobject field))
a61af66fc99e Initial load
duke
parents:
diff changeset
731 UnsafeWrapper("Unsafe_ObjectFieldOffset");
a61af66fc99e Initial load
duke
parents:
diff changeset
732 return find_field_offset(field, 0, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
733 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
734
a61af66fc99e Initial load
duke
parents:
diff changeset
735 UNSAFE_ENTRY(jlong, Unsafe_StaticFieldOffset(JNIEnv *env, jobject unsafe, jobject field))
a61af66fc99e Initial load
duke
parents:
diff changeset
736 UnsafeWrapper("Unsafe_StaticFieldOffset");
a61af66fc99e Initial load
duke
parents:
diff changeset
737 return find_field_offset(field, 1, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
738 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
739
a61af66fc99e Initial load
duke
parents:
diff changeset
740 UNSAFE_ENTRY(jobject, Unsafe_StaticFieldBaseFromField(JNIEnv *env, jobject unsafe, jobject field))
a61af66fc99e Initial load
duke
parents:
diff changeset
741 UnsafeWrapper("Unsafe_StaticFieldBase");
a61af66fc99e Initial load
duke
parents:
diff changeset
742 // Note: In this VM implementation, a field address is always a short
a61af66fc99e Initial load
duke
parents:
diff changeset
743 // offset from the base of a a klass metaobject. Thus, the full dynamic
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // range of the return type is never used. However, some implementations
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // might put the static field inside an array shared by many classes,
a61af66fc99e Initial load
duke
parents:
diff changeset
746 // or even at a fixed address, in which case the address could be quite
a61af66fc99e Initial load
duke
parents:
diff changeset
747 // large. In that last case, this function would return NULL, since
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // the address would operate alone, without any base pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
749
a61af66fc99e Initial load
duke
parents:
diff changeset
750 if (field == NULL) THROW_0(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
751
a61af66fc99e Initial load
duke
parents:
diff changeset
752 oop reflected = JNIHandles::resolve_non_null(field);
a61af66fc99e Initial load
duke
parents:
diff changeset
753 oop mirror = java_lang_reflect_Field::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
754 int modifiers = java_lang_reflect_Field::modifiers(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
755
a61af66fc99e Initial load
duke
parents:
diff changeset
756 if ((modifiers & JVM_ACC_STATIC) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
757 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
a61af66fc99e Initial load
duke
parents:
diff changeset
758 }
a61af66fc99e Initial load
duke
parents:
diff changeset
759
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2316
diff changeset
760 return JNIHandles::make_local(env, mirror);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
761 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 //@deprecated
a61af66fc99e Initial load
duke
parents:
diff changeset
764 UNSAFE_ENTRY(jint, Unsafe_FieldOffset(JNIEnv *env, jobject unsafe, jobject field))
a61af66fc99e Initial load
duke
parents:
diff changeset
765 UnsafeWrapper("Unsafe_FieldOffset");
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // tries (but fails) to be polymorphic between static and non-static:
a61af66fc99e Initial load
duke
parents:
diff changeset
767 jlong offset = find_field_offset(field, -1, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
768 guarantee(offset == (jint)offset, "offset fits in 32 bits");
a61af66fc99e Initial load
duke
parents:
diff changeset
769 return (jint)offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
771
a61af66fc99e Initial load
duke
parents:
diff changeset
772 //@deprecated
a61af66fc99e Initial load
duke
parents:
diff changeset
773 UNSAFE_ENTRY(jobject, Unsafe_StaticFieldBaseFromClass(JNIEnv *env, jobject unsafe, jobject clazz))
a61af66fc99e Initial load
duke
parents:
diff changeset
774 UnsafeWrapper("Unsafe_StaticFieldBase");
a61af66fc99e Initial load
duke
parents:
diff changeset
775 if (clazz == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
776 THROW_0(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
777 }
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2316
diff changeset
778 return JNIHandles::make_local(env, JNIHandles::resolve_non_null(clazz));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
779 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
780
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
781 UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
782 UnsafeWrapper("Unsafe_EnsureClassInitialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
783 if (clazz == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
784 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
785 }
a61af66fc99e Initial load
duke
parents:
diff changeset
786 oop mirror = JNIHandles::resolve_non_null(clazz);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
787
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
788 Klass* klass = java_lang_Class::as_Klass(mirror);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6889
diff changeset
789 if (klass != NULL && klass->should_be_initialized()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
790 InstanceKlass* k = InstanceKlass::cast(klass);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
791 k->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
792 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
793 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
794 UNSAFE_END
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
795
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
796 UNSAFE_ENTRY(jboolean, Unsafe_ShouldBeInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
797 UnsafeWrapper("Unsafe_ShouldBeInitialized");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
798 if (clazz == NULL) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
799 THROW_(vmSymbols::java_lang_NullPointerException(), false);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
800 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
801 oop mirror = JNIHandles::resolve_non_null(clazz);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
802 Klass* klass = java_lang_Class::as_Klass(mirror);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6889
diff changeset
803 if (klass != NULL && klass->should_be_initialized()) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
804 return true;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
805 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
806 return false;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
807 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
808 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 static void getBaseAndScale(int& base, int& scale, jclass acls, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
811 if (acls == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
812 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
813 }
a61af66fc99e Initial load
duke
parents:
diff changeset
814 oop mirror = JNIHandles::resolve_non_null(acls);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
815 Klass* k = java_lang_Class::as_Klass(mirror);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
816 if (k == NULL || !k->oop_is_array()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
817 THROW(vmSymbols::java_lang_InvalidClassException());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
818 } else if (k->oop_is_objArray()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
819 base = arrayOopDesc::base_offset_in_bytes(T_OBJECT);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
820 scale = heapOopSize;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
821 } else if (k->oop_is_typeArray()) {
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
822 TypeArrayKlass* tak = TypeArrayKlass::cast(k);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
823 base = tak->array_header_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
824 assert(base == arrayOopDesc::base_offset_in_bytes(tak->element_type()), "array_header_size semantics ok");
a61af66fc99e Initial load
duke
parents:
diff changeset
825 scale = (1 << tak->log2_element_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
826 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
827 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 UNSAFE_ENTRY(jint, Unsafe_ArrayBaseOffset(JNIEnv *env, jobject unsafe, jclass acls))
a61af66fc99e Initial load
duke
parents:
diff changeset
832 UnsafeWrapper("Unsafe_ArrayBaseOffset");
a61af66fc99e Initial load
duke
parents:
diff changeset
833 int base, scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
834 getBaseAndScale(base, scale, acls, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
835 return field_offset_from_byte_offset(base);
a61af66fc99e Initial load
duke
parents:
diff changeset
836 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838
a61af66fc99e Initial load
duke
parents:
diff changeset
839 UNSAFE_ENTRY(jint, Unsafe_ArrayIndexScale(JNIEnv *env, jobject unsafe, jclass acls))
a61af66fc99e Initial load
duke
parents:
diff changeset
840 UnsafeWrapper("Unsafe_ArrayIndexScale");
a61af66fc99e Initial load
duke
parents:
diff changeset
841 int base, scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
842 getBaseAndScale(base, scale, acls, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // This VM packs both fields and array elements down to the byte.
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // But watch out: If this changes, so that array references for
a61af66fc99e Initial load
duke
parents:
diff changeset
845 // a given primitive type (say, T_BOOLEAN) use different memory units
a61af66fc99e Initial load
duke
parents:
diff changeset
846 // than fields, this method MUST return zero for such arrays.
a61af66fc99e Initial load
duke
parents:
diff changeset
847 // For example, the VM used to store sub-word sized fields in full
a61af66fc99e Initial load
duke
parents:
diff changeset
848 // words in the object layout, so that accessors like getByte(Object,int)
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // did not really do what one might expect for arrays. Therefore,
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // this function used to report a zero scale factor, so that the user
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // would know not to attempt to access sub-word array elements.
a61af66fc99e Initial load
duke
parents:
diff changeset
852 // // Code for unpacked fields:
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // if (scale < wordSize) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
854
a61af66fc99e Initial load
duke
parents:
diff changeset
855 // The following allows for a pretty general fieldOffset cookie scheme,
a61af66fc99e Initial load
duke
parents:
diff changeset
856 // but requires it to be linear in byte offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
857 return field_offset_from_byte_offset(scale) - field_offset_from_byte_offset(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
859
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 static inline void throw_new(JNIEnv *env, const char *ename) {
a61af66fc99e Initial load
duke
parents:
diff changeset
862 char buf[100];
a61af66fc99e Initial load
duke
parents:
diff changeset
863 strcpy(buf, "java/lang/");
a61af66fc99e Initial load
duke
parents:
diff changeset
864 strcat(buf, ename);
a61af66fc99e Initial load
duke
parents:
diff changeset
865 jclass cls = env->FindClass(buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
866 char* msg = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
867 env->ThrowNew(cls, msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
868 }
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 static jclass Unsafe_DefineClass(JNIEnv *env, jstring name, jbyteArray data, int offset, int length, jobject loader, jobject pd) {
a61af66fc99e Initial load
duke
parents:
diff changeset
871 {
a61af66fc99e Initial load
duke
parents:
diff changeset
872 // Code lifted from JDK 1.3 ClassLoader.c
a61af66fc99e Initial load
duke
parents:
diff changeset
873
a61af66fc99e Initial load
duke
parents:
diff changeset
874 jbyte *body;
a61af66fc99e Initial load
duke
parents:
diff changeset
875 char *utfName;
a61af66fc99e Initial load
duke
parents:
diff changeset
876 jclass result = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
877 char buf[128];
a61af66fc99e Initial load
duke
parents:
diff changeset
878
a61af66fc99e Initial load
duke
parents:
diff changeset
879 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
880 ClassLoader::unsafe_defineClassCallCounter()->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
881 }
a61af66fc99e Initial load
duke
parents:
diff changeset
882
a61af66fc99e Initial load
duke
parents:
diff changeset
883 if (data == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
884 throw_new(env, "NullPointerException");
a61af66fc99e Initial load
duke
parents:
diff changeset
885 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
887
a61af66fc99e Initial load
duke
parents:
diff changeset
888 /* Work around 4153825. malloc crashes on Solaris when passed a
a61af66fc99e Initial load
duke
parents:
diff changeset
889 * negative size.
a61af66fc99e Initial load
duke
parents:
diff changeset
890 */
a61af66fc99e Initial load
duke
parents:
diff changeset
891 if (length < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
892 throw_new(env, "ArrayIndexOutOfBoundsException");
a61af66fc99e Initial load
duke
parents:
diff changeset
893 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
894 }
a61af66fc99e Initial load
duke
parents:
diff changeset
895
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4043
diff changeset
896 body = NEW_C_HEAP_ARRAY(jbyte, length, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 if (body == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
899 throw_new(env, "OutOfMemoryError");
a61af66fc99e Initial load
duke
parents:
diff changeset
900 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
902
a61af66fc99e Initial load
duke
parents:
diff changeset
903 env->GetByteArrayRegion(data, offset, length, body);
a61af66fc99e Initial load
duke
parents:
diff changeset
904
a61af66fc99e Initial load
duke
parents:
diff changeset
905 if (env->ExceptionOccurred())
a61af66fc99e Initial load
duke
parents:
diff changeset
906 goto free_body;
a61af66fc99e Initial load
duke
parents:
diff changeset
907
a61af66fc99e Initial load
duke
parents:
diff changeset
908 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
909 uint len = env->GetStringUTFLength(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 int unicode_len = env->GetStringLength(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
911 if (len >= sizeof(buf)) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4043
diff changeset
912 utfName = NEW_C_HEAP_ARRAY(char, len + 1, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
913 if (utfName == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
914 throw_new(env, "OutOfMemoryError");
a61af66fc99e Initial load
duke
parents:
diff changeset
915 goto free_body;
a61af66fc99e Initial load
duke
parents:
diff changeset
916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
917 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
918 utfName = buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
919 }
a61af66fc99e Initial load
duke
parents:
diff changeset
920 env->GetStringUTFRegion(name, 0, unicode_len, utfName);
a61af66fc99e Initial load
duke
parents:
diff changeset
921 //VerifyFixClassname(utfName);
a61af66fc99e Initial load
duke
parents:
diff changeset
922 for (uint i = 0; i < len; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
923 if (utfName[i] == '.') utfName[i] = '/';
a61af66fc99e Initial load
duke
parents:
diff changeset
924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
925 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
926 utfName = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
927 }
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929 result = JVM_DefineClass(env, utfName, loader, body, length, pd);
a61af66fc99e Initial load
duke
parents:
diff changeset
930
a61af66fc99e Initial load
duke
parents:
diff changeset
931 if (utfName && utfName != buf)
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4043
diff changeset
932 FREE_C_HEAP_ARRAY(char, utfName, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
933
a61af66fc99e Initial load
duke
parents:
diff changeset
934 free_body:
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4043
diff changeset
935 FREE_C_HEAP_ARRAY(jbyte, body, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
936 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
937 }
a61af66fc99e Initial load
duke
parents:
diff changeset
938 }
a61af66fc99e Initial load
duke
parents:
diff changeset
939
a61af66fc99e Initial load
duke
parents:
diff changeset
940
a61af66fc99e Initial load
duke
parents:
diff changeset
941 UNSAFE_ENTRY(jclass, Unsafe_DefineClass0(JNIEnv *env, jobject unsafe, jstring name, jbyteArray data, int offset, int length))
a61af66fc99e Initial load
duke
parents:
diff changeset
942 UnsafeWrapper("Unsafe_DefineClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
943 {
a61af66fc99e Initial load
duke
parents:
diff changeset
944 ThreadToNativeFromVM ttnfv(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
945
a61af66fc99e Initial load
duke
parents:
diff changeset
946 int depthFromDefineClass0 = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
947 jclass caller = JVM_GetCallerClass(env, depthFromDefineClass0);
a61af66fc99e Initial load
duke
parents:
diff changeset
948 jobject loader = (caller == NULL) ? NULL : JVM_GetClassLoader(env, caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
949 jobject pd = (caller == NULL) ? NULL : JVM_GetProtectionDomain(env, caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
950
a61af66fc99e Initial load
duke
parents:
diff changeset
951 return Unsafe_DefineClass(env, name, data, offset, length, loader, pd);
a61af66fc99e Initial load
duke
parents:
diff changeset
952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
953 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
954
a61af66fc99e Initial load
duke
parents:
diff changeset
955
a61af66fc99e Initial load
duke
parents:
diff changeset
956 UNSAFE_ENTRY(jclass, Unsafe_DefineClass1(JNIEnv *env, jobject unsafe, jstring name, jbyteArray data, int offset, int length, jobject loader, jobject pd))
a61af66fc99e Initial load
duke
parents:
diff changeset
957 UnsafeWrapper("Unsafe_DefineClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
958 {
a61af66fc99e Initial load
duke
parents:
diff changeset
959 ThreadToNativeFromVM ttnfv(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
960
a61af66fc99e Initial load
duke
parents:
diff changeset
961 return Unsafe_DefineClass(env, name, data, offset, length, loader, pd);
a61af66fc99e Initial load
duke
parents:
diff changeset
962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
963 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
964
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
965 #define DAC_Args CLS"[B["OBJ
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
966 // define a class but do not make it known to the class loader or system dictionary
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
967 // - host_class: supplies context for linkage, access control, protection domain, and class loader
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
968 // - data: bytes of a class file, a raw memory address (length gives the number of bytes)
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
969 // - cp_patches: where non-null entries exist, they replace corresponding CP entries in data
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
970
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
971 // When you load an anonymous class U, it works as if you changed its name just before loading,
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
972 // to a name that you will never use again. Since the name is lost, no other class can directly
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
973 // link to any member of U. Just after U is loaded, the only way to use it is reflectively,
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
974 // through java.lang.Class methods like Class.newInstance.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
975
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
976 // Access checks for linkage sites within U continue to follow the same rules as for named classes.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
977 // The package of an anonymous class is given by the package qualifier on the name under which it was loaded.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
978 // An anonymous class also has special privileges to access any member of its host class.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
979 // This is the main reason why this loading operation is unsafe. The purpose of this is to
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
980 // allow language implementations to simulate "open classes"; a host class in effect gets
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
981 // new code when an anonymous class is loaded alongside it. A less convenient but more
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
982 // standard way to do this is with reflection, which can also be set to ignore access
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
983 // restrictions.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
984
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
985 // Access into an anonymous class is possible only through reflection. Therefore, there
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
986 // are no special access rules for calling into an anonymous class. The relaxed access
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
987 // rule for the host class is applied in the opposite direction: A host class reflectively
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
988 // access one of its anonymous classes.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
989
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
990 // If you load the same bytecodes twice, you get two different classes. You can reload
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
991 // the same bytecodes with or without varying CP patches.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
992
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
993 // By using the CP patching array, you can have a new anonymous class U2 refer to an older one U1.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
994 // The bytecodes for U2 should refer to U1 by a symbolic name (doesn't matter what the name is).
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
995 // The CONSTANT_Class entry for that name can be patched to refer directly to U1.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
996
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
997 // This allows, for example, U2 to use U1 as a superclass or super-interface, or as
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
998 // an outer class (so that U2 is an anonymous inner class of anonymous U1).
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
999 // It is not possible for a named class, or an older anonymous class, to refer by
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1000 // name (via its CP) to a newer anonymous class.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1001
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1002 // CP patching may also be used to modify (i.e., hack) the names of methods, classes,
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1003 // or type descriptors used in the loaded anonymous class.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1004
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1005 // Finally, CP patching may be used to introduce "live" objects into the constant pool,
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1006 // instead of "dead" strings. A compiled statement like println((Object)"hello") can
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1007 // be changed to println(greeting), where greeting is an arbitrary object created before
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1008 // the anonymous class is loaded. This is useful in dynamic languages, in which
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1009 // various kinds of metaobjects must be introduced as constants into bytecode.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1010 // Note the cast (Object), which tells the verifier to expect an arbitrary object,
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1011 // not just a literal string. For such ldc instructions, the verifier uses the
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1012 // type Object instead of String, if the loaded constant is not in fact a String.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1013
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1014 static instanceKlassHandle
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1015 Unsafe_DefineAnonymousClass_impl(JNIEnv *env,
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1016 jclass host_class, jbyteArray data, jobjectArray cp_patches_jh,
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1017 HeapWord* *temp_alloc,
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1018 TRAPS) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1019
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1020 if (UsePerfData) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1021 ClassLoader::unsafe_defineClassCallCounter()->inc();
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1022 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1023
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1024 if (data == NULL) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1025 THROW_0(vmSymbols::java_lang_NullPointerException());
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1026 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1027
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1028 jint length = typeArrayOop(JNIHandles::resolve_non_null(data))->length();
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1029 jint word_length = (length + sizeof(HeapWord)-1) / sizeof(HeapWord);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4043
diff changeset
1030 HeapWord* body = NEW_C_HEAP_ARRAY(HeapWord, word_length, mtInternal);
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1031 if (body == NULL) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1032 THROW_0(vmSymbols::java_lang_OutOfMemoryError());
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1033 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1034
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1035 // caller responsible to free it:
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1036 (*temp_alloc) = body;
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1037
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1038 {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1039 jbyte* array_base = typeArrayOop(JNIHandles::resolve_non_null(data))->byte_at_addr(0);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1040 Copy::conjoint_words((HeapWord*) array_base, body, word_length);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1041 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1042
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1043 u1* class_bytes = (u1*) body;
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1044 int class_bytes_length = (int) length;
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1045 if (class_bytes_length < 0) class_bytes_length = 0;
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1046 if (class_bytes == NULL
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1047 || host_class == NULL
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1048 || length != class_bytes_length)
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1049 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1050
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1051 objArrayHandle cp_patches_h;
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1052 if (cp_patches_jh != NULL) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1053 oop p = JNIHandles::resolve_non_null(cp_patches_jh);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1054 if (!p->is_objArray())
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1055 THROW_0(vmSymbols::java_lang_IllegalArgumentException());
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1056 cp_patches_h = objArrayHandle(THREAD, (objArrayOop)p);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1057 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1058
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1059 KlassHandle host_klass(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(host_class)));
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1060 const char* host_source = host_klass->external_name();
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1061 Handle host_loader(THREAD, host_klass->class_loader());
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1062 Handle host_domain(THREAD, host_klass->protection_domain());
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1063
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1064 GrowableArray<Handle>* cp_patches = NULL;
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1065 if (cp_patches_h.not_null()) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1066 int alen = cp_patches_h->length();
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1067 for (int i = alen-1; i >= 0; i--) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1068 oop p = cp_patches_h->obj_at(i);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1069 if (p != NULL) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1070 Handle patch(THREAD, p);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1071 if (cp_patches == NULL)
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1072 cp_patches = new GrowableArray<Handle>(i+1, i+1, Handle());
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1073 cp_patches->at_put(i, patch);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1074 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1075 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1076 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1077
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1078 ClassFileStream st(class_bytes, class_bytes_length, (char*) host_source);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1079
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1080 instanceKlassHandle anon_klass;
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1081 {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2114
diff changeset
1082 Symbol* no_class_name = NULL;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1083 Klass* anonk = SystemDictionary::parse_stream(no_class_name,
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1084 host_loader, host_domain,
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1085 &st, host_klass, cp_patches,
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1086 CHECK_NULL);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1087 if (anonk == NULL) return NULL;
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1088 anon_klass = instanceKlassHandle(THREAD, anonk);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1089 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1090
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1091 return anon_klass;
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1092 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1093
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1094 UNSAFE_ENTRY(jclass, Unsafe_DefineAnonymousClass(JNIEnv *env, jobject unsafe, jclass host_class, jbyteArray data, jobjectArray cp_patches_jh))
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1095 {
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1096 instanceKlassHandle anon_klass;
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1097 jobject res_jh = NULL;
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1098
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1099 UnsafeWrapper("Unsafe_DefineAnonymousClass");
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1100 ResourceMark rm(THREAD);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1101
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1102 HeapWord* temp_alloc = NULL;
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1103
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1104 anon_klass = Unsafe_DefineAnonymousClass_impl(env, host_class, data,
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1105 cp_patches_jh,
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1106 &temp_alloc, THREAD);
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1107 if (anon_klass() != NULL)
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1108 res_jh = JNIHandles::make_local(env, anon_klass->java_mirror());
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1109
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1110 // try/finally clause:
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1111 if (temp_alloc != NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4043
diff changeset
1112 FREE_C_HEAP_ARRAY(HeapWord, temp_alloc, mtInternal);
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1113 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1114
7185
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1115 // The anonymous class loader data has been artificially been kept alive to
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1116 // this point. The mirror and any instances of this class have to keep
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1117 // it alive afterwards.
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1118 if (anon_klass() != NULL) {
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1119 anon_klass->class_loader_data()->set_keep_alive(false);
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1120 }
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1121
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1122 // let caller initialize it as needed...
90273fc0a981 8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents: 6983
diff changeset
1123
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1124 return (jclass) res_jh;
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1125 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1126 UNSAFE_END
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1127
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1128
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1129
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 UNSAFE_ENTRY(void, Unsafe_MonitorEnter(JNIEnv *env, jobject unsafe, jobject jobj))
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 UnsafeWrapper("Unsafe_MonitorEnter");
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 if (jobj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 Handle obj(thread, JNIHandles::resolve_non_null(jobj));
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 ObjectSynchronizer::jni_enter(obj, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1140
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 UNSAFE_ENTRY(jboolean, Unsafe_TryMonitorEnter(JNIEnv *env, jobject unsafe, jobject jobj))
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 UnsafeWrapper("Unsafe_TryMonitorEnter");
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 if (jobj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 Handle obj(thread, JNIHandles::resolve_non_null(jobj));
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 bool res = ObjectSynchronizer::jni_try_enter(obj, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 return (res ? JNI_TRUE : JNI_FALSE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1153
a61af66fc99e Initial load
duke
parents:
diff changeset
1154
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 UNSAFE_ENTRY(void, Unsafe_MonitorExit(JNIEnv *env, jobject unsafe, jobject jobj))
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 UnsafeWrapper("Unsafe_MonitorExit");
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 if (jobj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 Handle obj(THREAD, JNIHandles::resolve_non_null(jobj));
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 ObjectSynchronizer::jni_exit(obj(), CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1165
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 UNSAFE_ENTRY(void, Unsafe_ThrowException(JNIEnv *env, jobject unsafe, jthrowable thr))
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 UnsafeWrapper("Unsafe_ThrowException");
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 ThreadToNativeFromVM ttnfv(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 env->Throw(thr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1174
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 // JSR166 ------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1176
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h))
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 UnsafeWrapper("Unsafe_CompareAndSwapObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 oop x = JNIHandles::resolve(x_h);
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 oop e = JNIHandles::resolve(e_h);
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 oop p = JNIHandles::resolve(obj);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1182 HeapWord* addr = (HeapWord *)index_oop_from_field_offset_long(p, offset);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1183 oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e, true);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1184 jboolean success = (res == e);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 if (success)
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
1186 update_barrier_set((void*)addr, x);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 return success;
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1189
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x))
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 UnsafeWrapper("Unsafe_CompareAndSwapInt");
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 oop p = JNIHandles::resolve(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 jint* addr = (jint *) index_oop_from_field_offset_long(p, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 return (jint)(Atomic::cmpxchg(x, addr, e)) == e;
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x))
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 UnsafeWrapper("Unsafe_CompareAndSwapLong");
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 Handle p (THREAD, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 jlong* addr = (jlong*)(index_oop_from_field_offset_long(p(), offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 if (VM_Version::supports_cx8())
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 return (jlong)(Atomic::cmpxchg(x, addr, e)) == e;
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 jboolean success = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 ObjectLocker ol(p, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 if (*addr == e) { *addr = x; success = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 return success;
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1210
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 UNSAFE_ENTRY(void, Unsafe_Park(JNIEnv *env, jobject unsafe, jboolean isAbsolute, jlong time))
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 UnsafeWrapper("Unsafe_Park");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1213 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 845
diff changeset
1214 HS_DTRACE_PROBE3(hotspot, thread__park__begin, thread->parker(), (int) isAbsolute, time);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1215 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1216 HOTSPOT_THREAD_PARK_BEGIN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1217 (uintptr_t) thread->parker(), (int) isAbsolute, time);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1218 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 JavaThreadParkedState jtps(thread, time != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 thread->parker()->park(isAbsolute != 0, time);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1221 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 845
diff changeset
1222 HS_DTRACE_PROBE1(hotspot, thread__park__end, thread->parker());
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1223 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1224 HOTSPOT_THREAD_PARK_END(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1225 (uintptr_t) thread->parker());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1226 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1228
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 UNSAFE_ENTRY(void, Unsafe_Unpark(JNIEnv *env, jobject unsafe, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 UnsafeWrapper("Unsafe_Unpark");
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 Parker* p = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 if (jthread != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 if (java_thread != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 jlong lp = java_lang_Thread::park_event(java_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 if (lp != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 // This cast is OK even though the jlong might have been read
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 // non-atomically on 32bit systems, since there, one word will
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 // always be zero anyway and the value set is always the same
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 p = (Parker*)addr_from_java(lp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 // Grab lock if apparently null or using older version of library
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 if (java_thread != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 JavaThread* thr = java_lang_Thread::thread(java_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 if (thr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 p = thr->parker();
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 if (p != NULL) { // Bind to Java thread for next time.
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 java_lang_Thread::set_park_event(java_thread, addr_to_java(p));
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 if (p != NULL) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1258 #ifndef USDT2
1324
e392695de029 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 845
diff changeset
1259 HS_DTRACE_PROBE1(hotspot, thread__unpark, p);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1260 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1261 HOTSPOT_THREAD_UNPARK(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1262 (uintptr_t) p);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3938
diff changeset
1263 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 p->unpark();
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1267
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 UNSAFE_ENTRY(jint, Unsafe_Loadavg(JNIEnv *env, jobject unsafe, jdoubleArray loadavg, jint nelem))
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 UnsafeWrapper("Unsafe_Loadavg");
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 const int max_nelem = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 double la[max_nelem];
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 jint ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1273
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(loadavg));
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 assert(a->is_typeArray(), "must be type array");
a61af66fc99e Initial load
duke
parents:
diff changeset
1276
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 if (nelem < 0 || nelem > max_nelem || a->length() < nelem) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 ThreadToNativeFromVM ttnfv(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 throw_new(env, "ArrayIndexOutOfBoundsException");
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1282
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 ret = os::loadavg(la, nelem);
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 if (ret == -1) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1285
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 // if successful, ret is the number of samples actually retrieved.
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 assert(ret >= 0 && ret <= max_nelem, "Unexpected loadavg return value");
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 switch(ret) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 case 3: a->double_at_put(2, (jdouble)la[2]); // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 case 2: a->double_at_put(1, (jdouble)la[1]); // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 case 1: a->double_at_put(0, (jdouble)la[0]); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1295
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 UNSAFE_ENTRY(void, Unsafe_PrefetchRead(JNIEnv* env, jclass ignored, jobject obj, jlong offset))
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 UnsafeWrapper("Unsafe_PrefetchRead");
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 oop p = JNIHandles::resolve(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 void* addr = index_oop_from_field_offset_long(p, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 Prefetch::read(addr, (intx)offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1302
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 UNSAFE_ENTRY(void, Unsafe_PrefetchWrite(JNIEnv* env, jclass ignored, jobject obj, jlong offset))
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 UnsafeWrapper("Unsafe_PrefetchWrite");
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 oop p = JNIHandles::resolve(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 void* addr = index_oop_from_field_offset_long(p, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 Prefetch::write(addr, (intx)offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 UNSAFE_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1309
a61af66fc99e Initial load
duke
parents:
diff changeset
1310
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 /// JVM_RegisterUnsafeMethods
a61af66fc99e Initial load
duke
parents:
diff changeset
1312
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 #define ADR "J"
a61af66fc99e Initial load
duke
parents:
diff changeset
1314
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 #define LANG "Ljava/lang/"
a61af66fc99e Initial load
duke
parents:
diff changeset
1316
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 #define OBJ LANG"Object;"
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 #define CLS LANG"Class;"
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 #define CTR LANG"reflect/Constructor;"
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 #define FLD LANG"reflect/Field;"
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 #define MTH LANG"reflect/Method;"
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 #define THR LANG"Throwable;"
a61af66fc99e Initial load
duke
parents:
diff changeset
1323
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 #define DC0_Args LANG"String;[BII"
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 #define DC1_Args DC0_Args LANG"ClassLoader;" "Ljava/security/ProtectionDomain;"
a61af66fc99e Initial load
duke
parents:
diff changeset
1326
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 #define CC (char*) /*cast a literal from (const char*)*/
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
a61af66fc99e Initial load
duke
parents:
diff changeset
1329
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 // define deprecated accessors for compabitility with 1.4.0
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 #define DECLARE_GETSETOOP_140(Boolean, Z) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 {CC"get"#Boolean, CC"("OBJ"I)"#Z, FN_PTR(Unsafe_Get##Boolean##140)}, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 {CC"put"#Boolean, CC"("OBJ"I"#Z")V", FN_PTR(Unsafe_Set##Boolean##140)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1334
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 // Note: In 1.4.1, getObject and kin take both int and long offsets.
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 #define DECLARE_GETSETOOP_141(Boolean, Z) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 {CC"get"#Boolean, CC"("OBJ"J)"#Z, FN_PTR(Unsafe_Get##Boolean)}, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 {CC"put"#Boolean, CC"("OBJ"J"#Z")V", FN_PTR(Unsafe_Set##Boolean)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1339
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 // Note: In 1.5.0, there are volatile versions too
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 #define DECLARE_GETSETOOP(Boolean, Z) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 {CC"get"#Boolean, CC"("OBJ"J)"#Z, FN_PTR(Unsafe_Get##Boolean)}, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 {CC"put"#Boolean, CC"("OBJ"J"#Z")V", FN_PTR(Unsafe_Set##Boolean)}, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 {CC"get"#Boolean"Volatile", CC"("OBJ"J)"#Z, FN_PTR(Unsafe_Get##Boolean##Volatile)}, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 {CC"put"#Boolean"Volatile", CC"("OBJ"J"#Z")V", FN_PTR(Unsafe_Set##Boolean##Volatile)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1346
a61af66fc99e Initial load
duke
parents:
diff changeset
1347
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 #define DECLARE_GETSETNATIVE(Byte, B) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 {CC"get"#Byte, CC"("ADR")"#B, FN_PTR(Unsafe_GetNative##Byte)}, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 {CC"put"#Byte, CC"("ADR#B")V", FN_PTR(Unsafe_SetNative##Byte)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1351
a61af66fc99e Initial load
duke
parents:
diff changeset
1352
a61af66fc99e Initial load
duke
parents:
diff changeset
1353
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 // %%% These are temporarily supported until the SDK sources
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 // contain the necessarily updated Unsafe.java.
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 static JNINativeMethod methods_140[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
1357
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 {CC"getObject", CC"("OBJ"I)"OBJ"", FN_PTR(Unsafe_GetObject140)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 {CC"putObject", CC"("OBJ"I"OBJ")V", FN_PTR(Unsafe_SetObject140)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1360
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 DECLARE_GETSETOOP_140(Boolean, Z),
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 DECLARE_GETSETOOP_140(Byte, B),
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 DECLARE_GETSETOOP_140(Short, S),
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 DECLARE_GETSETOOP_140(Char, C),
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 DECLARE_GETSETOOP_140(Int, I),
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 DECLARE_GETSETOOP_140(Long, J),
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 DECLARE_GETSETOOP_140(Float, F),
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 DECLARE_GETSETOOP_140(Double, D),
a61af66fc99e Initial load
duke
parents:
diff changeset
1369
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 DECLARE_GETSETNATIVE(Byte, B),
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 DECLARE_GETSETNATIVE(Short, S),
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 DECLARE_GETSETNATIVE(Char, C),
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 DECLARE_GETSETNATIVE(Int, I),
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 DECLARE_GETSETNATIVE(Long, J),
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 DECLARE_GETSETNATIVE(Float, F),
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 DECLARE_GETSETNATIVE(Double, D),
a61af66fc99e Initial load
duke
parents:
diff changeset
1377
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 {CC"getAddress", CC"("ADR")"ADR, FN_PTR(Unsafe_GetNativeAddress)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 {CC"putAddress", CC"("ADR""ADR")V", FN_PTR(Unsafe_SetNativeAddress)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1380
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 {CC"allocateMemory", CC"(J)"ADR, FN_PTR(Unsafe_AllocateMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 {CC"reallocateMemory", CC"("ADR"J)"ADR, FN_PTR(Unsafe_ReallocateMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 // {CC"setMemory", CC"("ADR"JB)V", FN_PTR(Unsafe_SetMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 // {CC"copyMemory", CC"("ADR ADR"J)V", FN_PTR(Unsafe_CopyMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 {CC"freeMemory", CC"("ADR")V", FN_PTR(Unsafe_FreeMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1386
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 {CC"fieldOffset", CC"("FLD")I", FN_PTR(Unsafe_FieldOffset)}, //deprecated
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 {CC"staticFieldBase", CC"("CLS")"OBJ, FN_PTR(Unsafe_StaticFieldBaseFromClass)}, //deprecated
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 {CC"ensureClassInitialized",CC"("CLS")V", FN_PTR(Unsafe_EnsureClassInitialized)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 {CC"arrayBaseOffset", CC"("CLS")I", FN_PTR(Unsafe_ArrayBaseOffset)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 {CC"arrayIndexScale", CC"("CLS")I", FN_PTR(Unsafe_ArrayIndexScale)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 {CC"addressSize", CC"()I", FN_PTR(Unsafe_AddressSize)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 {CC"pageSize", CC"()I", FN_PTR(Unsafe_PageSize)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1394
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 {CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 {CC"defineClass", CC"("DC1_Args")"CLS, FN_PTR(Unsafe_DefineClass1)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 {CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 {CC"monitorEnter", CC"("OBJ")V", FN_PTR(Unsafe_MonitorEnter)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 {CC"monitorExit", CC"("OBJ")V", FN_PTR(Unsafe_MonitorExit)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 {CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1402
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 // These are the old methods prior to the JSR 166 changes in 1.5.0
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 static JNINativeMethod methods_141[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
1405
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 {CC"getObject", CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObject)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 {CC"putObject", CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObject)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1408
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 DECLARE_GETSETOOP_141(Boolean, Z),
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 DECLARE_GETSETOOP_141(Byte, B),
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 DECLARE_GETSETOOP_141(Short, S),
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 DECLARE_GETSETOOP_141(Char, C),
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 DECLARE_GETSETOOP_141(Int, I),
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 DECLARE_GETSETOOP_141(Long, J),
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 DECLARE_GETSETOOP_141(Float, F),
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 DECLARE_GETSETOOP_141(Double, D),
a61af66fc99e Initial load
duke
parents:
diff changeset
1417
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 DECLARE_GETSETNATIVE(Byte, B),
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 DECLARE_GETSETNATIVE(Short, S),
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 DECLARE_GETSETNATIVE(Char, C),
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 DECLARE_GETSETNATIVE(Int, I),
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 DECLARE_GETSETNATIVE(Long, J),
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 DECLARE_GETSETNATIVE(Float, F),
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 DECLARE_GETSETNATIVE(Double, D),
a61af66fc99e Initial load
duke
parents:
diff changeset
1425
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 {CC"getAddress", CC"("ADR")"ADR, FN_PTR(Unsafe_GetNativeAddress)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 {CC"putAddress", CC"("ADR""ADR")V", FN_PTR(Unsafe_SetNativeAddress)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1428
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 {CC"allocateMemory", CC"(J)"ADR, FN_PTR(Unsafe_AllocateMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 {CC"reallocateMemory", CC"("ADR"J)"ADR, FN_PTR(Unsafe_ReallocateMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 // {CC"setMemory", CC"("ADR"JB)V", FN_PTR(Unsafe_SetMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 // {CC"copyMemory", CC"("ADR ADR"J)V", FN_PTR(Unsafe_CopyMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 {CC"freeMemory", CC"("ADR")V", FN_PTR(Unsafe_FreeMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1434
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 {CC"objectFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_ObjectFieldOffset)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 {CC"staticFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_StaticFieldOffset)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 {CC"staticFieldBase", CC"("FLD")"OBJ, FN_PTR(Unsafe_StaticFieldBaseFromField)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 {CC"ensureClassInitialized",CC"("CLS")V", FN_PTR(Unsafe_EnsureClassInitialized)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 {CC"arrayBaseOffset", CC"("CLS")I", FN_PTR(Unsafe_ArrayBaseOffset)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 {CC"arrayIndexScale", CC"("CLS")I", FN_PTR(Unsafe_ArrayIndexScale)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 {CC"addressSize", CC"()I", FN_PTR(Unsafe_AddressSize)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 {CC"pageSize", CC"()I", FN_PTR(Unsafe_PageSize)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1443
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 {CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 {CC"defineClass", CC"("DC1_Args")"CLS, FN_PTR(Unsafe_DefineClass1)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 {CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 {CC"monitorEnter", CC"("OBJ")V", FN_PTR(Unsafe_MonitorEnter)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 {CC"monitorExit", CC"("OBJ")V", FN_PTR(Unsafe_MonitorExit)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 {CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1450
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1452
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 // These are the old methods prior to the JSR 166 changes in 1.6.0
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 static JNINativeMethod methods_15[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
1455
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 {CC"getObject", CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObject)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 {CC"putObject", CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObject)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 {CC"getObjectVolatile",CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObjectVolatile)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 {CC"putObjectVolatile",CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObjectVolatile)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1460
a61af66fc99e Initial load
duke
parents:
diff changeset
1461
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 DECLARE_GETSETOOP(Boolean, Z),
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 DECLARE_GETSETOOP(Byte, B),
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 DECLARE_GETSETOOP(Short, S),
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 DECLARE_GETSETOOP(Char, C),
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 DECLARE_GETSETOOP(Int, I),
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 DECLARE_GETSETOOP(Long, J),
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 DECLARE_GETSETOOP(Float, F),
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 DECLARE_GETSETOOP(Double, D),
a61af66fc99e Initial load
duke
parents:
diff changeset
1470
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 DECLARE_GETSETNATIVE(Byte, B),
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 DECLARE_GETSETNATIVE(Short, S),
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 DECLARE_GETSETNATIVE(Char, C),
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 DECLARE_GETSETNATIVE(Int, I),
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 DECLARE_GETSETNATIVE(Long, J),
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 DECLARE_GETSETNATIVE(Float, F),
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 DECLARE_GETSETNATIVE(Double, D),
a61af66fc99e Initial load
duke
parents:
diff changeset
1478
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 {CC"getAddress", CC"("ADR")"ADR, FN_PTR(Unsafe_GetNativeAddress)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 {CC"putAddress", CC"("ADR""ADR")V", FN_PTR(Unsafe_SetNativeAddress)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1481
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 {CC"allocateMemory", CC"(J)"ADR, FN_PTR(Unsafe_AllocateMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 {CC"reallocateMemory", CC"("ADR"J)"ADR, FN_PTR(Unsafe_ReallocateMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 // {CC"setMemory", CC"("ADR"JB)V", FN_PTR(Unsafe_SetMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 // {CC"copyMemory", CC"("ADR ADR"J)V", FN_PTR(Unsafe_CopyMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 {CC"freeMemory", CC"("ADR")V", FN_PTR(Unsafe_FreeMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1487
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 {CC"objectFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_ObjectFieldOffset)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 {CC"staticFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_StaticFieldOffset)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 {CC"staticFieldBase", CC"("FLD")"OBJ, FN_PTR(Unsafe_StaticFieldBaseFromField)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 {CC"ensureClassInitialized",CC"("CLS")V", FN_PTR(Unsafe_EnsureClassInitialized)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 {CC"arrayBaseOffset", CC"("CLS")I", FN_PTR(Unsafe_ArrayBaseOffset)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 {CC"arrayIndexScale", CC"("CLS")I", FN_PTR(Unsafe_ArrayIndexScale)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 {CC"addressSize", CC"()I", FN_PTR(Unsafe_AddressSize)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 {CC"pageSize", CC"()I", FN_PTR(Unsafe_PageSize)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1496
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 {CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 {CC"defineClass", CC"("DC1_Args")"CLS, FN_PTR(Unsafe_DefineClass1)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 {CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 {CC"monitorEnter", CC"("OBJ")V", FN_PTR(Unsafe_MonitorEnter)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 {CC"monitorExit", CC"("OBJ")V", FN_PTR(Unsafe_MonitorExit)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 {CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 {CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z", FN_PTR(Unsafe_CompareAndSwapObject)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 {CC"compareAndSwapInt", CC"("OBJ"J""I""I"")Z", FN_PTR(Unsafe_CompareAndSwapInt)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 {CC"compareAndSwapLong", CC"("OBJ"J""J""J"")Z", FN_PTR(Unsafe_CompareAndSwapLong)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 {CC"park", CC"(ZJ)V", FN_PTR(Unsafe_Park)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 {CC"unpark", CC"("OBJ")V", FN_PTR(Unsafe_Unpark)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1508
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1510
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 // These are the correct methods, moving forward:
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 static JNINativeMethod methods[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
1513
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 {CC"getObject", CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObject)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 {CC"putObject", CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObject)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 {CC"getObjectVolatile",CC"("OBJ"J)"OBJ"", FN_PTR(Unsafe_GetObjectVolatile)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 {CC"putObjectVolatile",CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetObjectVolatile)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1518
a61af66fc99e Initial load
duke
parents:
diff changeset
1519
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 DECLARE_GETSETOOP(Boolean, Z),
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 DECLARE_GETSETOOP(Byte, B),
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 DECLARE_GETSETOOP(Short, S),
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 DECLARE_GETSETOOP(Char, C),
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 DECLARE_GETSETOOP(Int, I),
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 DECLARE_GETSETOOP(Long, J),
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 DECLARE_GETSETOOP(Float, F),
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 DECLARE_GETSETOOP(Double, D),
a61af66fc99e Initial load
duke
parents:
diff changeset
1528
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 DECLARE_GETSETNATIVE(Byte, B),
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 DECLARE_GETSETNATIVE(Short, S),
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 DECLARE_GETSETNATIVE(Char, C),
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 DECLARE_GETSETNATIVE(Int, I),
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 DECLARE_GETSETNATIVE(Long, J),
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 DECLARE_GETSETNATIVE(Float, F),
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 DECLARE_GETSETNATIVE(Double, D),
a61af66fc99e Initial load
duke
parents:
diff changeset
1536
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 {CC"getAddress", CC"("ADR")"ADR, FN_PTR(Unsafe_GetNativeAddress)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 {CC"putAddress", CC"("ADR""ADR")V", FN_PTR(Unsafe_SetNativeAddress)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1539
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 {CC"allocateMemory", CC"(J)"ADR, FN_PTR(Unsafe_AllocateMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 {CC"reallocateMemory", CC"("ADR"J)"ADR, FN_PTR(Unsafe_ReallocateMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 // {CC"setMemory", CC"("ADR"JB)V", FN_PTR(Unsafe_SetMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 // {CC"copyMemory", CC"("ADR ADR"J)V", FN_PTR(Unsafe_CopyMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 {CC"freeMemory", CC"("ADR")V", FN_PTR(Unsafe_FreeMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1545
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 {CC"objectFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_ObjectFieldOffset)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 {CC"staticFieldOffset", CC"("FLD")J", FN_PTR(Unsafe_StaticFieldOffset)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 {CC"staticFieldBase", CC"("FLD")"OBJ, FN_PTR(Unsafe_StaticFieldBaseFromField)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 {CC"ensureClassInitialized",CC"("CLS")V", FN_PTR(Unsafe_EnsureClassInitialized)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 {CC"arrayBaseOffset", CC"("CLS")I", FN_PTR(Unsafe_ArrayBaseOffset)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 {CC"arrayIndexScale", CC"("CLS")I", FN_PTR(Unsafe_ArrayIndexScale)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 {CC"addressSize", CC"()I", FN_PTR(Unsafe_AddressSize)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 {CC"pageSize", CC"()I", FN_PTR(Unsafe_PageSize)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1554
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 {CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 {CC"defineClass", CC"("DC1_Args")"CLS, FN_PTR(Unsafe_DefineClass1)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 {CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 {CC"monitorEnter", CC"("OBJ")V", FN_PTR(Unsafe_MonitorEnter)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 {CC"monitorExit", CC"("OBJ")V", FN_PTR(Unsafe_MonitorExit)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 {CC"tryMonitorEnter", CC"("OBJ")Z", FN_PTR(Unsafe_TryMonitorEnter)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 {CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 {CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z", FN_PTR(Unsafe_CompareAndSwapObject)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 {CC"compareAndSwapInt", CC"("OBJ"J""I""I"")Z", FN_PTR(Unsafe_CompareAndSwapInt)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 {CC"compareAndSwapLong", CC"("OBJ"J""J""J"")Z", FN_PTR(Unsafe_CompareAndSwapLong)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 {CC"putOrderedObject", CC"("OBJ"J"OBJ")V", FN_PTR(Unsafe_SetOrderedObject)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 {CC"putOrderedInt", CC"("OBJ"JI)V", FN_PTR(Unsafe_SetOrderedInt)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 {CC"putOrderedLong", CC"("OBJ"JJ)V", FN_PTR(Unsafe_SetOrderedLong)},
7425
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
1568 {CC"loadFence", CC"()V", FN_PTR(Unsafe_LoadFence)},
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
1569 {CC"storeFence", CC"()V", FN_PTR(Unsafe_StoreFence)},
1e41b0bc58a0 8004318: JEP-171: Support Unsafe fences intrinsics
kvn
parents: 7185
diff changeset
1570 {CC"fullFence", CC"()V", FN_PTR(Unsafe_FullFence)},
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 {CC"park", CC"(ZJ)V", FN_PTR(Unsafe_Park)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 {CC"unpark", CC"("OBJ")V", FN_PTR(Unsafe_Unpark)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1573
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 // {CC"getLoadAverage", CC"([DI)I", FN_PTR(Unsafe_Loadavg)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1575
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 // {CC"prefetchRead", CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchRead)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 // {CC"prefetchWrite", CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchWrite)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 // {CC"prefetchReadStatic", CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchRead)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 // {CC"prefetchWriteStatic",CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchWrite)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1580
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1582
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 JNINativeMethod loadavg_method[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 {CC"getLoadAverage", CC"([DI)I", FN_PTR(Unsafe_Loadavg)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1586
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 JNINativeMethod prefetch_methods[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 {CC"prefetchRead", CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchRead)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 {CC"prefetchWrite", CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchWrite)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 {CC"prefetchReadStatic", CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchRead)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 {CC"prefetchWriteStatic",CC"("OBJ"J)V", FN_PTR(Unsafe_PrefetchWrite)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1593
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 JNINativeMethod memcopy_methods[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 {CC"copyMemory", CC"("OBJ"J"OBJ"JJ)V", FN_PTR(Unsafe_CopyMemory2)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 {CC"setMemory", CC"("OBJ"JJB)V", FN_PTR(Unsafe_SetMemory2)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1598
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 JNINativeMethod memcopy_methods_15[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 {CC"setMemory", CC"("ADR"JB)V", FN_PTR(Unsafe_SetMemory)},
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 {CC"copyMemory", CC"("ADR ADR"J)V", FN_PTR(Unsafe_CopyMemory)}
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1603
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1604 JNINativeMethod anonk_methods[] = {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1605 {CC"defineAnonymousClass", CC"("DAC_Args")"CLS, FN_PTR(Unsafe_DefineAnonymousClass)},
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1606 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1607
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1608 JNINativeMethod lform_methods[] = {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1609 {CC"shouldBeInitialized",CC"("CLS")Z", FN_PTR(Unsafe_ShouldBeInitialized)},
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1610 };
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1611
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 #undef CC
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 #undef FN_PTR
a61af66fc99e Initial load
duke
parents:
diff changeset
1614
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 #undef ADR
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 #undef LANG
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 #undef OBJ
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 #undef CLS
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 #undef CTR
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 #undef FLD
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 #undef MTH
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 #undef THR
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 #undef DC0_Args
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 #undef DC1_Args
a61af66fc99e Initial load
duke
parents:
diff changeset
1625
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 #undef DECLARE_GETSETOOP
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 #undef DECLARE_GETSETNATIVE
a61af66fc99e Initial load
duke
parents:
diff changeset
1628
a61af66fc99e Initial load
duke
parents:
diff changeset
1629
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 // This one function is exported, used by NativeLookup.
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 // The Unsafe_xxx functions above are called only from the interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 // The optimizer looks at names and signatures to recognize
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 // individual functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
1634
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 JVM_ENTRY(void, JVM_RegisterUnsafeMethods(JNIEnv *env, jclass unsafecls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 UnsafeWrapper("JVM_RegisterUnsafeMethods");
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 ThreadToNativeFromVM ttnfv(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 env->RegisterNatives(unsafecls, loadavg_method, sizeof(loadavg_method)/sizeof(JNINativeMethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 if (env->ExceptionOccurred()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 if (PrintMiscellaneous && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 tty->print_cr("Warning: SDK 1.6 Unsafe.loadavg not found.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 env->ExceptionClear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 env->RegisterNatives(unsafecls, prefetch_methods, sizeof(prefetch_methods)/sizeof(JNINativeMethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 if (env->ExceptionOccurred()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 if (PrintMiscellaneous && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 tty->print_cr("Warning: SDK 1.6 Unsafe.prefetchRead/Write not found.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 env->ExceptionClear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 env->RegisterNatives(unsafecls, memcopy_methods, sizeof(memcopy_methods)/sizeof(JNINativeMethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 if (env->ExceptionOccurred()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 if (PrintMiscellaneous && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 tty->print_cr("Warning: SDK 1.7 Unsafe.copyMemory not found.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 env->ExceptionClear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 env->RegisterNatives(unsafecls, memcopy_methods_15, sizeof(memcopy_methods_15)/sizeof(JNINativeMethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 if (env->ExceptionOccurred()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 if (PrintMiscellaneous && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 tty->print_cr("Warning: SDK 1.5 Unsafe.copyMemory not found.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 env->ExceptionClear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 }
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2376
diff changeset
1673 if (EnableInvokeDynamic) {
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1674 env->RegisterNatives(unsafecls, anonk_methods, sizeof(anonk_methods)/sizeof(JNINativeMethod));
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1675 if (env->ExceptionOccurred()) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1676 if (PrintMiscellaneous && (Verbose || WizardMode)) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1677 tty->print_cr("Warning: SDK 1.7 Unsafe.defineClass (anonymous version) not found.");
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1678 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1679 env->ExceptionClear();
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1680 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 356
diff changeset
1681 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1682 if (EnableInvokeDynamic) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1683 env->RegisterNatives(unsafecls, lform_methods, sizeof(lform_methods)/sizeof(JNINativeMethod));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1684 if (env->ExceptionOccurred()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1685 if (PrintMiscellaneous && (Verbose || WizardMode)) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1686 tty->print_cr("Warning: SDK 1.7 LambdaForm support in Unsafe not found.");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1687 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1688 env->ExceptionClear();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1689 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6226
diff changeset
1690 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 int status = env->RegisterNatives(unsafecls, methods, sizeof(methods)/sizeof(JNINativeMethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 if (env->ExceptionOccurred()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 if (PrintMiscellaneous && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 tty->print_cr("Warning: SDK 1.6 version of Unsafe not found.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 env->ExceptionClear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 // %%% For now, be backward compatible with an older class:
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 status = env->RegisterNatives(unsafecls, methods_15, sizeof(methods_15)/sizeof(JNINativeMethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 if (env->ExceptionOccurred()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 if (PrintMiscellaneous && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 tty->print_cr("Warning: SDK 1.5 version of Unsafe not found.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 env->ExceptionClear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 // %%% For now, be backward compatible with an older class:
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 status = env->RegisterNatives(unsafecls, methods_141, sizeof(methods_141)/sizeof(JNINativeMethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 if (env->ExceptionOccurred()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 if (PrintMiscellaneous && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 tty->print_cr("Warning: SDK 1.4.1 version of Unsafe not found.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 env->ExceptionClear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 // %%% For now, be backward compatible with an older class:
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 status = env->RegisterNatives(unsafecls, methods_140, sizeof(methods_140)/sizeof(JNINativeMethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 guarantee(status == 0, "register unsafe natives");
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 JVM_END