X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fnative%2Fvm%2Fsun_misc_Unsafe.c;h=cc6a61fe4ff3d90b3ac47e6e9468dfaa16cd82d9;hb=dd58b2a79a78f0933ad6ef7a155d15253122a4c2;hp=f74916f6fddeda7f1baeba8a79bebb1762f35e35;hpb=39219e50204f9324f6209c426ab759d6ed1b7be7;p=cacao.git diff --git a/src/native/vm/sun_misc_Unsafe.c b/src/native/vm/sun_misc_Unsafe.c index f74916f6f..cc6a61fe4 100644 --- a/src/native/vm/sun_misc_Unsafe.c +++ b/src/native/vm/sun_misc_Unsafe.c @@ -1,9 +1,7 @@ /* src/native/vm/sun_misc_Unsafe.c - sun/misc/Unsafe - Copyright (C) 2006, 2007 R. Grafl, A. Krall, C. Kruegel, C. Oates, - R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner, - C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger, - Institut f. Computersprachen - TU Wien + Copyright (C) 2006, 2007, 2008 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -73,16 +71,22 @@ static JNINativeMethod methods[] = { { "putBoolean", "(Ljava/lang/Object;JZ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putBoolean }, { "getByte", "(Ljava/lang/Object;J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J }, { "putByte", "(Ljava/lang/Object;JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB }, + { "getShort", "(Ljava/lang/Object;J)S", (void *) (intptr_t) &Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J }, { "putShort", "(Ljava/lang/Object;JS)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS }, { "getChar", "(Ljava/lang/Object;J)C", (void *) (intptr_t) &Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J }, { "putChar", "(Ljava/lang/Object;JC)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC }, { "getLong", "(Ljava/lang/Object;J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J }, + { "putLong", "(Ljava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ }, { "getFloat", "(Ljava/lang/Object;J)F", (void *) (intptr_t) &Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J }, { "putFloat", "(Ljava/lang/Object;JF)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF }, + { "getDouble", "(Ljava/lang/Object;J)D", (void *) (intptr_t) &Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J }, + { "putDouble", "(Ljava/lang/Object;JD)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD }, { "getByte", "(J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__J }, { "putByte", "(JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__JB }, { "getShort", "(J)S", (void *) (intptr_t) &Java_sun_misc_Unsafe_getShort__J }, { "putShort", "(JS)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putShort__JS }, + { "getChar", "(J)C", (void *) (intptr_t) &Java_sun_misc_Unsafe_getChar__J }, + { "putChar", "(JC)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putChar__JC }, { "getInt", "(J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__J }, { "putInt", "(JI)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putInt__JI }, { "getLong", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__J }, @@ -91,6 +95,7 @@ static JNINativeMethod methods[] = { { "objectFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_objectFieldOffset }, { "allocateMemory", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateMemory }, { "setMemory", "(Ljava/lang/Object;JJB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_setMemory }, + { "copyMemory", "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_copyMemory }, { "freeMemory", "(J)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_freeMemory }, { "staticFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldOffset }, { "staticFieldBase", "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldBase }, @@ -106,6 +111,7 @@ static JNINativeMethod methods[] = { { "compareAndSwapInt", "(Ljava/lang/Object;JII)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt }, { "compareAndSwapLong", "(Ljava/lang/Object;JJJ)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong }, { "getObjectVolatile", "(Ljava/lang/Object;J)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_getObjectVolatile }, + { "putObjectVolatile", "(Ljava/lang/Object;JLjava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putObjectVolatile }, { "getIntVolatile", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getIntVolatile }, { "getLongVolatile", "(Ljava/lang/Object;J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLongVolatile }, { "unpark", "(Ljava/lang/Object;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_unpark }, @@ -274,6 +280,24 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEn } +/* + * Class: sun/misc/Unsafe + * Method: getShort + * Signature: (Ljava/lang/Object;J)S + */ +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) +{ + int32_t *p; + int32_t value; + + p = (int32_t *) (((uint8_t *) o) + offset); + + value = *p; + + return value; +} + + /* * Class: sun/misc/Unsafe * Method: putShort @@ -340,6 +364,21 @@ JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J(JNI } +/* + * Class: sun/misc/Unsafe + * Method: putLong + * Signature: (Ljava/lang/Object;JJ)V + */ +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) +{ + int64_t *p; + + p = (int64_t *) (((uint8_t *) o) + offset); + + *p = x; +} + + /* * Class: sun/misc/Unsafe * Method: getFloat @@ -373,6 +412,39 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF(JNIE } +/* + * Class: sun/misc/Unsafe + * Method: getDouble + * Signature: (Ljava/lang/Object;J)D + */ +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) +{ + double *p; + double value; + + p = (double *) (((uint8_t *) o) + offset); + + value = *p; + + return value; +} + + +/* + * Class: sun/misc/Unsafe + * Method: putDouble + * Signature: (Ljava/lang/Object;JD)V + */ +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) +{ + double *p; + + p = (double *) (((uint8_t *) o) + offset); + + *p = x; +} + + /* * Class: sun/misc/Unsafe * Method: getByte @@ -439,6 +511,39 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__JS(JNIEnv *env, sun_misc_U } +/* + * Class: sun/misc/Unsafe + * Method: getChar + * Signature: (J)C + */ +JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getChar__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address) +{ + uint16_t *p; + uint16_t value; + + p = (uint16_t *) (intptr_t) address; + + value = *p; + + return (int32_t) value; +} + + +/* + * Class: sun/misc/Unsafe + * Method: putChar + * Signature: (JC)V + */ +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__JC(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int32_t value) +{ + uint16_t *p; + + p = (uint16_t *) (intptr_t) address; + + *p = (uint16_t) value; +} + + /* * Class: sun/misc/Unsafe * Method: getInt @@ -593,6 +698,36 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, sun_misc_Unsa } +/* + * Class: sun/misc/Unsafe + * Method: copyMemory + * Signature: (Ljava/lang/Object;JLjava/lang/Object;JJ)V + */ +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *srcBase, int64_t srcOffset, java_lang_Object *destBase, int64_t destOffset, int64_t bytes) +{ + size_t length; + void *src; + void *dest; + + if (bytes == 0) + return; + + length = (size_t) bytes; + + if ((length != (uint64_t) bytes) || (bytes < 0)) { + exceptions_throw_illegalargumentexception(); + return; + } + + /* XXX Missing LLNI: We need to unwrap these objects. */ + + src = (void *) (((uint8_t *) srcBase) + srcOffset); + dest = (void *) (((uint8_t *) destBase) + destOffset); + + MCOPY(dest, src, uint8_t, length); +} + + /* * Class: sun/misc/Unsafe * Method: freeMemory @@ -618,17 +753,11 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, sun_misc_Uns * Method: staticFieldOffset * Signature: (Ljava/lang/reflect/Field;)J */ -JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *field) +JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *f) { - classinfo *c; - fieldinfo *f; - int32_t slot; + /* The offset of static fields is 0. */ - LLNI_field_get_cls(field, clazz, c); - LLNI_field_get_val(field, slot , slot); - f = &(c->fields[slot]); - - return (int64_t) (intptr_t) f->value; + return 0; } @@ -637,11 +766,18 @@ JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, su * Method: staticFieldBase * Signature: (Ljava/lang/reflect/Field;)Ljava/lang/Object; */ -JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *f) +JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *rf) { - /* In CACAO we return the absolute address in staticFieldOffset. */ + classinfo *c; + fieldinfo *f; + int32_t slot; + + LLNI_field_get_cls(rf, clazz, c); + LLNI_field_get_val(rf, slot , slot); - return NULL; + f = &(c->fields[slot]); + + return (java_lang_Object *) (f->value); } @@ -772,8 +908,8 @@ JNIEXPORT java_lang_Class* JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_ /* define the class */ - c = class_define(utfname, cl, len, (const uint8_t *) &(LLNI_array_direct(b, off)), - protectionDomain); + c = class_define(utfname, cl, len, (uint8_t *) &(LLNI_array_direct(b, off)), + (java_handle_t *) protectionDomain); if (c == NULL) return NULL; @@ -921,6 +1057,21 @@ JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(JNIEn } +/* + * Class: sun/misc/Unsafe + * Method: putObjectVolatile + * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, java_lang_Object *x) +{ + volatile void **p; + + p = (volatile void **) (((uint8_t *) o) + offset); + + *p = x; +} + + /* * Class: sun/misc/Unsafe * Method: getIntVolatile