* src/vmcore/class.c (class_define): Added protection domain to
authortwisti <none@none>
Tue, 21 Aug 2007 15:37:47 +0000 (15:37 +0000)
committertwisti <none@none>
Tue, 21 Aug 2007 15:37:47 +0000 (15:37 +0000)
signature.
(class_resolve_superclass): Some changes (not yet correct).
(class_issubclass): Added assert to see if super is resolved.

* src/vmcore/class.h (classinfo) [ENABLE_JAVASE &&
WITH_CLASSPATH_SUN]: Added protectiondomain.

* src/native/jni.c (_Jv_JNI_DefineClass): Pass protection domain to
class_define.
* src/native/vm/java_lang_ClassLoader.c (defineClass): Likewise.

* src/native/vm/sun_misc_Unsafe.c (unistd.h): Added.
(vm/builtin.h): Likewise.
(putShort__Ljava_lang_Object_2JS): Implemented.
(putFloat__Ljava_lang_Object_2JF): Likewise
(putInt__JI): Likewise
(pageSize): Likewise
(allocateInstance): Likewise
(getLongVolatile): Likewise
(defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2):
Pass protection domain to class_define.

* src/native/vm/sun/jvm.c (threads/threads-common.h): Added.
(vm/signallocal.h): Likewise.
(PRINTJVMWARNINGS): New macro (not enabled yet).
(JVM_MaxMemory): Implemented.
(JVM_EnableCompiler): Likewise.
(JVM_DisableCompiler): Likewise.
(JVM_ResolveClass): Likewise.
(JVM_GetClassSignature): Likewise.
(JVM_Yield): Likewise.
(JVM_GetThreadStateValues): Likewise.
(JVM_GetThreadStateNames): Likewise.
(JVM_RegisterSignal): Likewise.
(JVM_FindSignal): Likewise.
(JVM_DefineClassWithSource): Pass protection domain to class_define.
(JVM_DesiredAssertionStatus): Return false for now.
(JVM_Available): Only ioctl is a correct implementation.

src/native/jni.c
src/native/vm/java_lang_ClassLoader.c
src/native/vm/sun/jvm.c
src/native/vm/sun_misc_Unsafe.c
src/vmcore/class.c
src/vmcore/class.h

index 168d740c18dcbc22981b4eeb00b1b6afcedbb487..90f588aacb1e1a89af0f8d54a579dabbaa133b23 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: jni.c 8341 2007-08-17 21:32:01Z michi $
+   $Id: jni.c 8387 2007-08-21 15:37:47Z twisti $
 
 */
 
@@ -938,12 +938,12 @@ jclass _Jv_JNI_DefineClass(JNIEnv *env, const char *name, jobject loader,
        classloader *cl;
        classinfo   *c;
 
-       TRACEJNICALLS("_Jv_JNI_DefineClass(env=%p, name=%s, loader=%p, buf=%p, bufLen=%d", env, name, loader, buf, bufLen);
+       TRACEJNICALLS("_Jv_JNI_DefineClass(env=%p, name=%s, loader=%p, buf=%p, bufLen=%d)", env, name, loader, buf, bufLen);
 
        u  = utf_new_char(name);
        cl = (classloader *) loader;
 
-       c = class_define(u, cl, bufLen, (const uint8_t *) buf);
+       c = class_define(u, cl, bufLen, (const uint8_t *) buf, NULL);
 
        return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) c);
 #else
index 8bed0685538d01a44bd31dc8ab4f4ca84ff237cf..62a1d254957e707ebc55f63447eeb3f8bb38e555 100644 (file)
@@ -126,10 +126,10 @@ java_lang_Class *_Jv_java_lang_ClassLoader_defineClass(java_lang_ClassLoader *cl
        /* check if the JVMTI wants to modify the class */
 
        if (new_class_data == NULL)
-               c = class_define(utfname, loader, new_class_data_len, new_class_data); 
+               c = class_define(utfname, loader, new_class_data_len, new_class_data, pd);
        else
 #endif
-               c = class_define(utfname, loader, len, (const uint8_t *) &data->data[offset]);
+               c = class_define(utfname, loader, len, (const uint8_t *) &data->data[offset], pd);
 
        if (c == NULL)
                return NULL;
index cddf3fbe2991f23f0eb6b86f93f181cd5be588db..80607170255097674795b742d71c095039f24516 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: jvm.c 8384 2007-08-21 14:44:31Z panzi $
+   $Id: jvm.c 8387 2007-08-21 15:37:47Z twisti $
 
 */
 
@@ -86,6 +86,7 @@
 #include "native/vm/reflect.h"
 
 #include "threads/lock-common.h"
+#include "threads/threads-common.h"
 
 #include "toolbox/logging.h"
 
@@ -97,6 +98,7 @@
 #include "vm/primitive.h"
 #include "vm/properties.h"
 #include "vm/resolve.h"
+#include "vm/signallocal.h"
 #include "vm/stringlocal.h"
 #include "vm/vm.h"
 
 #include "vmcore/options.h"
 
 
-/* debugging macro ************************************************************/
+/* debugging macro***********************************************************/
 
 #if !defined(NDEBUG)
+
 # define TRACEJVMCALLS(...) \
     do { \
         if (opt_TraceJVMCalls) { \
             log_println(__VA_ARGS__); \
         } \
     } while (0)
+
+# define PRINTJVMWARNINGS(...)
+/*     do { \ */
+/*         if (opt_PrintJVMWarnings) { \ */
+/*             log_println(__VA_ARGS__); \ */
+/*         } \ */
+/*     } while (0) */
+
 #else
+
 # define TRACEJVMCALLS(...)
+# define PRINTJVMWARNINGS(...)
+
 #endif
 
 
@@ -343,7 +357,9 @@ jlong JVM_FreeMemory(void)
 
 jlong JVM_MaxMemory(void)
 {
-       log_println("JVM_MaxMemory: IMPLEMENT ME!");
+       TRACEJVMCALLS("JVM_MaxMemory()");
+
+       return gc_get_max_heap_size();
 }
 
 
@@ -577,7 +593,8 @@ jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
 
 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
 {
-       log_println("JVM_EnableCompiler: IMPLEMENT ME!");
+       TRACEJVMCALLS("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls);
+       PRINTJVMWARNINGS("JVM_EnableCompiler not supported");
 }
 
 
@@ -585,7 +602,8 @@ void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
 
 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
 {
-       log_println("JVM_DisableCompiler: IMPLEMENT ME!");
+       TRACEJVMCALLS("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls);
+       PRINTJVMWARNINGS("JVM_DisableCompiler not supported");
 }
 
 
@@ -617,11 +635,10 @@ jint JVM_GetLastErrorString(char *buf, int len)
 
 /* JVM_NativePath */
 
-char* JVM_NativePath(char* path)
+char *JVM_NativePath(char *path)
 {
-#if PRINTJVM
-       log_println("JVM_NativePath: path=%s", path);
-#endif
+       TRACEJVMCALLS("JVM_NativePath(path=%s)", path);
+
        /* XXX is this correct? */
 
        return path;
@@ -634,9 +651,7 @@ jclass JVM_GetCallerClass(JNIEnv* env, int depth)
 {
        java_handle_objectarray_t *oa;
 
-#if PRINTJVM
-       log_println("JVM_GetCallerClass: depth=%d", depth);
-#endif
+       TRACEJVMCALLS("JVM_GetCallerClass(env=%p, depth=%d)", env, depth);
 
        oa = stacktrace_getClassContext();
 
@@ -663,7 +678,7 @@ jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
        u = utf_new_char(s);
        c = primitive_class_get_by_name(u);
 
-       return LLNI_classinfo_wrap(c);
+       return (jclass) LLNI_classinfo_wrap(c);
 }
 
 
@@ -671,7 +686,8 @@ jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
 
 void JVM_ResolveClass(JNIEnv* env, jclass cls)
 {
-       log_println("JVM_ResolveClass: IMPLEMENT ME!");
+       TRACEJVMCALLS("JVM_ResolveClass(env=%p, cls=%p)", env, cls);
+       PRINTJVMWARNINGS("JVM_ResolveClass not implemented");
 }
 
 
@@ -679,13 +695,16 @@ void JVM_ResolveClass(JNIEnv* env, jclass cls)
 
 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
 {
-       classinfo *c;
+       classinfo   *c;
+       utf         *u;
+       classloader *cl;
 
-#if PRINTJVM
-       log_println("JVM_FindClassFromClassLoader: name=%s, init=%d, loader=%p, throwError=%d", name, init, loader, throwError);
-#endif
+       TRACEJVMCALLS("JVM_FindClassFromClassLoader: name=%s, init=%d, loader=%p, throwError=%d", name, init, loader, throwError);
+
+       u  = utf_new_char(name);
+       cl = (classloader *) loader;
 
-       c = load_class_from_classloader(utf_new_char(name), (classloader *) loader);
+       c = load_class_from_classloader(u, cl);
 
        if (c == NULL)
                return NULL;
@@ -695,7 +714,7 @@ jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init
                        if (!initialize_class(c))
                                return NULL;
 
-       return LLNI_classinfo_wrap(c);
+       return (jclass) LLNI_classinfo_wrap(c);
 }
 
 
@@ -719,13 +738,20 @@ jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyt
 
 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
 {
-#if PRINTJVM
-       log_println("JVM_DefineClassWithSource: name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s", name, loader, buf, len, pd, source);
-#endif
-       /* XXX do something with pd and source */
+       classinfo   *c;
+       utf         *u;
+       classloader *cl;
 
-       return LLNI_classinfo_wrap( class_define(utf_new_char(name), (classloader *) loader, len, (u1 *) buf) );
+       TRACEJVMCALLS("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source);
+
+       u  = utf_new_char(name);
+       cl = (classloader *) loader;
 
+       /* XXX do something with source */
+
+       c = class_define(u, cl, len, (const uint8_t *) buf, (java_handle_t *) pd);
+
+       return (jclass) LLNI_classinfo_wrap(c);
 }
 
 
@@ -737,16 +763,14 @@ jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
        utf         *u;
        classinfo   *c;
 
-       cl = (classloader *) loader;
+       TRACEJVMCALLS("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name);
 
-#if PRINTJVM
-       log_println("JVM_FindLoadedClass(loader=%p, name=%p)", loader, name);
-#endif
+       cl = (classloader *) loader;
 
        u = javastring_toutf((java_handle_t *) name, true);
        c = classcache_lookup(cl, u);
 
-       return LLNI_classinfo_wrap(c);
+       return (jclass) LLNI_classinfo_wrap(c);
 }
 
 
@@ -782,9 +806,8 @@ jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
 
 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
 {
-#if PRINTJVM
-       log_println("JVM_GetClassLoader: cls=%p", cls);
-#endif
+       TRACEJVMCALLS("JVM_GetClassLoader(env=%p, cls=%p)", env, cls);
+
        return (jobject) _Jv_java_lang_Class_getClassLoader((java_lang_Class *) cls);
 }
 
@@ -827,9 +850,7 @@ jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
 {
        classinfo *c;
 
-#if PRINTJVM || 1
-       log_println("JVM_GetProtectionDomain: cls=%p");
-#endif
+       TRACEJVMCALLS("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls);
 
        c = LLNI_classinfo_unwrap(cls);
 
@@ -843,7 +864,7 @@ jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
        if (class_is_primitive(c))
                return NULL;
 
-       return NULL;
+       return (jobject) c->protectiondomain;
 }
 
 
@@ -959,7 +980,7 @@ jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
        
        component = class_get_componenttype(c);
 
-       return LLNI_classinfo_wrap(component);
+       return (jclass) LLNI_classinfo_wrap(component);
 }
 
 
@@ -1002,16 +1023,16 @@ jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
 
 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
 {
-       classinfo *c = LLNI_classinfo_unwrap(ofClass);
+       classinfo *c;
+       classinfo *dc;
 
-       TRACEJVMCALLS("JVM_GetDeclaringClass: ofClass=%p", ofClass);
+       TRACEJVMCALLS("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass);
 
-       if(c == NULL) {
-               exceptions_throw_nullpointerexception();
-               return NULL;
-       }
+       c = LLNI_classinfo_unwrap(ofClass);
+
+       dc = class_get_declaringclass(c);
 
-       return LLNI_classinfo_wrap(class_get_declaringclass(c));
+       return (jclass) LLNI_classinfo_wrap(dc);
 }
 
 
@@ -1019,7 +1040,26 @@ jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
 
 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
 {
-       log_println("JVM_GetClassSignature: IMPLEMENT ME!");
+       classinfo     *c;
+       utf           *u;
+       java_object_t *s;
+
+       TRACEJVMCALLS("JVM_GetClassSignature(env=%p, cls=%p)", env, cls);
+
+       c = (classinfo *) cls;
+
+       /* Get the signature of the class. */
+
+       u = class_get_signature(c);
+
+       if (u == NULL)
+               return NULL;
+
+       /* Convert UTF-string to a Java-string. */
+
+       s = javastring_new(u);
+
+       return (jstring) s;
 }
 
 
@@ -1227,9 +1267,13 @@ jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
 
 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
 {
-       classinfo *cls = LLNI_classinfo_unwrap(jcpool);
-       TRACEJVMCALLS("JVM_ConstantPoolGetSize: jcpool=%p", jcpool);
-       return cls->cpcount;
+       classinfo *c;
+
+       TRACEJVMCALLS("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool);
+
+       c = LLNI_classinfo_unwrap(jcpool);
+
+       return c->cpcount;
 }
 
 
@@ -1238,17 +1282,21 @@ jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
 {
        constant_classref *ref;
-       classinfo *cls = LLNI_classinfo_unwrap(jcpool);
-       
-       TRACEJVMCALLS("JVM_ConstantPoolGetClassAt: jcpool=%p, index=%d", jcpool, index);
+       classinfo         *c;
+       classinfo         *result;
 
-       ref = (constant_classref*)class_getconstant(cls, index, CONSTANT_Class);
+       TRACEJVMCALLS("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index);
 
-       if (ref == NULL) {
+       c = LLNI_classinfo_unwrap(jcpool);
+
+       ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
+
+       if (ref == NULL)
                return NULL;
-       }
 
-       return LLNI_classinfo_wrap(resolve_classref_eager(ref));
+       result = resolve_classref_eager(ref);
+
+       return (jclass) LLNI_classinfo_wrap(result);
 }
 
 
@@ -1257,26 +1305,26 @@ jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, j
 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
 {
        constant_classref *ref;
-       classinfo *c = NULL;
-       classinfo *cls = LLNI_classinfo_unwrap(jcpool);
+       classinfo         *c;
+       classinfo         *result;
 
-       TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
+       TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index);
 
-       ref = (constant_classref*)class_getconstant(cls, index, CONSTANT_Class);
+       c = LLNI_classinfo_unwrap(jcpool);
 
-       if (ref == NULL) {
+       ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
+
+       if (ref == NULL)
                return NULL;
-       }
        
-       if (!resolve_classref(NULL, ref, resolveLazy, true, true, &c)) {
+       if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result))
                return NULL;
-       }
 
-       if (c == NULL || !(c->state & CLASS_LOADED)) {
+       if ((result == NULL) || !(result->state & CLASS_LOADED)) {
                return NULL;
        }
        
-       return LLNI_classinfo_wrap(c);
+       return (jclass) LLNI_classinfo_wrap(result);
 }
 
 
@@ -1504,7 +1552,9 @@ jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, j
 
 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
 {
-       log_println("JVM_DesiredAssertionStatus: cls=%p, IMPLEMENT ME!", cls);
+       TRACEJVMCALLS("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls);
+
+       /* TODO: Implement this one, but false should be OK. */
 
        return false;
 }
@@ -1858,69 +1908,21 @@ jint JVM_Write(jint fd, char *buf, jint nbytes)
 
 jint JVM_Available(jint fd, jlong *pbytes)
 {
-       TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
-
 #if defined(FIONREAD)
        int bytes;
 
+       TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
+
+       *pbytes = 0;
+
        if (ioctl(fd, FIONREAD, &bytes) < 0)
                return 0;
 
        *pbytes = bytes;
 
        return 1;
-#elif defined(HAVE_FSTAT)
-       struct stat statBuffer;
-       off_t n;
-       int result;
-
-       *pbytes = 0;
-
-       if ((fstat(fd, &statBuffer) == 0) && S_ISREG (statBuffer.st_mode)) {
-               n = lseek (fd, 0, SEEK_CUR);
-
-               if (n != -1) {
-                       *pbytes = statBuffer.st_size - n; 
-                       result = 1;
-               }
-               else {
-                       result = 0;
-               }
-       }
-       else {
-               result = 0;
-       }
-  
-       return result;
-#elif defined(HAVE_SELECT)
-       fd_set filedescriptset;
-       struct timeval tv;
-       int result;
-
-       *pbytes = 0;
-  
-       FD_ZERO(&filedescriptset);
-       FD_SET(fd, &filedescriptset);
-       memset(&tv, 0, sizeof(tv));
-
-       switch (select(fd+1, &filedescriptset, NULL, NULL, &tv))
-               {
-               case -1: 
-                       result = errno; 
-                       break;
-               case  0:
-                       *pbytes = 0;
-                       result = CPNATIVE_OK;
-                       break;      
-               default: 
-                       *pbytes = 1;
-                       result = CPNATIVE_OK;
-                       break;
-               }
-       return result;
 #else
-       *pbytes = 0;
-       return 0;
+# error FIONREAD not defined
 #endif
 }
 
@@ -2013,7 +2015,9 @@ void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
 
 void JVM_Yield(JNIEnv *env, jclass threadClass)
 {
-       log_println("JVM_Yield: IMPLEMENT ME!");
+       TRACEJVMCALLS("JVM_Yield(env=%p, threadClass=%p)", env, threadClass);
+
+       threads_yield();
 }
 
 
@@ -2095,6 +2099,9 @@ jclass JVM_CurrentLoadedClass(JNIEnv *env)
 
 jobject JVM_CurrentClassLoader(JNIEnv *env)
 {
+    /* XXX if a method in a class in a trusted loader is in a
+          doPrivileged, return NULL */
+
        log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
 }
 
@@ -2131,7 +2138,7 @@ jint JVM_ClassLoaderDepth(JNIEnv *env)
 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
 {
        log_println("JVM_GetSystemPackage(env=%p, name=%p)");
-       javastring_print(name);
+       javastring_print((java_handle_t *) name);
        printf("\n");
 
        return NULL;
@@ -2197,12 +2204,20 @@ jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
 {
        java_handle_t *a;
+       java_handle_t *o;
 
        TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
 
        a = (java_handle_t *) arr;
 
-       return (jobject)array_element_get(a, index);
+/*     if (!class_is_array(a->objheader.vftbl->class)) { */
+/*             exceptions_throw_illegalargumentexception(); */
+/*             return NULL; */
+/*     } */
+
+       o = array_element_get(a, index);
+
+       return (jobject) o;
 }
 
 
@@ -2219,14 +2234,14 @@ jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint w
 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
 {
        java_handle_t *a;
-       java_handle_t *o;
+       java_handle_t *value;
 
-       TRACEJVMCALLS("JVM_SetArrayElement(arr=%p, index=%d, val=%p)", arr, index, val);
-       
-       a = (java_handle_t *) arr;
-       o = (java_handle_t *) val;
+       TRACEJVMCALLS("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val);
+
+       a     = (java_handle_t *) arr;
+       value = (java_handle_t *) val;
 
-       array_element_set(a, index, o);
+       array_element_set(a, index, value);
 }
 
 
@@ -2287,9 +2302,8 @@ jint JVM_InitializeSocketLibrary()
 
 jint JVM_Socket(jint domain, jint type, jint protocol)
 {
-#if PRINTJVM || 1
-       log_println("JVM_Socket: domain=%d, type=%d, protocol=%d", domain, type, protocol);
-#endif
+       TRACEJVMCALLS("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol);
+
        return socket(domain, type, protocol);
 }
 
@@ -2298,9 +2312,8 @@ jint JVM_Socket(jint domain, jint type, jint protocol)
 
 jint JVM_SocketClose(jint fd)
 {
-#if PRINTJVM || 1
-       log_println("JVM_SocketClose: fd=%d", fd);
-#endif
+       TRACEJVMCALLS("JVM_SocketClose(fd=%d)", fd);
+
        return close(fd);
 }
 
@@ -2309,9 +2322,8 @@ jint JVM_SocketClose(jint fd)
 
 jint JVM_SocketShutdown(jint fd, jint howto)
 {
-#if PRINTJVM || 1
-       log_println("JVM_SocketShutdown: fd=%d, howto=%d", fd, howto);
-#endif
+       TRACEJVMCALLS("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto);
+
        return shutdown(fd, howto);
 }
 
@@ -2344,9 +2356,8 @@ jint JVM_Timeout(int fd, long timeout)
 
 jint JVM_Listen(jint fd, jint count)
 {
-#if PRINTJVM || 1
-       log_println("JVM_Listen: fd=%d, count=%d", fd, count);
-#endif
+       TRACEJVMCALLS("JVM_Listen(fd=%d, count=%d)", fd, count);
+
        return listen(fd, count);
 }
 
@@ -2355,9 +2366,8 @@ jint JVM_Listen(jint fd, jint count)
 
 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
 {
-#if PRINTJVM || 1
-       log_println("JVM_Connect: fd=%d, him=%p, len=%d", fd, him, len);
-#endif
+       TRACEJVMCALLS("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len);
+
        return connect(fd, him, len);
 }
 
@@ -2374,9 +2384,8 @@ jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
 
 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
 {
-#if PRINTJVM || 1
-       log_println("JVM_Accept: fd=%d, him=%p, len=%p", fd, him, len);
-#endif
+       TRACEJVMCALLS("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len);
+
        return accept(fd, him, (socklen_t *) len);
 }
 
@@ -2393,9 +2402,8 @@ jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *fr
 
 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
 {
-#if PRINTJVM || 1
-       log_println("JVM_GetSockName: fd=%d, him=%p, len=%p", fd, him, len);
-#endif
+       TRACEJVMCALLS("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len);
+
        return getsockname(fd, him, (socklen_t *) len);
 }
 
@@ -2428,9 +2436,8 @@ jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
 
 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
 {
-#if PRINTJVM || 1
-       log_println("JVM_SetSockOpt: fd=%d, level=%d, optname=%d, optval=%s, optlen=%d", fd, level, optname, optval, optlen);
-#endif
+       TRACEJVMCALLS("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen);
+
        return setsockopt(fd, level, optname, optval, optlen);
 }
 
@@ -2439,9 +2446,8 @@ jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int opt
 
 int JVM_GetHostName(char* name, int namelen)
 {
-#if PRINTJVM || 1
-       log_println("JVM_GetHostName: name=%s, namelen=%d", name, namelen);
-#endif
+       TRACEJVMCALLS("JVM_GetHostName(name=%s, namelen=%d)", name, namelen);
+
        return gethostname(name, namelen);
 }
 
@@ -2472,12 +2478,15 @@ struct protoent* JVM_GetProtoByName(char* name)
 
 /* JVM_LoadLibrary */
 
-void* JVM_LoadLibrary(const char* name)
+void *JVM_LoadLibrary(const char *name)
 {
-#if PRINTJVM
-       log_println("JVM_LoadLibrary: name=%s", name);
-#endif
-    return native_library_open(utf_new_char(name));
+       utf *u;
+
+       TRACEJVMCALLS("JVM_LoadLibrary(name=%s)", name);
+
+       u = utf_new_char(name);
+
+       return native_library_open(u);
 }
 
 
@@ -2491,13 +2500,11 @@ void JVM_UnloadLibrary(void* handle)
 
 /* JVM_FindLibraryEntry */
 
-void* JVM_FindLibraryEntry(void* handle, const char* name)
+void *JVM_FindLibraryEntry(void *handle, const char *name)
 {
        lt_ptr symbol;
 
-#if PRINTJVM
-       log_println("JVM_FindLibraryEntry: handle=%p, name=%s", handle, name);
-#endif
+       TRACEJVMCALLS("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name);
 
        symbol = lt_dlsym(handle, name);
 
@@ -2517,9 +2524,8 @@ jboolean JVM_IsNaN(jdouble a)
 
 jboolean JVM_IsSupportedJNIVersion(jint version)
 {
-#if PRINTJVM
-       log_println("JVM_IsSupportedJNIVersion: version=%d", version);
-#endif
+       TRACEJVMCALLS("JVM_IsSupportedJNIVersion(version=%d)", version);
+
        switch (version) {
        case JNI_VERSION_1_1:
        case JNI_VERSION_1_2:
@@ -2807,15 +2813,212 @@ jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
 
 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
 {
-       log_println("JVM_GetThreadStateValues: IMPLEMENT ME!");
+       java_handle_intarray_t *ia;
+
+       TRACEJVMCALLS("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
+                                 env, javaThreadState);
+
+       /* If new thread states are added in future JDK and VM versions,
+          this should check if the JDK version is compatible with thread
+          states supported by the VM.  Return NULL if not compatible.
+       
+          This function must map the VM java_lang_Thread::ThreadStatus
+          to the Java thread state that the JDK supports. */
+
+       switch (javaThreadState) {
+    case THREAD_STATE_NEW:
+               ia = builtin_newarray_int(1);
+
+               if (ia == NULL)
+                       return NULL;
+
+               array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
+               break; 
+
+    case THREAD_STATE_RUNNABLE:
+               ia = builtin_newarray_int(1);
+
+               if (ia == NULL)
+                       return NULL;
+
+               array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
+               break; 
+
+    case THREAD_STATE_BLOCKED:
+               ia = builtin_newarray_int(1);
+
+               if (ia == NULL)
+                       return NULL;
+
+               array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
+               break; 
+
+    case THREAD_STATE_WAITING:
+               ia = builtin_newarray_int(2);
+
+               if (ia == NULL)
+                       return NULL;
+
+               array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
+               /* XXX Implement parked stuff. */
+/*             array_intarray_element_set(ia, 1, PARKED); */
+               break; 
+
+    case THREAD_STATE_TIMED_WAITING:
+               ia = builtin_newarray_int(3);
+
+               if (ia == NULL)
+                       return NULL;
+
+               /* XXX Not sure about that one. */
+/*             array_intarray_element_set(ia, 0, SLEEPING); */
+               array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
+               /* XXX Implement parked stuff. */
+/*             array_intarray_element_set(ia, 2, PARKED); */
+               break; 
+
+    case THREAD_STATE_TERMINATED:
+               ia = builtin_newarray_int(1);
+
+               if (ia == NULL)
+                       return NULL;
+
+               array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
+               break; 
+
+    default:
+               /* Unknown state - probably incompatible JDK version */
+               return NULL;
+       }
+
+       return (jintArray) ia;
 }
 
 
-/* JVM_GetThreadStateValues */
+/* JVM_GetThreadStateNames */
 
 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
 {
-       log_println("JVM_GetThreadStateValues: IMPLEMENT ME!");
+       java_handle_intarray_t    *ia;
+       java_handle_objectarray_t *oa;
+       java_object_t             *s;
+
+       TRACEJVMCALLS("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
+                                 env, javaThreadState, values);
+
+       ia = (java_handle_intarray_t *) values;
+
+       /* If new thread states are added in future JDK and VM versions,
+          this should check if the JDK version is compatible with thread
+          states supported by the VM.  Return NULL if not compatible.
+       
+          This function must map the VM java_lang_Thread::ThreadStatus
+          to the Java thread state that the JDK supports. */
+
+       if (values == NULL) {
+               exceptions_throw_nullpointerexception();
+               return NULL;
+       }
+
+       switch (javaThreadState) {
+    case THREAD_STATE_NEW:
+               assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
+
+               oa = builtin_anewarray(1, class_java_lang_String);
+
+               if (oa == NULL)
+                       return NULL;
+
+               s = javastring_new(utf_new_char("NEW"));
+
+               if (s == NULL)
+                       return NULL;
+
+               array_objectarray_element_set(oa, 0, s);
+               break; 
+
+    case THREAD_STATE_RUNNABLE:
+               oa = builtin_anewarray(1, class_java_lang_String);
+
+               if (oa == NULL)
+                       return NULL;
+
+               s = javastring_new(utf_new_char("RUNNABLE"));
+
+               if (s == NULL)
+                       return NULL;
+
+               array_objectarray_element_set(oa, 0, s);
+               break; 
+
+    case THREAD_STATE_BLOCKED:
+               oa = builtin_anewarray(1, class_java_lang_String);
+
+               if (oa == NULL)
+                       return NULL;
+
+               s = javastring_new(utf_new_char("BLOCKED"));
+
+               if (s == NULL)
+                       return NULL;
+
+               array_objectarray_element_set(oa, 0, s);
+               break; 
+
+    case THREAD_STATE_WAITING:
+               oa = builtin_anewarray(2, class_java_lang_String);
+
+               if (oa == NULL)
+                       return NULL;
+
+               s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
+/*             s = javastring_new(utf_new_char("WAITING.PARKED")); */
+
+               if (s == NULL)
+                       return NULL;
+
+               array_objectarray_element_set(oa, 0, s);
+/*             array_objectarray_element_set(oa, 1, s); */
+               break; 
+
+    case THREAD_STATE_TIMED_WAITING:
+               oa = builtin_anewarray(3, class_java_lang_String);
+
+               if (oa == NULL)
+                       return NULL;
+
+/*             s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
+               s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
+/*             s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
+
+               if (s == NULL)
+                       return NULL;
+
+/*             array_objectarray_element_set(oa, 0, s); */
+               array_objectarray_element_set(oa, 0, s);
+/*             array_objectarray_element_set(oa, 2, s); */
+               break; 
+
+    case THREAD_STATE_TERMINATED:
+               oa = builtin_anewarray(1, class_java_lang_String);
+
+               if (oa == NULL)
+                       return NULL;
+
+               s = javastring_new(utf_new_char("TERMINATED"));
+
+               if (s == NULL)
+                       return NULL;
+
+               array_objectarray_element_set(oa, 0, s);
+               break; 
+
+       default:
+               /* Unknown state - probably incompatible JDK version */
+               return NULL;
+       }
+
+       return (jobjectArray) oa;
 }
 
 
@@ -2829,10 +3032,44 @@ void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
 
 /* OS: JVM_RegisterSignal */
 
-void* JVM_RegisterSignal(jint sig, void* handler)
+void *JVM_RegisterSignal(jint sig, void *handler)
 {
-       log_println("JVM_RegisterSignal: sig=%d, handler=%p, IMPLEMENT ME!", sig, handler);
-       return NULL;
+       functionptr newHandler;
+
+       TRACEJVMCALLS("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler);
+
+       if (handler == (void *) 2)
+               newHandler = (functionptr) signal_thread_handler;
+       else
+               newHandler = (functionptr) (uintptr_t) handler;
+
+       switch (sig) {
+    case SIGILL:
+    case SIGFPE:
+    case SIGUSR1:
+    case SIGSEGV:
+               /* These signals are already used by the VM. */
+               return (void *) -1;
+
+    case SIGQUIT:
+               /* This signal is used by the VM to dump thread stacks unless
+                  ReduceSignalUsage is set, in which case the user is allowed
+                  to set his own _native_ handler for this signal; thus, in
+                  either case, we do not allow JVM_RegisterSignal to change
+                  the handler. */
+               return (void *) -1;
+
+       case SIGHUP:
+       case SIGINT:
+       case SIGTERM:
+               break;
+       }
+
+       signal_register_signal(sig, newHandler, 0);
+
+       /* XXX Should return old handler. */
+
+       return (void *) 2;
 }
 
 
@@ -2840,7 +3077,7 @@ void* JVM_RegisterSignal(jint sig, void* handler)
 
 jboolean JVM_RaiseSignal(jint sig)
 {
-       log_println("JVM_RaiseSignal: sig=%s", sig);
+       log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
        return false;
 }
 
@@ -2849,8 +3086,22 @@ jboolean JVM_RaiseSignal(jint sig)
 
 jint JVM_FindSignal(const char *name)
 {
-       log_println("JVM_FindSignal: name=%s", name);
-       return 0;
+       TRACEJVMCALLS("JVM_FindSignal(name=%s)", name);
+
+#if defined(__LINUX__)
+       if (strcmp(name, "HUP") == 0)
+               return SIGHUP;
+
+       if (strcmp(name, "INT") == 0)
+               return SIGINT;
+
+       if (strcmp(name, "TERM") == 0)
+               return SIGTERM;
+#else
+# error not implemented for this OS
+#endif
+
+       return -1;
 }
 
 
index cb7e977c84687868ea3ff2e31a9f786a96f7413e..4650bad4c8702d51042109955aeabb509c7f9c4d 100644 (file)
@@ -30,6 +30,7 @@
 #include "config.h"
 
 #include <stdint.h>
+#include <unistd.h>
 
 #include "mm/memory.h"
 
@@ -54,6 +55,7 @@
 
 #include "native/include/sun_misc_Unsafe.h"
 
+#include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/initialize.h"
 #include "vm/stringlocal.h"
@@ -73,10 +75,13 @@ 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 },
+       { "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 },
+       { "putFloat",               "(Ljava/lang/Object;JF)V",                                    (void *) (intptr_t) &Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF },
        { "getByte",                "(J)B",                                                       (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__J                     },
        { "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                     },
        { "putLong",                "(JJ)V",                                                      (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__JJ                    },
        { "objectFieldOffset",      "(Ljava/lang/reflect/Field;)J",                               (void *) (intptr_t) &Java_sun_misc_Unsafe_objectFieldOffset              },
@@ -88,13 +93,16 @@ static JNINativeMethod methods[] = {
        { "arrayBaseOffset",        "(Ljava/lang/Class;)I",                                       (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayBaseOffset                },
        { "arrayIndexScale",        "(Ljava/lang/Class;)I",                                       (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayIndexScale                },
        { "addressSize",            "()I",                                                        (void *) (intptr_t) &Java_sun_misc_Unsafe_addressSize                    },
+       { "pageSize",               "()I",                                                        (void *) (intptr_t) &Java_sun_misc_Unsafe_pageSize                       },
        { "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 },
+       { "allocateInstance",       "(Ljava/lang/Class;)Ljava/lang/Object;",                      (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateInstance               },
        { "throwException",         "(Ljava/lang/Throwable;)V",                                   (void *) (intptr_t) &Java_sun_misc_Unsafe_throwException                 },
        { "compareAndSwapObject",   "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject           },
        { "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              },
        { "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                         },
        { "park",                   "(ZJ)V",                                                      (void *) (intptr_t) &Java_sun_misc_Unsafe_park                           },
 };
@@ -261,6 +269,21 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEn
 }
 
 
+/*
+ * Class:     sun/misc/Unsafe
+ * Method:    putShort
+ * Signature: (Ljava/lang/Object;JS)V
+ */
+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)
+{
+       int32_t *p;
+
+       p = (int32_t *) (((uint8_t *) o) + offset);
+
+       *p = x;
+}
+
+
 /*
  * Class:     sun/misc/Unsafe
  * Method:    getChar
@@ -294,6 +317,21 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(JNIEn
 }
 
 
+/*
+ * Class:     sun/misc/Unsafe
+ * Method:    putFloat
+ * Signature: (Ljava/lang/Object;JF)V
+ */
+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)
+{
+       float *p;
+
+       p = (float *) (((uint8_t *) o) + offset);
+
+       *p = x;
+}
+
+
 /*
  * Class:     sun/misc/Unsafe
  * Method:    getByte
@@ -330,6 +368,21 @@ JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, sun_misc_U
 }
 
 
+/*
+ * Class:     sun/misc/Unsafe
+ * Method:    putInt
+ * Signature: (JI)V
+ */
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__JI(JNIEnv *env, struct sun_misc_Unsafe* this, int64_t address, int32_t value)
+{
+       int32_t *p;
+
+       p = (int32_t *) (intptr_t) address;
+
+       *p = value;
+}
+
+
 /*
  * Class:     sun/misc/Unsafe
  * Method:    getLong
@@ -530,6 +583,21 @@ JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv *env, sun_misc
 }
 
 
+/*
+ * Class:     sun/misc/Unsafe
+ * Method:    pageSize
+ * Signature: ()I
+ */
+JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_pageSize(JNIEnv *env, sun_misc_Unsafe *this)
+{
+       int sz;
+
+       sz = getpagesize();
+
+       return sz;
+}
+
+
 /*
  * Class:     sun/misc/Unsafe
  * Method:    defineClass
@@ -569,7 +637,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 *) &b->data[off]);
+       c = class_define(utfname, cl, len, (const uint8_t *) &b->data[off],
+                                        protectionDomain);
 
        if (c == NULL)
                return NULL;
@@ -588,6 +657,24 @@ JNIEXPORT java_lang_Class* JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_
 }
 
 
+/*
+ * Class:     sun/misc/Unsafe
+ * Method:    allocateInstance
+ * Signature: (Ljava/lang/Class;)Ljava/lang/Object;
+ */
+JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_allocateInstance(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *cls)
+{
+       classinfo     *c;
+       java_object_t *o;
+
+       c = LLNI_classinfo_unwrap(cls);
+
+       o = builtin_new(c);
+
+       return (java_lang_Object *) o;
+}
+
+
 /*
  * Class:     sun/misc/Unsafe
  * Method:    throwException
@@ -717,6 +804,24 @@ JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, sun_m
 }
 
 
+/*
+ * Class:     sun/misc/Unsafe
+ * Method:    getLongVolatile
+ * Signature: (Ljava/lang/Object;J)J
+ */
+JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLongVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
+{
+       volatile int64_t *p;
+       volatile int64_t  value;
+
+       p = (volatile int64_t *) (((uint8_t *) o) + offset);
+
+       value = *p;
+
+       return value;
+}
+
+
 /*
  * Class:     sun/misc/Unsafe
  * Method:    unpark
index 05f04dffd456390b493828282e52c45bfb1ff38c..e0676a3707f42da4b76cbd3f06d614908deeec87 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: class.c 8339 2007-08-17 21:21:51Z twisti $
+   $Id: class.c 8387 2007-08-21 15:37:47Z twisti $
 
 */
 
@@ -294,7 +294,7 @@ void class_postset_header_vftbl(void)
 
 *******************************************************************************/
 
-classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data)
+classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data, java_handle_t *pd)
 {
        classinfo   *c;
        classinfo   *r;
@@ -360,6 +360,14 @@ classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_
                return NULL;
        }
 
+#if defined(ENABLE_JAVASE)
+# if defined(WITH_CLASSPATH_SUN)
+       /* Store the protection domain. */
+
+       c->protectiondomain = pd;
+# endif
+#endif
+
        /* Store the newly defined class in the class cache. This call
           also checks whether a class of the same name has already been
           defined by the same defining loader, and if so, replaces the
@@ -1533,11 +1541,12 @@ static classinfo *class_resolve_superclass(classinfo *c)
        if (c->super.any == NULL)
                return NULL;
 
-       /* Do we have a super class reference or is it already
-          resolved? */
+       /* Check if the super class is a reference. */
 
        if (IS_CLASSREF(c->super)) {
+               /* XXX I'm very sure this is not correct. */
                super = resolve_classref_or_classinfo_eager(c->super, true);
+/*             super = resolve_classref_or_classinfo_eager(c->super, false); */
 
                if (super == NULL)
                        return NULL;
@@ -1566,7 +1575,13 @@ bool class_issubclass(classinfo *sub, classinfo *super)
                if (sub == super)
                        return true;
 
-               sub = class_resolve_superclass(sub);
+/*             sub = class_resolve_superclass(sub); */
+               if (sub->super.any == NULL)
+                       return false;
+
+               assert(IS_CLASSREF(sub->super) == 0);
+
+               sub = sub->super.cls;
        }
 }
 
index adad38f082a3fe5021ffea8aac9302c3cf43e597..9054cc5a33d950fc065fdad638d704fae8e7f843 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: class.h 8344 2007-08-17 22:03:21Z twisti $
+   $Id: class.h 8387 2007-08-21 15:37:47Z twisti $
 
 */
 
@@ -157,6 +157,12 @@ struct classinfo {                /* class structure                          */
 #endif
 #endif
        classloader *classloader;       /* NULL for bootstrap classloader         */
+
+#if defined(ENABLE_JAVASE)
+# if defined(WITH_CLASSPATH_SUN)
+       java_object_t *protectiondomain;
+# endif
+#endif
 };
 
 
@@ -303,7 +309,7 @@ extern classinfo *pseudo_class_New;
 
 classinfo *class_create_classinfo(utf *u);
 void       class_postset_header_vftbl(void);
-classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data);
+classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data, java_handle_t *pd);
 void       class_set_packagename(classinfo *c);
 
 bool       class_load_attributes(classbuffer *cb);