1 /* src/native/vm/sun_misc_Unsafe.c - sun/misc/Unsafe
3 Copyright (C) 2006, 2007 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
33 #include "mm/memory.h"
35 #include "native/jni.h"
36 #include "native/llni.h"
37 #include "native/native.h"
39 #include "native/include/java_lang_Object.h" /* before c.l.C */
40 #include "native/include/java_lang_String.h" /* required by j.l.CL */
42 #if defined(WITH_CLASSPATH_SUN)
43 # include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
46 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
47 #include "native/include/java_lang_Class.h"
48 #include "native/include/java_lang_reflect_Field.h"
49 #include "native/include/java_lang_Thread.h" /* required by s.m.U */
50 #include "native/include/java_lang_Throwable.h"
52 #include "native/include/java_security_ProtectionDomain.h" /* required by smU */
54 #include "native/include/sun_misc_Unsafe.h"
56 #include "vm/builtin.h"
57 #include "vm/exceptions.h"
58 #include "vm/initialize.h"
59 #include "vm/stringlocal.h"
61 #include "vmcore/utf8.h"
64 /* native methods implemented by this file ************************************/
66 static JNINativeMethod methods[] = {
67 { "registerNatives", "()V", (void *) (intptr_t) &Java_sun_misc_Unsafe_registerNatives },
68 { "getInt", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J },
69 { "putInt", "(Ljava/lang/Object;JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI },
70 { "getObject", "(Ljava/lang/Object;J)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_getObject },
71 { "putObject", "(Ljava/lang/Object;JLjava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putObject },
72 { "getBoolean", "(Ljava/lang/Object;J)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_getBoolean },
73 { "putBoolean", "(Ljava/lang/Object;JZ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putBoolean },
74 { "getByte", "(Ljava/lang/Object;J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J },
75 { "putByte", "(Ljava/lang/Object;JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB },
76 { "getShort", "(Ljava/lang/Object;J)S", (void *) (intptr_t) &Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J },
77 { "putShort", "(Ljava/lang/Object;JS)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS },
78 { "getChar", "(Ljava/lang/Object;J)C", (void *) (intptr_t) &Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J },
79 { "putChar", "(Ljava/lang/Object;JC)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC },
80 { "getLong", "(Ljava/lang/Object;J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J },
81 { "putLong", "(Ljava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ },
82 { "getFloat", "(Ljava/lang/Object;J)F", (void *) (intptr_t) &Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J },
83 { "putFloat", "(Ljava/lang/Object;JF)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF },
84 { "getDouble", "(Ljava/lang/Object;J)D", (void *) (intptr_t) &Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J },
85 { "putDouble", "(Ljava/lang/Object;JD)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD },
86 { "getByte", "(J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__J },
87 { "putByte", "(JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__JB },
88 { "getShort", "(J)S", (void *) (intptr_t) &Java_sun_misc_Unsafe_getShort__J },
89 { "putShort", "(JS)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putShort__JS },
90 { "getInt", "(J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__J },
91 { "putInt", "(JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putInt__JI },
92 { "getLong", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__J },
93 { "putLong", "(JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__JJ },
94 { "getFloat", "(J)F", (void *) (intptr_t) &Java_sun_misc_Unsafe_getFloat__J },
95 { "objectFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_objectFieldOffset },
96 { "allocateMemory", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateMemory },
97 { "setMemory", "(Ljava/lang/Object;JJB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_setMemory },
98 { "freeMemory", "(J)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_freeMemory },
99 { "staticFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldOffset },
100 { "staticFieldBase", "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldBase },
101 { "ensureClassInitialized", "(Ljava/lang/Class;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_ensureClassInitialized },
102 { "arrayBaseOffset", "(Ljava/lang/Class;)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayBaseOffset },
103 { "arrayIndexScale", "(Ljava/lang/Class;)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayIndexScale },
104 { "addressSize", "()I", (void *) (intptr_t) &Java_sun_misc_Unsafe_addressSize },
105 { "pageSize", "()I", (void *) (intptr_t) &Java_sun_misc_Unsafe_pageSize },
106 { "defineClass", "(Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;", (void *) (intptr_t) &Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2 },
107 { "allocateInstance", "(Ljava/lang/Class;)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateInstance },
108 { "throwException", "(Ljava/lang/Throwable;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_throwException },
109 { "compareAndSwapObject", "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject },
110 { "compareAndSwapInt", "(Ljava/lang/Object;JII)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt },
111 { "compareAndSwapLong", "(Ljava/lang/Object;JJJ)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong },
112 { "getObjectVolatile", "(Ljava/lang/Object;J)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_getObjectVolatile },
113 { "getIntVolatile", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getIntVolatile },
114 { "getLongVolatile", "(Ljava/lang/Object;J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLongVolatile },
115 { "unpark", "(Ljava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_unpark },
116 { "park", "(ZJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_park },
120 /* _Jv_sun_misc_Unsafe_init ****************************************************
122 Register native functions.
124 *******************************************************************************/
126 void _Jv_sun_misc_Unsafe_init(void)
130 u = utf_new_char("sun/misc/Unsafe");
132 native_method_register(u, methods, NATIVE_METHODS_COUNT);
137 * Class: sun/misc/Unsafe
138 * Method: registerNatives
141 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv *env, jclass clazz)
143 /* The native methods of this function are already registered in
144 _Jv_sun_misc_Unsafe_init() which is called during VM
150 * Class: sun/misc/Unsafe
152 * Signature: (Ljava/lang/Object;J)I
154 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
159 p = (int32_t *) (((uint8_t *) o) + offset);
168 * Class: sun/misc/Unsafe
170 * Signature: (Ljava/lang/Object;JI)V
172 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
176 p = (int32_t *) (((uint8_t *) o) + offset);
183 * Class: sun/misc/Unsafe
185 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
187 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
192 p = (void **) (((uint8_t *) o) + offset);
201 * Class: sun/misc/Unsafe
203 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
205 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, java_lang_Object *x)
209 p = (void **) (((uint8_t *) o) + offset);
216 * Class: sun/misc/Unsafe
218 * Signature: (Ljava/lang/Object;J)Z
220 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
225 p = (int32_t *) (((uint8_t *) o) + offset);
234 * Class: sun/misc/Unsafe
236 * Signature: (Ljava/lang/Object;JZ)V
238 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
242 p = (int32_t *) (((uint8_t *) o) + offset);
249 * Class: sun/misc/Unsafe
251 * Signature: (Ljava/lang/Object;J)B
253 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
258 p = (int32_t *) (((uint8_t *) o) + offset);
267 * Class: sun/misc/Unsafe
269 * Signature: (Ljava/lang/Object;JB)V
271 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
275 p = (int32_t *) (((uint8_t *) o) + offset);
282 * Class: sun/misc/Unsafe
284 * Signature: (Ljava/lang/Object;J)S
286 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
291 p = (int32_t *) (((uint8_t *) o) + offset);
300 * Class: sun/misc/Unsafe
302 * Signature: (Ljava/lang/Object;JS)V
304 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
308 p = (int32_t *) (((uint8_t *) o) + offset);
315 * Class: sun/misc/Unsafe
317 * Signature: (Ljava/lang/Object;J)C
319 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
324 p = (int32_t *) (((uint8_t *) o) + offset);
333 * Class: sun/misc/Unsafe
335 * Signature: (Ljava/lang/Object;JC)V
337 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
341 p = (int32_t *) (((uint8_t *) o) + offset);
348 * Class: sun/misc/Unsafe
350 * Signature: (Ljava/lang/Object;J)J
352 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
357 p = (int64_t *) (((uint8_t *) o) + offset);
366 * Class: sun/misc/Unsafe
368 * Signature: (Ljava/lang/Object;JJ)V
370 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t x)
374 p = (int64_t *) (((uint8_t *) o) + offset);
381 * Class: sun/misc/Unsafe
383 * Signature: (Ljava/lang/Object;J)F
385 JNIEXPORT float JNICALL Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
390 p = (float *) (((uint8_t *) o) + offset);
399 * Class: sun/misc/Unsafe
401 * Signature: (Ljava/lang/Object;JF)V
403 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, float x)
407 p = (float *) (((uint8_t *) o) + offset);
414 * Class: sun/misc/Unsafe
416 * Signature: (Ljava/lang/Object;J)D
418 JNIEXPORT double JNICALL Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
423 p = (double *) (((uint8_t *) o) + offset);
432 * Class: sun/misc/Unsafe
434 * Signature: (Ljava/lang/Object;JD)V
436 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, double x)
440 p = (double *) (((uint8_t *) o) + offset);
447 * Class: sun/misc/Unsafe
451 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getByte__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
456 p = (int8_t *) (intptr_t) address;
460 return (int32_t) value;
465 * Class: sun/misc/Unsafe
469 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__JB(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
473 p = (int8_t *) (intptr_t) address;
480 * Class: sun/misc/Unsafe
484 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getShort__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
489 p = (int16_t *) (intptr_t) address;
493 return (int32_t) value;
498 * Class: sun/misc/Unsafe
502 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__JS(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value)
506 p = (int16_t *) (intptr_t) address;
508 *p = (int16_t) value;
513 * Class: sun/misc/Unsafe
517 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
522 p = (int32_t *) (intptr_t) address;
531 * Class: sun/misc/Unsafe
535 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__JI(JNIEnv *env, struct sun_misc_Unsafe* this, int64_t address, int32_t value)
539 p = (int32_t *) (intptr_t) address;
546 * Class: sun/misc/Unsafe
550 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLong__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
555 p = (int64_t *) (intptr_t) address;
564 * Class: sun/misc/Unsafe
568 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int64_t value)
572 p = (int64_t *) (intptr_t) address;
579 * Class: sun/misc/Unsafe
583 JNIEXPORT float JNICALL Java_sun_misc_Unsafe_getFloat__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
588 p = (float *) (intptr_t) address;
597 * Class: sun/misc/Unsafe
598 * Method: objectFieldOffset
599 * Signature: (Ljava/lang/reflect/Field;)J
601 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *field)
607 LLNI_field_get_cls(field, clazz, c);
608 LLNI_field_get_val(field, slot , slot);
610 f = &c->fields[slot];
612 return (int64_t) f->offset;
617 * Class: sun/misc/Unsafe
618 * Method: allocateMemory
621 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t bytes)
626 length = (size_t) bytes;
628 if ((length != (uint64_t) bytes) || (bytes < 0)) {
629 exceptions_throw_illegalargumentexception();
633 p = MNEW(uint8_t, length);
635 return (int64_t) (intptr_t) p;
640 * Class: sun/misc/Unsafe
642 * Signature: (Ljava/lang/Object;JJB)V
644 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t bytes, int32_t value)
649 length = (size_t) bytes;
651 if ((length != (uint64_t) bytes) || (bytes < 0)) {
652 exceptions_throw_illegalargumentexception();
656 /* XXX Missing LLNI: we need to unwrap this object. */
658 p = (void *) (((uint8_t *) o) + offset);
660 /* XXX Not sure this is correct. */
662 MSET(p, value, uint8_t, length);
667 * Class: sun/misc/Unsafe
671 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
675 p = (void *) (intptr_t) address;
680 /* we pass length 1 to trick the free function */
682 MFREE(p, uint8_t, 1);
687 * Class: sun/misc/Unsafe
688 * Method: staticFieldOffset
689 * Signature: (Ljava/lang/reflect/Field;)J
691 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *f)
693 /* The offset of static fields is 0. */
700 * Class: sun/misc/Unsafe
701 * Method: staticFieldBase
702 * Signature: (Ljava/lang/reflect/Field;)Ljava/lang/Object;
704 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *rf)
710 LLNI_field_get_cls(rf, clazz, c);
711 LLNI_field_get_val(rf, slot , slot);
713 f = &(c->fields[slot]);
715 return (java_lang_Object *) (f->value);
720 * Class: sun/misc/Unsafe
721 * Method: ensureClassInitialized
722 * Signature: (Ljava/lang/Class;)V
724 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *class)
728 c = LLNI_classinfo_unwrap(class);
730 if (!(c->state & CLASS_INITIALIZED))
736 * Class: sun/misc/Unsafe
737 * Method: arrayBaseOffset
738 * Signature: (Ljava/lang/Class;)I
740 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *arrayClass)
745 c = LLNI_classinfo_unwrap(arrayClass);
746 ad = c->vftbl->arraydesc;
749 /* XXX does that exception exist? */
750 exceptions_throw_internalerror("java/lang/InvalidClassException");
754 return ad->dataoffset;
759 * Class: sun/misc/Unsafe
760 * Method: arrayIndexScale
761 * Signature: (Ljava/lang/Class;)I
763 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *arrayClass)
768 c = LLNI_classinfo_unwrap(arrayClass);
769 ad = c->vftbl->arraydesc;
772 /* XXX does that exception exist? */
773 exceptions_throw_internalerror("java/lang/InvalidClassException");
777 return ad->componentsize;
782 * Class: sun/misc/Unsafe
783 * Method: addressSize
786 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv *env, sun_misc_Unsafe *this)
788 return SIZEOF_VOID_P;
793 * Class: sun/misc/Unsafe
797 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_pageSize(JNIEnv *env, sun_misc_Unsafe *this)
808 * Class: sun/misc/Unsafe
809 * Method: defineClass
810 * Signature: (Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;
812 JNIEXPORT java_lang_Class* JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2(JNIEnv *env, sun_misc_Unsafe *this, java_lang_String *name, java_handle_bytearray_t *b, int32_t off, int32_t len, java_lang_ClassLoader *loader, java_security_ProtectionDomain *protectionDomain)
819 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
821 /* check if data was passed */
824 exceptions_throw_nullpointerexception();
828 /* check the indexes passed */
830 if ((off < 0) || (len < 0) || ((off + len) > LLNI_array_size(b))) {
831 exceptions_throw_arrayindexoutofboundsexception();
836 /* convert '.' to '/' in java string */
838 utfname = javastring_toutf((java_handle_t *) name, true);
844 /* define the class */
846 c = class_define(utfname, cl, len, (const uint8_t *) &(LLNI_array_direct(b, off)),
852 /* for convenience */
854 o = LLNI_classinfo_wrap(c);
856 #if defined(WITH_CLASSPATH_GNU)
857 /* set ProtectionDomain */
859 LLNI_field_set_ref(o, pd, protectionDomain);
867 * Class: sun/misc/Unsafe
868 * Method: allocateInstance
869 * Signature: (Ljava/lang/Class;)Ljava/lang/Object;
871 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_allocateInstance(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *cls)
876 c = LLNI_classinfo_unwrap(cls);
880 return (java_lang_Object *) o;
885 * Class: sun/misc/Unsafe
886 * Method: throwException
887 * Signature: (Ljava/lang/Throwable;)V
889 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Throwable *ee)
893 o = (java_handle_t *) ee;
895 exceptions_set_exception(o);
900 * Class: sun/misc/Unsafe
901 * Method: compareAndSwapObject
902 * Signature: (Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
904 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, java_lang_Object *expected, java_lang_Object *x)
909 p = (void **) (((uint8_t *) o) + offset);
911 /* XXX this should be atomic */
915 if (value == expected) {
926 * Class: sun/misc/Unsafe
927 * Method: compareAndSwapInt
928 * Signature: (Ljava/lang/Object;JII)Z
930 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, sun_misc_Unsafe* this, java_lang_Object* obj, int64_t offset, int32_t expect, int32_t update)
935 p = (int32_t *) (((uint8_t *) obj) + offset);
937 /* XXX this should be atomic */
941 if (value == expect) {
952 * Class: sun/misc/Unsafe
953 * Method: compareAndSwapLong
954 * Signature: (Ljava/lang/Object;JJJ)Z
956 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t expected, int64_t x)
961 p = (int64_t *) (((uint8_t *) o) + offset);
963 /* XXX this should be atomic */
967 if (value == expected) {
978 * Class: sun/misc/Unsafe
979 * Method: getObjectVolatile
980 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
982 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
985 volatile void *value;
987 p = (volatile void **) (((uint8_t *) o) + offset);
991 return (java_lang_Object *) value;
996 * Class: sun/misc/Unsafe
997 * Method: getIntVolatile
998 * Signature: (Ljava/lang/Object;J)I
1000 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1002 volatile int32_t *p;
1003 volatile int32_t value;
1005 p = (volatile int32_t *) (((uint8_t *) o) + offset);
1014 * Class: sun/misc/Unsafe
1015 * Method: getLongVolatile
1016 * Signature: (Ljava/lang/Object;J)J
1018 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLongVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
1020 volatile int64_t *p;
1021 volatile int64_t value;
1023 p = (volatile int64_t *) (((uint8_t *) o) + offset);
1032 * Class: sun/misc/Unsafe
1034 * Signature: (Ljava/lang/Object;)V
1036 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *thread)
1038 /* XXX IMPLEMENT ME */
1043 * Class: sun/misc/Unsafe
1047 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, sun_misc_Unsafe *this, int32_t isAbsolute, int64_t time)
1049 /* XXX IMPLEMENT ME */
1054 * These are local overrides for various environment variables in Emacs.
1055 * Please do not remove this and leave it at the end of the file, where
1056 * Emacs will automagically detect them.
1057 * ---------------------------------------------------------------------
1060 * indent-tabs-mode: t