exceptionptr update for native threads
authorstefan <none@none>
Tue, 6 Jan 2004 23:42:01 +0000 (23:42 +0000)
committerstefan <none@none>
Tue, 6 Jan 2004 23:42:01 +0000 (23:42 +0000)
46 files changed:
builtin.c
builtin.h
headers.c
jit/alpha/codegen.c
jit/i386/codegen.c
jit/mips/codegen.c
jit/powerpc/codegen.c
jit/x86_64/codegen.c
jni.c
loader.c
main.c
mm/boehm.c
nat/Field.c
nat/Thread.c
nat/VMClass.c
nat/VMClassLoader.c
nat/VMObject.c
nat/VMSystem.c
native.c
native.h
src/cacao/cacao.c
src/cacaoh/headers.c
src/mm/boehm.c
src/native/jni.c
src/native/native.c
src/native/native.h
src/native/vm/Field.c
src/native/vm/VMClass.c
src/native/vm/VMClassLoader.c
src/native/vm/VMObject.c
src/native/vm/VMSystem.c
src/native/vm/VMThread.c
src/threads/green/locks.c
src/threads/green/threads.c
src/threads/green/threads.h
src/vm/builtin.c
src/vm/builtin.h
src/vm/jit/alpha/codegen.c
src/vm/jit/i386/codegen.c
src/vm/jit/mips/codegen.c
src/vm/jit/powerpc/codegen.c
src/vm/jit/x86_64/codegen.c
src/vm/loader.c
threads/locks.c
threads/thread.c
threads/thread.h

index 7779e88a0c889b730df5b352e219ff93aace241f..68bcb9b720769636f6f457e1fe2d1bc3e6655f9d 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -34,7 +34,7 @@
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 853 2004-01-06 15:36:25Z twisti $
+   $Id: builtin.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -388,34 +388,20 @@ java_objectheader *builtin_throw_exception(java_objectheader *local_exceptionptr
                        }
                log_text(logtext);
        }
-       exceptionptr = local_exceptionptr;
+       *exceptionptr = local_exceptionptr;
        return local_exceptionptr;
 }
 
-java_objectheader *builtin_get_exceptionptr()
+void builtin_reset_exceptionptr()
 {
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
 #ifdef HAVE___THREAD
-       return exceptionptr;
+       _exceptionptr = NULL;
 #else
-       pthread_getspecific(tkey_exceptionptr);
+       ((nativethread*) pthread_getspecific(tkey_exceptionptr))->_exceptionptr = 0;
 #endif
 #else
-       panic("builtin_get_exceptionptr should not be used in this configuration");
-       return NULL;
-#endif
-}
-
-void builtin_set_exceptionptr(java_objectheader *e)
-{
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
-#ifdef HAVE___THREAD
-       exceptionptr = e;
-#else
-       pthread_setspecific(tkey_exceptionptr, e);
-#endif
-#else
-       panic("builtin_set_exceptionptr should not be used in this configuration");
+       panic("builtin_reset_exceptionptr should not be used in this configuration");
 #endif
 }
 
@@ -639,7 +625,7 @@ java_arrayheader *builtin_newarray(s4 size, vftbl *arrayvftbl)
        s4 actualsize;
 
        if (size<0) {
-               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/NegativeArraySizeException")));
+               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/NegativeArraySizeException")));
                return NULL;
        }
 #ifdef SIZE_FROM_CLASSINFO
@@ -649,7 +635,7 @@ java_arrayheader *builtin_newarray(s4 size, vftbl *arrayvftbl)
 #endif
 
        if (((u4)actualsize)<((u4)size)) { /* overflow */
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/OutOfMemoryError")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/OutOfMemoryError")));
                return NULL;
        }
        a = heap_allocate(actualsize,
@@ -861,7 +847,7 @@ java_arrayheader *builtin_nmultianewarray (int n, vftbl *arrayvftbl, long *dims)
 
 u4 methodindent = 0;
 
-java_objectheader *builtin_trace_exception(java_objectheader *exceptionptr,
+java_objectheader *builtin_trace_exception(java_objectheader *_exceptionptr,
                                                                                   methodinfo *method, int *pos, 
                                                                                   int noindent)
 {
@@ -873,8 +859,8 @@ java_objectheader *builtin_trace_exception(java_objectheader *exceptionptr,
        }
        if (verbose || runverbose) {
                printf("Exception ");
-               if (exceptionptr) {
-                       utf_display (exceptionptr->vftbl->class->name);
+               if (_exceptionptr) {
+                       utf_display (_exceptionptr->vftbl->class->name);
                }
                else {
                        printf("Error: <Nullpointer instead of exception>");
@@ -905,7 +891,7 @@ java_objectheader *builtin_trace_exception(java_objectheader *exceptionptr,
                        printf("call_java_method\n");
                fflush (stdout);
        }
-       return exceptionptr;
+       return _exceptionptr;
 }
 
 
index e2d48bd7501b6b2a30d4c5021433a5f3483ca0fd..63c407205a6e2525dd6b4b781f3c226f2820de93 100644 (file)
--- a/builtin.h
+++ b/builtin.h
@@ -28,7 +28,7 @@
 
    Changes: Edwin Steiner
 
-   $Id: builtin.h 851 2004-01-05 23:59:28Z stefan $
+   $Id: builtin.h 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -37,6 +37,7 @@
 #define _BUILTIN_H
 
 #include "config.h"
+#include "toolbox/loging.h"
 
 
 /* define infinity for floating point numbers */
@@ -115,7 +116,24 @@ extern builtin_descriptor builtin_desc[];
 /* GLOBAL VARIABLES                                                   */
 /**********************************************************************/
 
-extern java_objectheader* exceptionptr;
+#define THREADSPECIFIC
+#define exceptionptr (&_exceptionptr)
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+#ifdef HAVE___THREAD
+
+#undef THREADSPECIFIC
+#define THREADSPECIFIC __thread
+
+#else
+
+#undef exceptionptr
+#define exceptionptr builtin_get_exceptionptrptr()
+
+#endif
+#endif
+
+extern THREADSPECIFIC java_objectheader* _exceptionptr;
 
 
 /**********************************************************************/
@@ -167,14 +185,14 @@ s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl *target);
 
 java_objectheader *builtin_throw_exception(java_objectheader *exception);
 /* NOT AN OP */
-java_objectheader *builtin_trace_exception(java_objectheader *exceptionptr,
+java_objectheader *builtin_trace_exception(java_objectheader *_exceptionptr,
                                                                                   methodinfo *method, 
                                                                                   int *pos, int noindent);
 /* NOT AN OP */
 
-java_objectheader *builtin_get_exceptionptr();
+static inline java_objectheader **builtin_get_exceptionptrptr();
 /* NOT AN OP */
-void builtin_set_exceptionptr(java_objectheader*);
+void builtin_reset_exceptionptr();
 /* NOT AN OP */
 
 java_objectheader *builtin_new(classinfo *c);
@@ -361,6 +379,21 @@ java_arrayheader *builtin_clone_array(void *env, java_arrayheader *o);
 inline float intBitsToFloat(s4 i);
 inline float longBitsToDouble(s8 l);
 
+
+static inline java_objectheader **builtin_get_exceptionptrptr()
+{
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+#ifdef HAVE___THREAD
+    return &_exceptionptr;
+#else
+    return &((nativethread*) pthread_getspecific(tkey_exceptionptr))->_exceptionptr;
+#endif
+#else
+    panic("builtin_get_exceptionptrptr should not be used in this configuration");
+    return NULL;
+#endif
+}
+
 #endif /* _BUILTIN_H */
 
 
index 86e5ba52db5e87b529fecb4f601fb072d6598137..6aca204055be3d9e8bd79435de2b8056632bdd4c 100644 (file)
--- a/headers.c
+++ b/headers.c
@@ -29,7 +29,7 @@
    Changes: Mark Probst
             Philipp Tomsich
 
-   $Id: headers.c 809 2003-12-30 20:54:57Z twisti $
+   $Id: headers.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -41,6 +41,7 @@
 #include "global.h"
 #include "tables.h"
 #include "loader.h"
+#include "builtin.h"
 #include "mm/boehm.h"
 #include "toolbox/chain.h"
 #include "toolbox/memory.h"
@@ -123,7 +124,8 @@ s8 asm_builtin_d2l(double a) { return 0; }
 void asm_builtin_monitorenter(java_objectheader *o) {}
 void asm_builtin_monitorexit(java_objectheader *o) {}
 
-s4 asm_builtin_checkarraycast(java_objectheader *o,arraydescriptor *d) {return 0;}
+s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl *target) {return 0;}
+
 
 #if defined(__I386__)
 s4 asm_builtin_arrayinstanceof(java_objectheader *obj, classinfo *class) { return 0; }
@@ -149,7 +151,7 @@ java_objectheader *native_new_and_init(void *p) { return NULL; }
 
 /************************ global variables **********************/
 
-java_objectheader *exceptionptr;
+THREADSPECIFIC java_objectheader *_exceptionptr;
 
 static chain *nativemethod_chain;    /* chain with native methods     */
 static chain *nativeclass_chain;                              /* chain with processed classes  */      
index aca321e51e3190c177a6dde1e5a2e1e7092227fd..4daa122da44272f01b50eee092a9819b94bfd94b 100644 (file)
@@ -28,7 +28,7 @@
    Authors: Andreas Krall
             Reinhard Grafl
 
-   $Id: codegen.c 837 2004-01-05 00:04:51Z twisti $
+   $Id: codegen.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -3867,7 +3867,7 @@ u1 *createnativestub(functionptr f, methodinfo *m)
        mcodeptr = (s4 *) (cs);             /* code generation pointer            */
 
        *(cs-1) = (u8) f;                   /* address of native method           */
-       *(cs-2) = (u8) (&exceptionptr);     /* address of exceptionptr            */
+       *(cs-2) = (u8) (&_exceptionptr);    /* address of exceptionptr            */
        *(cs-3) = (u8) asm_handle_nat_exception; /* addr of asm exception handler */
        *(cs-4) = (u8) (&env);              /* addr of jni_environement           */
        *(cs-5) = (u8) asm_builtin_trace;
index c8d851b63125d3b7021f665446be5f82ef42e415..167fd3a0229424152463c71397402ae1db6c9c60 100644 (file)
@@ -28,7 +28,7 @@
    Authors: Andreas Krall
             Christian Thalinger
 
-   $Id: codegen.c 847 2004-01-05 10:49:05Z twisti $
+   $Id: codegen.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -4797,7 +4797,12 @@ void removecompilerstub(u1 *stub)
 
 *******************************************************************************/
 
-#define NATIVESTUBSIZE 320
+#define NATIVESTUBSIZE 340
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+static java_objectheader *(*callgetexceptionptrptr)() = builtin_get_exceptionptrptr;
+static void (*callresetexceptionptr)() = builtin_reset_exceptionptr;
+#endif
 
 u1 *createnativestub(functionptr f, methodinfo *m)
 {
@@ -4964,16 +4969,32 @@ u1 *createnativestub(functionptr f, methodinfo *m)
     }
 
        /* we can't use REG_ITMP3 == REG_RESULT2 */
-       i386_mov_imm_reg((s4) &exceptionptr, REG_ITMP2);
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       i386_push_reg(REG_RESULT);
+       i386_push_reg(REG_RESULT2);
+       i386_call_mem(&callgetexceptionptrptr);
+       i386_mov_membase_reg(REG_RESULT, 0, REG_ITMP2);
+       i386_test_reg_reg(REG_ITMP2, REG_ITMP2);
+       i386_pop_reg(REG_RESULT2);
+       i386_pop_reg(REG_RESULT);
+#else
+       i386_mov_imm_reg((s4) &_exceptionptr, REG_ITMP2);
        i386_mov_membase_reg(REG_ITMP2, 0, REG_ITMP2);
        i386_test_reg_reg(REG_ITMP2, REG_ITMP2);
+#endif
        i386_jcc(I386_CC_NE, 1);
 
        i386_ret();
 
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       i386_push_reg(REG_ITMP2);
+       i386_call_mem(&callresetexceptionptr);
+       i386_pop_reg(REG_ITMP1_XPTR);
+#else
        i386_mov_reg_reg(REG_ITMP2, REG_ITMP1_XPTR);
-       i386_mov_imm_reg((s4) &exceptionptr, REG_ITMP2);
+       i386_mov_imm_reg((s4) &_exceptionptr, REG_ITMP2);
        i386_mov_imm_membase(0, REG_ITMP2, 0);
+#endif
        i386_mov_membase_reg(REG_SP, 0, REG_ITMP2_XPC);
        i386_alu_imm_reg(I386_SUB, 2, REG_ITMP2_XPC);
 
index 0c820c05af097f8b78e86fde05176575805af9a6..62c9381fa53b344ffbb83886a919b85869179006 100644 (file)
@@ -32,7 +32,7 @@
    This module generates MIPS machine code for a sequence of
    intermediate code commands (ICMDs).
 
-   $Id: codegen.c 860 2004-01-06 18:49:09Z twisti $
+   $Id: codegen.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -3735,7 +3735,7 @@ u1 *createnativestub(functionptr f, methodinfo *m)
        s4 *mcodeptr = (s4 *) (cs);         /* code generation pointer            */
 
        *(cs-1) = (u8) f;                   /* address of native method           */
-       *(cs-2) = (u8) (&exceptionptr);     /* address of exceptionptr            */
+       *(cs-2) = (u8) (&_exceptionptr);     /* address of exceptionptr            */
        *(cs-3) = (u8) asm_handle_nat_exception;/* addr of asm exception handler  */
        *(cs-4) = (u8) (&env);              /* addr of jni_environement           */
        *(cs-5) = (u8) asm_builtin_trace;
index 0eac79e0a3bbb50b5985eac56b9db929f2cef257..8e88ba8e439183833c92f2ae5caecd29f0e01408 100644 (file)
@@ -28,7 +28,7 @@
    Authors: Andreas Krall
             Stefan Ring
 
-   $Id: codegen.c 759 2003-12-13 22:36:08Z stefan $
+   $Id: codegen.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -3274,7 +3274,7 @@ u1 *createnativestub (functionptr f, methodinfo *m)
        s4 *mcodeptr = cs;                  /* code generation pointer            */
 
        *(cs-1) = (s4) f;                   /* address of native method           */
-       *(cs-2) = (s4) (&exceptionptr);     /* address of exceptionptr            */
+       *(cs-2) = (s4) (&_exceptionptr);    /* address of exceptionptr            */
        *(cs-3) = (s4) asm_handle_nat_exception; /* addr of asm exception handler */
        *(cs-4) = (s4) (&env);              /* addr of jni_environement           */
 //     *(cs-5) = (s4) asm_builtin_trace;
index a3f5b7f9fcb0cb742f7b237292e054c81a9cbb4e..f6e0b37cb56b8a091736eed479fb4e204a4bcec2 100644 (file)
@@ -28,7 +28,7 @@
    Authors: Andreas Krall
             Christian Thalinger
 
-   $Id: codegen.c 724 2003-12-09 18:56:11Z edwin $
+   $Id: codegen.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -3874,7 +3874,7 @@ u1 *createnativestub(functionptr f, methodinfo *m)
                x86_64_alu_imm_reg(X86_64_ADD, 3 * 8, REG_SP);    /* keep stack 16-byte aligned */
        }
 
-       x86_64_mov_imm_reg((s8) &exceptionptr, REG_ITMP3);
+       x86_64_mov_imm_reg((s8) &_exceptionptr, REG_ITMP3);
        x86_64_mov_membase_reg(REG_ITMP3, 0, REG_ITMP3);
        x86_64_test_reg_reg(REG_ITMP3, REG_ITMP3);
        x86_64_jcc(X86_64_CC_NE, 1);
@@ -3882,7 +3882,7 @@ u1 *createnativestub(functionptr f, methodinfo *m)
        x86_64_ret();
 
        x86_64_mov_reg_reg(REG_ITMP3, REG_ITMP1_XPTR);
-       x86_64_mov_imm_reg((s8) &exceptionptr, REG_ITMP3);
+       x86_64_mov_imm_reg((s8) &_exceptionptr, REG_ITMP3);
        x86_64_alu_reg_reg(X86_64_XOR, REG_ITMP2, REG_ITMP2);
        x86_64_mov_reg_membase(REG_ITMP2, REG_ITMP3, 0);    /* clear exception pointer */
 
diff --git a/jni.c b/jni.c
index d3e435b243632eec0a5cd75f66cc0b7c49ae482f..289e01556125e136545b6e11edfda9e03c876b28 100644 (file)
--- a/jni.c
+++ b/jni.c
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: jni.c 808 2003-12-30 12:45:28Z twisti $
+   $Id: jni.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -253,28 +253,28 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                case 'B':       
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_byte) {
                                        blk[cnt].itemtype=TYPE_INT;
                                        blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
                                } else  {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                break;
                case 'C':
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_char) {
                                        blk[cnt].itemtype=TYPE_INT;
                                        blk[cnt].item = (u8) ((struct java_lang_Character * )param)->value;
                                } else  {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                break;
@@ -282,7 +282,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                case 'S': 
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_short) {
@@ -293,7 +293,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                                blk[cnt].itemtype=TYPE_INT;
                                                blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
                                        } else {
-                                               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                                return 0;
                                        }
                                }
@@ -302,14 +302,14 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                case 'Z':
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_bool) {
                                        blk[cnt].itemtype=TYPE_INT;
                                        blk[cnt].item = (u8) ((struct java_lang_Boolean * )param)->value;
                                } else  {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                break;
@@ -318,7 +318,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                /*log_text("fill_callblock_objA: param 'I'");*/
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_int) {
@@ -335,7 +335,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                                        blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
 
                                                } else  {
-                                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                                        return 0;
                                                }
                                        }
@@ -344,7 +344,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                case 'J':
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_long) {
@@ -363,7 +363,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                                                blk[cnt].itemtype=TYPE_LNG;
                                                                blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
                                                        } else  {
-                                                               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                                               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                                                return 0;
                                                        }
                                                }
@@ -375,7 +375,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                case 'F' : 
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
 
@@ -383,14 +383,14 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                        blk[cnt].itemtype=TYPE_FLT;
                                        *((jfloat*)(&blk[cnt].item))=(jfloat) ((struct java_lang_Float*)param)->value;
                                } else  {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                break;
                case 'D' : 
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
 
@@ -402,7 +402,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                                blk[cnt].itemtype=TYPE_DBL;
                                                *((jdouble*)(&blk[cnt].item))=(jdouble) ((struct java_lang_Float*)param)->value;
                                        } else  {
-                                               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                                return 0;
                                        }
                                }
@@ -419,7 +419,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                end=(*utf_ptr)+1;
                                if (!builtin_instanceof(params->data[cnts],class_from_descriptor(start,end,0,CLASSLOAD_LOAD))) {
                                        if (params->data[cnts]!=0) {
-                                               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                                return 0;
                                        }                       
                                }
@@ -441,7 +441,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                end=(*utf_ptr)-1;
                                ch = utf_nextu2(utf_ptr);
                                if (!builtin_arrayinstanceof(params->data[cnts],class_from_descriptor(start,end,0,CLASSLOAD_LOAD)->vftbl)) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                        
                                }
@@ -502,7 +502,7 @@ jobject callObjectMethod (jobject obj, jmethodID methodID, va_list args)
        */
 
        if (methodID == 0) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
                return 0;
        }
 
@@ -510,17 +510,17 @@ jobject callObjectMethod (jobject obj, jmethodID methodID, va_list args)
 
        if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
                ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
        
        if (obj && !builtin_instanceof(obj, methodID->class)) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
 
        if (argcount > 3) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. CallObjectMethod does not support that");
                return 0;
        }
@@ -562,7 +562,7 @@ jint callIntegerMethod(jobject obj, jmethodID methodID, char retType, va_list ar
         printf("\n");
         */
        if (methodID == 0) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
                return 0;
        }
         
@@ -570,18 +570,18 @@ jint callIntegerMethod(jobject obj, jmethodID methodID, char retType, va_list ar
 
        if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
                ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
 
        if (obj && !builtin_instanceof(obj, methodID->class)) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
 
 
        if (argcount > 3) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. CallObjectMethod does not support that");
                return 0;
        }
@@ -619,7 +619,7 @@ jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
         printf("\n");
         */
        if (methodID == 0) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
                return 0;
        }
 
@@ -627,18 +627,18 @@ jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
 
        if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
                   ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
 
        if (obj && !builtin_instanceof(obj,methodID->class)) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
 
 
        if (argcount > 3) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. CallObjectMethod does not support that");
                return 0;
        }
@@ -677,7 +677,7 @@ jdouble callFloatMethod(jobject obj, jmethodID methodID, va_list args,char retTy
         */
 
        if (argcount > 3) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. CallObjectMethod does not support that");
                return 0;
        }
@@ -762,7 +762,7 @@ jclass FindClass (JNIEnv* env, const char *name)
        else*/
                c = loader_load(utf_new_char_classname ((char *) name));
 
-       if (!c) exceptionptr = native_new_and_init(class_java_lang_ClassFormatError);
+       if (!c) *exceptionptr = native_new_and_init(class_java_lang_ClassFormatError);
 
        return c;
 }
@@ -821,7 +821,7 @@ jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isS
 
 jint Throw(JNIEnv* env, jthrowable obj)
 {
-       exceptionptr = (java_objectheader*) obj;
+       *exceptionptr = (java_objectheader*) obj;
 
        return 0;
 }
@@ -845,7 +845,7 @@ jint ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
 
        o->detailMessage = (java_lang_String*) javastring_new_char((char *) msg);
 
-       exceptionptr = (java_objectheader*) o;
+       *exceptionptr = (java_objectheader*) o;
 
        return 0;
 }
@@ -855,14 +855,14 @@ jint ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
 
 jthrowable ExceptionOccurred (JNIEnv* env) 
 {
-       return (jthrowable) exceptionptr;
+       return (jthrowable) *exceptionptr;
 }
 
 /********** print exception and a backtrace of the stack (for debugging) **********/
 
 void ExceptionDescribe (JNIEnv* env) 
 {
-       utf_display(exceptionptr->vftbl->class->name);
+       utf_display((*exceptionptr)->vftbl->class->name);
        printf ("\n");
        fflush (stdout);        
 }
@@ -872,7 +872,7 @@ void ExceptionDescribe (JNIEnv* env)
 
 void ExceptionClear (JNIEnv* env) 
 {
-       exceptionptr = NULL;    
+       *exceptionptr = NULL;   
 }
 
 
@@ -978,7 +978,7 @@ jobject NewObject (JNIEnv* env, jclass clazz, jmethodID methodID, ...)
        /* log_text("JNI-Call: NewObject"); */
 
        if  (argcount>3) {
-               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. NewObject does not support that");
                return 0;
        }
@@ -1089,7 +1089,7 @@ jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name, const char *s
                utf_new_char ((char*) sig)
        );
 
-       if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);          
+       if (!m) *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);         
 
        return m;
 }
@@ -1694,7 +1694,7 @@ jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *si
 /*             utf_display(clazz->name);
                log_text(name);
                log_text(sig);*/
-               exceptionptr =  native_new_and_init(class_java_lang_NoSuchFieldError);  
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);  
        }
        return f;
 }
@@ -1835,7 +1835,7 @@ jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const c
                                                        utf_new_char((char*) name),
                                                        utf_new_char((char*) sig));
 
-       if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+       if (!m) *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
 
        return m;
 }
@@ -2146,7 +2146,7 @@ jfieldID GetStaticFieldID (JNIEnv *env, jclass clazz, const char *name, const ch
                            utf_new_char ((char*) sig)
                            ); 
        
-       if (!f) exceptionptr =  native_new_and_init(class_java_lang_NoSuchFieldError);  
+       if (!f) *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);  
 
        return f;
 }
@@ -2418,11 +2418,11 @@ jobjectArray NewObjectArray (JNIEnv *env, jsize len, jclass clazz, jobject init)
 {
        java_objectarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_anewarray (len, clazz);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2431,9 +2431,9 @@ jobject GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index)
     jobject j = NULL;
 
     if (index<array->header.size)      
-       j = array->data[index];
+               j = array->data[index];
     else
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     
     return j;
 }
@@ -2441,13 +2441,13 @@ jobject GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index)
 void SetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index, jobject val)
 {
     if (index>=array->header.size)     
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else {
 
        /* check if the class of value is a subclass of the element class of the array */
 
                if (!builtin_canstore((java_objectarray*)array,(java_objectheader*)val))
-                       exceptionptr = proto_java_lang_ArrayStoreException;
+                       *exceptionptr = proto_java_lang_ArrayStoreException;
                else
                        array->data[index] = val;
     }
@@ -2459,11 +2459,11 @@ jbooleanArray NewBooleanArray (JNIEnv *env, jsize len)
 {
        java_booleanarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_boolean(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2472,11 +2472,11 @@ jbyteArray NewByteArray (JNIEnv *env, jsize len)
 {
        java_bytearray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_byte(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2485,11 +2485,11 @@ jcharArray NewCharArray (JNIEnv *env, jsize len)
 {
        java_chararray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_char(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2498,11 +2498,11 @@ jshortArray NewShortArray (JNIEnv *env, jsize len)
 {
        java_shortarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_short(len);   
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2511,11 +2511,11 @@ jintArray NewIntArray (JNIEnv *env, jsize len)
 {
        java_intarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_int(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2524,11 +2524,11 @@ jlongArray NewLongArray (JNIEnv *env, jsize len)
 {
        java_longarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_long(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2537,11 +2537,11 @@ jfloatArray NewFloatArray (JNIEnv *env, jsize len)
 {
        java_floatarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_float(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2550,11 +2550,11 @@ jdoubleArray NewDoubleArray (JNIEnv *env, jsize len)
 {
        java_doublearray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_double(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2666,99 +2666,99 @@ void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems
 void GetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size) 
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
 }
 
 
 void GetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else       
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)      
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)      
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)      
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size) 
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void SetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 }
 
 
 void SetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 }
 
 
 void SetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 
 }
 
@@ -2766,45 +2766,45 @@ void SetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len,
 void SetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 }
 
 
 void SetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 
 }
 
 void SetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 
 }
 
 void SetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 
 }
 
 void SetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 }
 
 jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
@@ -2922,7 +2922,7 @@ jboolean ExceptionCheck(JNIEnv* env)
 {
        log_text("JNI-Call: ExceptionCheck");
 
-       return exceptionptr ? JNI_TRUE : JNI_FALSE;
+       return *exceptionptr ? JNI_TRUE : JNI_FALSE;
 }
 
 
@@ -3231,7 +3231,7 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID,
        jobject retVal;
 
        if (methodID == 0) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
                return 0;
        }
        argcount = get_parametercount(methodID);
@@ -3245,7 +3245,7 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID,
 
 
        if  (argcount > 3) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. invokeNativeHelper does not support that");
                return 0;
        }
@@ -3253,7 +3253,7 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID,
        if ( ((!params) && (argcount!=0)) || 
                 (params && (params->header.size!=argcount))
                 ) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                return 0;
        }
 
@@ -3431,8 +3431,8 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID,
 
        MFREE(blk, jni_callblock, 4 /*argcount+2*/);
 
-       if (exceptionptr) {
-               java_objectheader *exceptionToWrap=exceptionptr;
+       if (*exceptionptr) {
+               java_objectheader *exceptionToWrap=*exceptionptr;
                classinfo *ivtec = loader_load_sysclass(NULL,
                                                                                                utf_new_char("java/lang/reflect/InvocationTargetException"));
                java_objectheader* ivte = builtin_new(ivtec);
@@ -3444,10 +3444,10 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID,
                                                         0,
                                                         0);
 
-               if (exceptionptr != NULL)
+               if (*exceptionptr != NULL)
                        panic("jni.c: error while creating InvocationTargetException wrapper");
 
-               exceptionptr = ivte;
+               *exceptionptr = ivte;
        }
 
        return (jobject *) retVal;
index 7e3221a6d130c45a4c5bfc4ff4f1131cbabcd137..19215b8fd25624bd44052cf00600a444214b5b09 100644 (file)
--- a/loader.c
+++ b/loader.c
@@ -30,7 +30,7 @@
             Mark Probst
                        Edwin Steiner
 
-   $Id: loader.c 861 2004-01-06 20:55:56Z twisti $
+   $Id: loader.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -2674,10 +2674,10 @@ void class_init(classinfo *c)
 #endif
 
        /* we have to throw an exception */
-       if (exceptionptr) {
+       if (*exceptionptr) {
                printf("Exception in thread \"main\" java.lang.ExceptionInInitializerError\n");
                printf("Caused by: ");
-               utf_display(exceptionptr->vftbl->class->name);
+               utf_display((*exceptionptr)->vftbl->class->name);
                printf("\n");
                fflush(stdout);
                exit(1);
@@ -2719,9 +2719,9 @@ void class_init(classinfo *c)
                blockInts = b;
 #endif
 
-               if (exceptionptr) {
+               if (*exceptionptr) {
                        printf("#### initializeSystemClass has thrown: ");
-                       utf_display(exceptionptr->vftbl->class->name);
+                       utf_display((*exceptionptr)->vftbl->class->name);
                        printf("\n");
                        fflush(stdout);
                }
@@ -3048,7 +3048,7 @@ classinfo *loader_load(utf *topname)
                                if (linkverbose)
                                        dolog("Cannot resolve linking dependencies");
                                top = NULL;
-                               if (!exceptionptr)
+                               if (!*exceptionptr)
                                        throw_linkageerror_message(c->name);
                                break;
                        }
diff --git a/main.c b/main.c
index c875ba99f4780766de6ccdf68f526780ebdb0063..c5e3676834fec8b864cb556109f87c3d6f1de644 100644 (file)
--- a/main.c
+++ b/main.c
@@ -37,7 +37,7 @@
      - Calling the class loader
      - Running the main method
 
-   $Id: main.c 861 2004-01-06 20:55:56Z twisti $
+   $Id: main.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -867,14 +867,14 @@ int main(int argc, char **argv)
        topclass = loader_load(utf_new_char(cp));
        /*class_showmethods(topclass);  */
 
-       if (exceptionptr != 0) {
+       if (*exceptionptr != 0) {
                printf("Exception in thread \"main\" ");
-               utf_display(exceptionptr->vftbl->class->name);
+               utf_display((*exceptionptr)->vftbl->class->name);
                printf(": ");
-               utf_display(javastring_toutf(((java_lang_Throwable *) exceptionptr)->detailMessage, false));
+               utf_display(javastring_toutf(((java_lang_Throwable *) *exceptionptr)->detailMessage, false));
                printf("\n");
 
-               exceptionptr = 0;
+               *exceptionptr = 0;
        }
 
        if (topclass == 0) {
@@ -924,14 +924,14 @@ int main(int argc, char **argv)
                /* here we go... */
                asm_calljavafunction(mainmethod, a, NULL, NULL, NULL);
        
-               if (exceptionptr) {
+               if (*exceptionptr) {
                        printf("Exception in thread \"main\" ");
-                       utf_display(exceptionptr->vftbl->class->name);
+                       utf_display((*exceptionptr)->vftbl->class->name);
 
                        /* do we have a detail message? */
-                       if (((java_lang_Throwable *) exceptionptr)->detailMessage) {
+                       if (((java_lang_Throwable *) *exceptionptr)->detailMessage) {
                                printf(": ");
-                               utf_display(javastring_toutf(((java_lang_Throwable *) exceptionptr)->detailMessage, false));
+                               utf_display(javastring_toutf(((java_lang_Throwable *) *exceptionptr)->detailMessage, false));
                        }
                        printf("\n");
                }
index 47b53c78f50f7d74423ae9b6017f712fc2ffe117..0ca2deaa314e065bee0d425ec40820c082a94b20 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Stefan Ring
 
-   $Id: boehm.c 838 2004-01-05 00:27:00Z twisti $
+   $Id: boehm.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -36,6 +36,7 @@
 #include "global.h"
 #include "native.h"
 #include "asmpart.h"
+#include "builtin.h"
 #include "threads/thread.h"
 #include "toolbox/loging.h"
 
@@ -116,7 +117,7 @@ void runboehmfinalizer(void *o, void *p)
        asm_calljavafunction(ob->vftbl->class->finalizer, ob, NULL, NULL, NULL);
        
        /* if we had an exception in the finalizer, ignore it */
-       exceptionptr = NULL;
+       *exceptionptr = NULL;
 }
 
 
index df7712bcbaaead83eae3fea80469aefe0b48fa87..a448307dbb53ab7930f6129905f7cfc94e786df6 100644 (file)
@@ -151,7 +151,7 @@ JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_reflect_Field_get ( JN
                  }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return NULL;
 }
@@ -176,7 +176,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getBoolean ( JNIEnv *env ,  st
   }
 
   /* raise exception */
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -198,7 +198,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getByte ( JNIEnv *env ,  struc
          return (*env)->GetByteField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -220,7 +220,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getChar ( JNIEnv *env ,  struc
          return (*env)->GetCharField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -242,7 +242,7 @@ JNIEXPORT double JNICALL Java_java_lang_reflect_Field_getDouble ( JNIEnv *env ,
          return (*env)->GetDoubleField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -264,7 +264,7 @@ JNIEXPORT float JNICALL Java_java_lang_reflect_Field_getFloat ( JNIEnv *env ,  s
          return (*env)->GetFloatField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -286,7 +286,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getInt ( JNIEnv *env ,  struct
          return (*env)->GetIntField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -328,7 +328,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getShort ( JNIEnv *env ,  stru
          return (*env)->GetShortField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -467,7 +467,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set ( JNIEnv *env ,  struct
     }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -489,7 +489,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean ( JNIEnv *env ,
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -511,7 +511,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte ( JNIEnv *env ,  str
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -533,7 +533,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar ( JNIEnv *env ,  str
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -555,7 +555,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setDouble ( JNIEnv *env ,  s
       } 
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -577,7 +577,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setFloat ( JNIEnv *env ,  st
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -599,7 +599,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt ( JNIEnv *env ,  stru
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -621,7 +621,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setLong ( JNIEnv *env ,  str
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -643,7 +643,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort ( JNIEnv *env ,  st
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 
index aa3ca7801c913c477a4d4a87e069718c8e60f862..1ea972ae1bb008f369efd87a925279e6504117ac 100644 (file)
@@ -247,7 +247,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_Thread_interrupted (JNIEnv *env ,jclass claz
  */
 JNIEXPORT void JNICALL Java_java_lang_Thread_nativeInit (JNIEnv *env ,  struct java_lang_Thread* this , s8 par1) {
        log_text("Thread_nativeInit");
-       if (exceptionptr) log_text("There has been an exception, strange...");
+       if (*exceptionptr) log_text("There has been an exception, strange...");
        this->priority=5;
 }
 
index 7e26acac18712b98b04720f8a78038b2dfd84b35..37f0106943bc267fdfa9bcbf8a5afa63649caa64 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: VMClass.c 833 2004-01-04 22:10:24Z jowenn $
+   $Id: VMClass.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -84,7 +84,7 @@ JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv
 
                /* there is already an exception (NoClassDefFoundError), but forName()
                   returns a ClassNotFoundException */
-               exceptionptr = 
+               *exceptionptr = 
                        native_new_and_init_string(class_java_lang_ClassNotFoundException, s);
 
            return NULL;
@@ -317,7 +317,7 @@ JNIEXPORT struct java_lang_reflect_Field* JNICALL Java_java_lang_VMClass_getFiel
     /* get fieldinfo entry */
     idx = class_findfield_index_approx((classinfo*) (this->vmData), javastring_toutf(name, false));
     if (idx<0) {
-           exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+           *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
            return NULL;
        }
     f= &(((struct classinfo*)(this->vmData))->fields[idx]);
@@ -326,7 +326,7 @@ JNIEXPORT struct java_lang_reflect_Field* JNICALL Java_java_lang_VMClass_getFiel
                if ( public_only && !(f->flags & ACC_PUBLIC))
                        {
                                /* field is not public  and public only had been requested*/
-                               exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+                               *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
                                return NULL;
                        }
 
@@ -439,7 +439,7 @@ JNIEXPORT struct java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getMet
     if (!m || (which==MEMBER_PUBLIC && !(m->flags & ACC_PUBLIC)))
                {
                        /* no apropriate method was found */
-                       exceptionptr = native_new_and_init (class_java_lang_NoSuchMethodException);
+                       *exceptionptr = native_new_and_init (class_java_lang_NoSuchMethodException);
                        return NULL;
                }
    
index 3b63da9c42023889ddc88f7a8ae550938eb1d8ae..4d90fba8b95debaf1e33de82c1357537be9f5270 100644 (file)
@@ -4,6 +4,7 @@
 #include "jni.h"
 #include "loader.h"
 #include "native.h"
+#include "builtin.h"
 #include "toolbox/loging.h"
 #include "java_lang_Class.h"
 #include "java_lang_String.h"
@@ -45,7 +46,7 @@ JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimit
     }
 
     /* illegal primitive classname specified */
-    exceptionptr = native_new_and_init (class_java_lang_ClassNotFoundException);
+    *exceptionptr = native_new_and_init (class_java_lang_ClassNotFoundException);
     return NULL;
 }
 
index 54e3658506040acf65b94be4dd831396efa1fa20..6a755d23f7b51c7d1d90638e5d84dead313c9ea1 100644 (file)
@@ -41,7 +41,7 @@ JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_VMObject_clone ( JNIEn
     
     /* We are cloning a non-array */
     if (! builtin_instanceof ((java_objectheader*) this, class_java_lang_Cloneable) ) {
-        exceptionptr = native_new_and_init (class_java_lang_CloneNotSupportedException);
+        *exceptionptr = native_new_and_init (class_java_lang_CloneNotSupportedException);
         return NULL;
     }
 
@@ -49,7 +49,7 @@ JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_VMObject_clone ( JNIEn
     c = this -> header.vftbl -> class;
     new = (java_lang_Object*) builtin_new (c);
     if (!new) {
-        exceptionptr = proto_java_lang_OutOfMemoryError;
+        *exceptionptr = proto_java_lang_OutOfMemoryError;
         return NULL;
     }
     memcpy (new, this, c->instancesize);
index 85b4014d21064aaccf2080d5d5cc3d3ef8d2455e..396f2f0f84a0e9aeed6a84e88ce76efd372caab8 100644 (file)
@@ -42,7 +42,7 @@ JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy (JNIEnv *env, jclass cl
        fflush(stdout);*/
 
        if (!s || !d) { 
-            exceptionptr = proto_java_lang_NullPointerException; 
+            *exceptionptr = proto_java_lang_NullPointerException; 
             return; 
         }
 
@@ -50,12 +50,12 @@ JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy (JNIEnv *env, jclass cl
         ddesc = d->objheader.vftbl->arraydesc;
 
         if (!sdesc || !ddesc || (sdesc->arraytype != ddesc->arraytype)) {
-            exceptionptr = proto_java_lang_ArrayStoreException; 
+            *exceptionptr = proto_java_lang_ArrayStoreException; 
             return; 
         }
 
        if ((len<0) || (sp<0) || (sp+len > s->size) || (dp<0) || (dp+len > d->size)) {
-            exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException; 
+            *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException; 
             return; 
         }
 
@@ -76,7 +76,7 @@ JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy (JNIEnv *env, jclass cl
                 for (i=0; i<len; i++) {
                     java_objectheader *o = oas->data[sp+i];
                     if (!builtin_canstore(oad, o)) {
-                        exceptionptr = proto_java_lang_ArrayStoreException;
+                        *exceptionptr = proto_java_lang_ArrayStoreException;
                         return;
                     }
                     oad->data[dp+i] = o;
@@ -92,7 +92,7 @@ JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy (JNIEnv *env, jclass cl
                 for (i=len-1; i>=0; i--) {
                     java_objectheader *o = oas->data[sp+i];
                     if (!builtin_canstore(oad, o)) {
-                        exceptionptr = proto_java_lang_ArrayStoreException;
+                        *exceptionptr = proto_java_lang_ArrayStoreException;
                         return;
                     }
                     oad->data[dp+i] = o;
index 7abf3dcb2be4cd2186840d71c0805574a1f51595..a4452afe7b3f0ce8cb28d506e57fc9799aab906e 100644 (file)
--- a/native.c
+++ b/native.c
@@ -31,7 +31,7 @@
    The .hh files created with the header file generator are all
    included here as are the C functions implementing these methods.
 
-   $Id: native.c 861 2004-01-06 20:55:56Z twisti $
+   $Id: native.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -120,7 +120,7 @@ classinfo *class_java_lang_Integer;
 struct java_lang_ClassLoader *SystemClassLoader = NULL;
 
 /* for raising exceptions from native methods */
-java_objectheader* exceptionptr = NULL;
+THREADSPECIFIC java_objectheader* _exceptionptr = NULL;
 
 /************* use classinfo structure as java.lang.Class object **************/
 
@@ -240,7 +240,7 @@ void throw_noclassdeffounderror_message(utf* classname)
        }
 
        /* throws a NoClassDefFoundError with message */
-       exceptionptr = native_new_and_init_string(class_java_lang_NoClassDefFoundError,
+       *exceptionptr = native_new_and_init_string(class_java_lang_NoClassDefFoundError,
                                                                                          javastring_new(classname));
 }
 
@@ -252,7 +252,7 @@ void throw_linkageerror_message(utf* classname)
        }
 
        /* throws a LinkageError with message */
-       exceptionptr = native_new_and_init_string(class_java_lang_LinkageError,
+       *exceptionptr = native_new_and_init_string(class_java_lang_LinkageError,
                                                                                          javastring_new(classname));
 }
 
@@ -684,7 +684,7 @@ fieldinfo *class_findfield_approx(classinfo *c, utf *name)
        }
 
        /* field was not found, raise exception */      
-       exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+       *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
 
        return NULL;
 }
@@ -699,7 +699,7 @@ s4 class_findfield_index_approx (classinfo *c, utf *name)
                }
 
        /* field was not found, raise exception */      
-       exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+       *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
        return -1;
 }
 
@@ -717,7 +717,7 @@ java_objectheader *native_new_and_init(classinfo *c)
        java_objectheader *o;
 
        /* if c==NULL it is probebly because loader_load failed */
-       if (!c) return exceptionptr;
+       if (!c) return *exceptionptr;
 
        o = builtin_new(c);          /* create object          */
        
@@ -756,7 +756,7 @@ java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s)
        java_objectheader *o;
 
        /* if c==NULL it is probebly because loader_load failed */
-       if (!c) return exceptionptr;
+       if (!c) return *exceptionptr;
 
        o = builtin_new(c);          /* create object          */
        
index 00f4b2b24a3190c4c8329e16bfc4c4c7b85e30fa..47c8d1daa99eebe057e5c5e261482366f0fa07d3 100644 (file)
--- a/native.h
+++ b/native.h
@@ -26,7 +26,7 @@
 
    Authors: Reinhard Grafl
 
-   $Id: native.h 833 2004-01-04 22:10:24Z jowenn $
+   $Id: native.h 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -81,7 +81,7 @@ extern classinfo *class_java_lang_Integer;
 extern struct java_lang_ClassLoader *SystemClassLoader;
 
 /* for raising exceptions from native methods */
-extern java_objectheader* exceptionptr;
+/* extern java_objectheader* exceptionptr; */
 
 /* javastring-hashtable */
 extern hashtable string_hash; 
index 069a050686e3c7eb62a9445e8755ae2cc43adfbe..ceb4aa8831f3bd2707920ad3e9c2fe3d8343b4f2 100644 (file)
@@ -37,7 +37,7 @@
      - Calling the class loader
      - Running the main method
 
-   $Id: cacao.c 861 2004-01-06 20:55:56Z twisti $
+   $Id: cacao.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -867,14 +867,14 @@ int main(int argc, char **argv)
        topclass = loader_load(utf_new_char(cp));
        /*class_showmethods(topclass);  */
 
-       if (exceptionptr != 0) {
+       if (*exceptionptr != 0) {
                printf("Exception in thread \"main\" ");
-               utf_display(exceptionptr->vftbl->class->name);
+               utf_display((*exceptionptr)->vftbl->class->name);
                printf(": ");
-               utf_display(javastring_toutf(((java_lang_Throwable *) exceptionptr)->detailMessage, false));
+               utf_display(javastring_toutf(((java_lang_Throwable *) *exceptionptr)->detailMessage, false));
                printf("\n");
 
-               exceptionptr = 0;
+               *exceptionptr = 0;
        }
 
        if (topclass == 0) {
@@ -924,14 +924,14 @@ int main(int argc, char **argv)
                /* here we go... */
                asm_calljavafunction(mainmethod, a, NULL, NULL, NULL);
        
-               if (exceptionptr) {
+               if (*exceptionptr) {
                        printf("Exception in thread \"main\" ");
-                       utf_display(exceptionptr->vftbl->class->name);
+                       utf_display((*exceptionptr)->vftbl->class->name);
 
                        /* do we have a detail message? */
-                       if (((java_lang_Throwable *) exceptionptr)->detailMessage) {
+                       if (((java_lang_Throwable *) *exceptionptr)->detailMessage) {
                                printf(": ");
-                               utf_display(javastring_toutf(((java_lang_Throwable *) exceptionptr)->detailMessage, false));
+                               utf_display(javastring_toutf(((java_lang_Throwable *) *exceptionptr)->detailMessage, false));
                        }
                        printf("\n");
                }
index 86e5ba52db5e87b529fecb4f601fb072d6598137..6aca204055be3d9e8bd79435de2b8056632bdd4c 100644 (file)
@@ -29,7 +29,7 @@
    Changes: Mark Probst
             Philipp Tomsich
 
-   $Id: headers.c 809 2003-12-30 20:54:57Z twisti $
+   $Id: headers.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -41,6 +41,7 @@
 #include "global.h"
 #include "tables.h"
 #include "loader.h"
+#include "builtin.h"
 #include "mm/boehm.h"
 #include "toolbox/chain.h"
 #include "toolbox/memory.h"
@@ -123,7 +124,8 @@ s8 asm_builtin_d2l(double a) { return 0; }
 void asm_builtin_monitorenter(java_objectheader *o) {}
 void asm_builtin_monitorexit(java_objectheader *o) {}
 
-s4 asm_builtin_checkarraycast(java_objectheader *o,arraydescriptor *d) {return 0;}
+s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl *target) {return 0;}
+
 
 #if defined(__I386__)
 s4 asm_builtin_arrayinstanceof(java_objectheader *obj, classinfo *class) { return 0; }
@@ -149,7 +151,7 @@ java_objectheader *native_new_and_init(void *p) { return NULL; }
 
 /************************ global variables **********************/
 
-java_objectheader *exceptionptr;
+THREADSPECIFIC java_objectheader *_exceptionptr;
 
 static chain *nativemethod_chain;    /* chain with native methods     */
 static chain *nativeclass_chain;                              /* chain with processed classes  */      
index 47b53c78f50f7d74423ae9b6017f712fc2ffe117..0ca2deaa314e065bee0d425ec40820c082a94b20 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Stefan Ring
 
-   $Id: boehm.c 838 2004-01-05 00:27:00Z twisti $
+   $Id: boehm.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -36,6 +36,7 @@
 #include "global.h"
 #include "native.h"
 #include "asmpart.h"
+#include "builtin.h"
 #include "threads/thread.h"
 #include "toolbox/loging.h"
 
@@ -116,7 +117,7 @@ void runboehmfinalizer(void *o, void *p)
        asm_calljavafunction(ob->vftbl->class->finalizer, ob, NULL, NULL, NULL);
        
        /* if we had an exception in the finalizer, ignore it */
-       exceptionptr = NULL;
+       *exceptionptr = NULL;
 }
 
 
index d3e435b243632eec0a5cd75f66cc0b7c49ae482f..289e01556125e136545b6e11edfda9e03c876b28 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: jni.c 808 2003-12-30 12:45:28Z twisti $
+   $Id: jni.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -253,28 +253,28 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                case 'B':       
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_byte) {
                                        blk[cnt].itemtype=TYPE_INT;
                                        blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
                                } else  {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                break;
                case 'C':
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_char) {
                                        blk[cnt].itemtype=TYPE_INT;
                                        blk[cnt].item = (u8) ((struct java_lang_Character * )param)->value;
                                } else  {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                break;
@@ -282,7 +282,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                case 'S': 
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_short) {
@@ -293,7 +293,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                                blk[cnt].itemtype=TYPE_INT;
                                                blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
                                        } else {
-                                               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                                return 0;
                                        }
                                }
@@ -302,14 +302,14 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                case 'Z':
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_bool) {
                                        blk[cnt].itemtype=TYPE_INT;
                                        blk[cnt].item = (u8) ((struct java_lang_Boolean * )param)->value;
                                } else  {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                break;
@@ -318,7 +318,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                /*log_text("fill_callblock_objA: param 'I'");*/
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_int) {
@@ -335,7 +335,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                                        blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
 
                                                } else  {
-                                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                                        return 0;
                                                }
                                        }
@@ -344,7 +344,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                case 'J':
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                if (param->vftbl->class->name==utf_long) {
@@ -363,7 +363,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                                                blk[cnt].itemtype=TYPE_LNG;
                                                                blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
                                                        } else  {
-                                                               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                                               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                                                return 0;
                                                        }
                                                }
@@ -375,7 +375,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                case 'F' : 
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
 
@@ -383,14 +383,14 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                        blk[cnt].itemtype=TYPE_FLT;
                                        *((jfloat*)(&blk[cnt].item))=(jfloat) ((struct java_lang_Float*)param)->value;
                                } else  {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
                                break;
                case 'D' : 
                                param=params->data[cnts];
                                if (param==0) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                }
 
@@ -402,7 +402,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                                blk[cnt].itemtype=TYPE_DBL;
                                                *((jdouble*)(&blk[cnt].item))=(jdouble) ((struct java_lang_Float*)param)->value;
                                        } else  {
-                                               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                                return 0;
                                        }
                                }
@@ -419,7 +419,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                end=(*utf_ptr)+1;
                                if (!builtin_instanceof(params->data[cnts],class_from_descriptor(start,end,0,CLASSLOAD_LOAD))) {
                                        if (params->data[cnts]!=0) {
-                                               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                                return 0;
                                        }                       
                                }
@@ -441,7 +441,7 @@ char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_object
                                end=(*utf_ptr)-1;
                                ch = utf_nextu2(utf_ptr);
                                if (!builtin_arrayinstanceof(params->data[cnts],class_from_descriptor(start,end,0,CLASSLOAD_LOAD)->vftbl)) {
-                                       exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+                                       *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                                        return 0;
                                        
                                }
@@ -502,7 +502,7 @@ jobject callObjectMethod (jobject obj, jmethodID methodID, va_list args)
        */
 
        if (methodID == 0) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
                return 0;
        }
 
@@ -510,17 +510,17 @@ jobject callObjectMethod (jobject obj, jmethodID methodID, va_list args)
 
        if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
                ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
        
        if (obj && !builtin_instanceof(obj, methodID->class)) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
 
        if (argcount > 3) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. CallObjectMethod does not support that");
                return 0;
        }
@@ -562,7 +562,7 @@ jint callIntegerMethod(jobject obj, jmethodID methodID, char retType, va_list ar
         printf("\n");
         */
        if (methodID == 0) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
                return 0;
        }
         
@@ -570,18 +570,18 @@ jint callIntegerMethod(jobject obj, jmethodID methodID, char retType, va_list ar
 
        if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
                ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
 
        if (obj && !builtin_instanceof(obj, methodID->class)) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
 
 
        if (argcount > 3) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. CallObjectMethod does not support that");
                return 0;
        }
@@ -619,7 +619,7 @@ jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
         printf("\n");
         */
        if (methodID == 0) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
                return 0;
        }
 
@@ -627,18 +627,18 @@ jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
 
        if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
                   ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
 
        if (obj && !builtin_instanceof(obj,methodID->class)) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
                return 0;
        }
 
 
        if (argcount > 3) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. CallObjectMethod does not support that");
                return 0;
        }
@@ -677,7 +677,7 @@ jdouble callFloatMethod(jobject obj, jmethodID methodID, va_list args,char retTy
         */
 
        if (argcount > 3) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. CallObjectMethod does not support that");
                return 0;
        }
@@ -762,7 +762,7 @@ jclass FindClass (JNIEnv* env, const char *name)
        else*/
                c = loader_load(utf_new_char_classname ((char *) name));
 
-       if (!c) exceptionptr = native_new_and_init(class_java_lang_ClassFormatError);
+       if (!c) *exceptionptr = native_new_and_init(class_java_lang_ClassFormatError);
 
        return c;
 }
@@ -821,7 +821,7 @@ jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isS
 
 jint Throw(JNIEnv* env, jthrowable obj)
 {
-       exceptionptr = (java_objectheader*) obj;
+       *exceptionptr = (java_objectheader*) obj;
 
        return 0;
 }
@@ -845,7 +845,7 @@ jint ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
 
        o->detailMessage = (java_lang_String*) javastring_new_char((char *) msg);
 
-       exceptionptr = (java_objectheader*) o;
+       *exceptionptr = (java_objectheader*) o;
 
        return 0;
 }
@@ -855,14 +855,14 @@ jint ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
 
 jthrowable ExceptionOccurred (JNIEnv* env) 
 {
-       return (jthrowable) exceptionptr;
+       return (jthrowable) *exceptionptr;
 }
 
 /********** print exception and a backtrace of the stack (for debugging) **********/
 
 void ExceptionDescribe (JNIEnv* env) 
 {
-       utf_display(exceptionptr->vftbl->class->name);
+       utf_display((*exceptionptr)->vftbl->class->name);
        printf ("\n");
        fflush (stdout);        
 }
@@ -872,7 +872,7 @@ void ExceptionDescribe (JNIEnv* env)
 
 void ExceptionClear (JNIEnv* env) 
 {
-       exceptionptr = NULL;    
+       *exceptionptr = NULL;   
 }
 
 
@@ -978,7 +978,7 @@ jobject NewObject (JNIEnv* env, jclass clazz, jmethodID methodID, ...)
        /* log_text("JNI-Call: NewObject"); */
 
        if  (argcount>3) {
-               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. NewObject does not support that");
                return 0;
        }
@@ -1089,7 +1089,7 @@ jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name, const char *s
                utf_new_char ((char*) sig)
        );
 
-       if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);          
+       if (!m) *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);         
 
        return m;
 }
@@ -1694,7 +1694,7 @@ jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *si
 /*             utf_display(clazz->name);
                log_text(name);
                log_text(sig);*/
-               exceptionptr =  native_new_and_init(class_java_lang_NoSuchFieldError);  
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);  
        }
        return f;
 }
@@ -1835,7 +1835,7 @@ jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const c
                                                        utf_new_char((char*) name),
                                                        utf_new_char((char*) sig));
 
-       if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+       if (!m) *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
 
        return m;
 }
@@ -2146,7 +2146,7 @@ jfieldID GetStaticFieldID (JNIEnv *env, jclass clazz, const char *name, const ch
                            utf_new_char ((char*) sig)
                            ); 
        
-       if (!f) exceptionptr =  native_new_and_init(class_java_lang_NoSuchFieldError);  
+       if (!f) *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);  
 
        return f;
 }
@@ -2418,11 +2418,11 @@ jobjectArray NewObjectArray (JNIEnv *env, jsize len, jclass clazz, jobject init)
 {
        java_objectarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_anewarray (len, clazz);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2431,9 +2431,9 @@ jobject GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index)
     jobject j = NULL;
 
     if (index<array->header.size)      
-       j = array->data[index];
+               j = array->data[index];
     else
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     
     return j;
 }
@@ -2441,13 +2441,13 @@ jobject GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index)
 void SetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index, jobject val)
 {
     if (index>=array->header.size)     
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else {
 
        /* check if the class of value is a subclass of the element class of the array */
 
                if (!builtin_canstore((java_objectarray*)array,(java_objectheader*)val))
-                       exceptionptr = proto_java_lang_ArrayStoreException;
+                       *exceptionptr = proto_java_lang_ArrayStoreException;
                else
                        array->data[index] = val;
     }
@@ -2459,11 +2459,11 @@ jbooleanArray NewBooleanArray (JNIEnv *env, jsize len)
 {
        java_booleanarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_boolean(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2472,11 +2472,11 @@ jbyteArray NewByteArray (JNIEnv *env, jsize len)
 {
        java_bytearray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_byte(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2485,11 +2485,11 @@ jcharArray NewCharArray (JNIEnv *env, jsize len)
 {
        java_chararray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_char(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2498,11 +2498,11 @@ jshortArray NewShortArray (JNIEnv *env, jsize len)
 {
        java_shortarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_short(len);   
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2511,11 +2511,11 @@ jintArray NewIntArray (JNIEnv *env, jsize len)
 {
        java_intarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_int(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2524,11 +2524,11 @@ jlongArray NewLongArray (JNIEnv *env, jsize len)
 {
        java_longarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_long(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2537,11 +2537,11 @@ jfloatArray NewFloatArray (JNIEnv *env, jsize len)
 {
        java_floatarray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_float(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2550,11 +2550,11 @@ jdoubleArray NewDoubleArray (JNIEnv *env, jsize len)
 {
        java_doublearray *j;
     if (len<0) {
-               exceptionptr=proto_java_lang_NegativeArraySizeException;
+               *exceptionptr=proto_java_lang_NegativeArraySizeException;
                return NULL;
     }
     j = builtin_newarray_double(len);
-    if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
+    if (!j) *exceptionptr = proto_java_lang_OutOfMemoryError;
     return j;
 }
 
@@ -2666,99 +2666,99 @@ void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems
 void GetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size) 
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
 }
 
 
 void GetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else       
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)      
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)      
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)      
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void GetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size) 
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
+               memcpy(buf,&array->data[start],len*sizeof(array->data[0]));     
 }
 
 
 void SetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 }
 
 
 void SetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 }
 
 
 void SetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 
 }
 
@@ -2766,45 +2766,45 @@ void SetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len,
 void SetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 }
 
 
 void SetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 
 }
 
 void SetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 
 }
 
 void SetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 
 }
 
 void SetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
 {
     if (start<0 || len<0 || start+len>array->header.size)
-       exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
+               *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
     else
-       memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
+               memcpy(&array->data[start],buf,len*sizeof(array->data[0]));     
 }
 
 jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
@@ -2922,7 +2922,7 @@ jboolean ExceptionCheck(JNIEnv* env)
 {
        log_text("JNI-Call: ExceptionCheck");
 
-       return exceptionptr ? JNI_TRUE : JNI_FALSE;
+       return *exceptionptr ? JNI_TRUE : JNI_FALSE;
 }
 
 
@@ -3231,7 +3231,7 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID,
        jobject retVal;
 
        if (methodID == 0) {
-               exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
+               *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError); 
                return 0;
        }
        argcount = get_parametercount(methodID);
@@ -3245,7 +3245,7 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID,
 
 
        if  (argcount > 3) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                log_text("Too many arguments. invokeNativeHelper does not support that");
                return 0;
        }
@@ -3253,7 +3253,7 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID,
        if ( ((!params) && (argcount!=0)) || 
                 (params && (params->header.size!=argcount))
                 ) {
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
                return 0;
        }
 
@@ -3431,8 +3431,8 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID,
 
        MFREE(blk, jni_callblock, 4 /*argcount+2*/);
 
-       if (exceptionptr) {
-               java_objectheader *exceptionToWrap=exceptionptr;
+       if (*exceptionptr) {
+               java_objectheader *exceptionToWrap=*exceptionptr;
                classinfo *ivtec = loader_load_sysclass(NULL,
                                                                                                utf_new_char("java/lang/reflect/InvocationTargetException"));
                java_objectheader* ivte = builtin_new(ivtec);
@@ -3444,10 +3444,10 @@ jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID,
                                                         0,
                                                         0);
 
-               if (exceptionptr != NULL)
+               if (*exceptionptr != NULL)
                        panic("jni.c: error while creating InvocationTargetException wrapper");
 
-               exceptionptr = ivte;
+               *exceptionptr = ivte;
        }
 
        return (jobject *) retVal;
index 7abf3dcb2be4cd2186840d71c0805574a1f51595..a4452afe7b3f0ce8cb28d506e57fc9799aab906e 100644 (file)
@@ -31,7 +31,7 @@
    The .hh files created with the header file generator are all
    included here as are the C functions implementing these methods.
 
-   $Id: native.c 861 2004-01-06 20:55:56Z twisti $
+   $Id: native.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -120,7 +120,7 @@ classinfo *class_java_lang_Integer;
 struct java_lang_ClassLoader *SystemClassLoader = NULL;
 
 /* for raising exceptions from native methods */
-java_objectheader* exceptionptr = NULL;
+THREADSPECIFIC java_objectheader* _exceptionptr = NULL;
 
 /************* use classinfo structure as java.lang.Class object **************/
 
@@ -240,7 +240,7 @@ void throw_noclassdeffounderror_message(utf* classname)
        }
 
        /* throws a NoClassDefFoundError with message */
-       exceptionptr = native_new_and_init_string(class_java_lang_NoClassDefFoundError,
+       *exceptionptr = native_new_and_init_string(class_java_lang_NoClassDefFoundError,
                                                                                          javastring_new(classname));
 }
 
@@ -252,7 +252,7 @@ void throw_linkageerror_message(utf* classname)
        }
 
        /* throws a LinkageError with message */
-       exceptionptr = native_new_and_init_string(class_java_lang_LinkageError,
+       *exceptionptr = native_new_and_init_string(class_java_lang_LinkageError,
                                                                                          javastring_new(classname));
 }
 
@@ -684,7 +684,7 @@ fieldinfo *class_findfield_approx(classinfo *c, utf *name)
        }
 
        /* field was not found, raise exception */      
-       exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+       *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
 
        return NULL;
 }
@@ -699,7 +699,7 @@ s4 class_findfield_index_approx (classinfo *c, utf *name)
                }
 
        /* field was not found, raise exception */      
-       exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+       *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
        return -1;
 }
 
@@ -717,7 +717,7 @@ java_objectheader *native_new_and_init(classinfo *c)
        java_objectheader *o;
 
        /* if c==NULL it is probebly because loader_load failed */
-       if (!c) return exceptionptr;
+       if (!c) return *exceptionptr;
 
        o = builtin_new(c);          /* create object          */
        
@@ -756,7 +756,7 @@ java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s)
        java_objectheader *o;
 
        /* if c==NULL it is probebly because loader_load failed */
-       if (!c) return exceptionptr;
+       if (!c) return *exceptionptr;
 
        o = builtin_new(c);          /* create object          */
        
index 00f4b2b24a3190c4c8329e16bfc4c4c7b85e30fa..47c8d1daa99eebe057e5c5e261482366f0fa07d3 100644 (file)
@@ -26,7 +26,7 @@
 
    Authors: Reinhard Grafl
 
-   $Id: native.h 833 2004-01-04 22:10:24Z jowenn $
+   $Id: native.h 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -81,7 +81,7 @@ extern classinfo *class_java_lang_Integer;
 extern struct java_lang_ClassLoader *SystemClassLoader;
 
 /* for raising exceptions from native methods */
-extern java_objectheader* exceptionptr;
+/* extern java_objectheader* exceptionptr; */
 
 /* javastring-hashtable */
 extern hashtable string_hash; 
index df7712bcbaaead83eae3fea80469aefe0b48fa87..a448307dbb53ab7930f6129905f7cfc94e786df6 100644 (file)
@@ -151,7 +151,7 @@ JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_reflect_Field_get ( JN
                  }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return NULL;
 }
@@ -176,7 +176,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getBoolean ( JNIEnv *env ,  st
   }
 
   /* raise exception */
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -198,7 +198,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getByte ( JNIEnv *env ,  struc
          return (*env)->GetByteField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -220,7 +220,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getChar ( JNIEnv *env ,  struc
          return (*env)->GetCharField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -242,7 +242,7 @@ JNIEXPORT double JNICALL Java_java_lang_reflect_Field_getDouble ( JNIEnv *env ,
          return (*env)->GetDoubleField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -264,7 +264,7 @@ JNIEXPORT float JNICALL Java_java_lang_reflect_Field_getFloat ( JNIEnv *env ,  s
          return (*env)->GetFloatField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -286,7 +286,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getInt ( JNIEnv *env ,  struct
          return (*env)->GetIntField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -328,7 +328,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getShort ( JNIEnv *env ,  stru
          return (*env)->GetShortField (env, (jobject) obj, fid);
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 
   return 0;
 }
@@ -467,7 +467,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set ( JNIEnv *env ,  struct
     }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -489,7 +489,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setBoolean ( JNIEnv *env ,
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -511,7 +511,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setByte ( JNIEnv *env ,  str
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -533,7 +533,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setChar ( JNIEnv *env ,  str
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -555,7 +555,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setDouble ( JNIEnv *env ,  s
       } 
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -577,7 +577,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setFloat ( JNIEnv *env ,  st
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -599,7 +599,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setInt ( JNIEnv *env ,  stru
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -621,7 +621,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setLong ( JNIEnv *env ,  str
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 /*
@@ -643,7 +643,7 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setShort ( JNIEnv *env ,  st
       }
   }
 
-  exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+  *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
 }
 
 
index 7e26acac18712b98b04720f8a78038b2dfd84b35..37f0106943bc267fdfa9bcbf8a5afa63649caa64 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Joseph Wenninger
 
-   $Id: VMClass.c 833 2004-01-04 22:10:24Z jowenn $
+   $Id: VMClass.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -84,7 +84,7 @@ JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv
 
                /* there is already an exception (NoClassDefFoundError), but forName()
                   returns a ClassNotFoundException */
-               exceptionptr = 
+               *exceptionptr = 
                        native_new_and_init_string(class_java_lang_ClassNotFoundException, s);
 
            return NULL;
@@ -317,7 +317,7 @@ JNIEXPORT struct java_lang_reflect_Field* JNICALL Java_java_lang_VMClass_getFiel
     /* get fieldinfo entry */
     idx = class_findfield_index_approx((classinfo*) (this->vmData), javastring_toutf(name, false));
     if (idx<0) {
-           exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+           *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
            return NULL;
        }
     f= &(((struct classinfo*)(this->vmData))->fields[idx]);
@@ -326,7 +326,7 @@ JNIEXPORT struct java_lang_reflect_Field* JNICALL Java_java_lang_VMClass_getFiel
                if ( public_only && !(f->flags & ACC_PUBLIC))
                        {
                                /* field is not public  and public only had been requested*/
-                               exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
+                               *exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
                                return NULL;
                        }
 
@@ -439,7 +439,7 @@ JNIEXPORT struct java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getMet
     if (!m || (which==MEMBER_PUBLIC && !(m->flags & ACC_PUBLIC)))
                {
                        /* no apropriate method was found */
-                       exceptionptr = native_new_and_init (class_java_lang_NoSuchMethodException);
+                       *exceptionptr = native_new_and_init (class_java_lang_NoSuchMethodException);
                        return NULL;
                }
    
index 3b63da9c42023889ddc88f7a8ae550938eb1d8ae..4d90fba8b95debaf1e33de82c1357537be9f5270 100644 (file)
@@ -4,6 +4,7 @@
 #include "jni.h"
 #include "loader.h"
 #include "native.h"
+#include "builtin.h"
 #include "toolbox/loging.h"
 #include "java_lang_Class.h"
 #include "java_lang_String.h"
@@ -45,7 +46,7 @@ JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClassLoader_getPrimit
     }
 
     /* illegal primitive classname specified */
-    exceptionptr = native_new_and_init (class_java_lang_ClassNotFoundException);
+    *exceptionptr = native_new_and_init (class_java_lang_ClassNotFoundException);
     return NULL;
 }
 
index 54e3658506040acf65b94be4dd831396efa1fa20..6a755d23f7b51c7d1d90638e5d84dead313c9ea1 100644 (file)
@@ -41,7 +41,7 @@ JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_VMObject_clone ( JNIEn
     
     /* We are cloning a non-array */
     if (! builtin_instanceof ((java_objectheader*) this, class_java_lang_Cloneable) ) {
-        exceptionptr = native_new_and_init (class_java_lang_CloneNotSupportedException);
+        *exceptionptr = native_new_and_init (class_java_lang_CloneNotSupportedException);
         return NULL;
     }
 
@@ -49,7 +49,7 @@ JNIEXPORT struct java_lang_Object* JNICALL Java_java_lang_VMObject_clone ( JNIEn
     c = this -> header.vftbl -> class;
     new = (java_lang_Object*) builtin_new (c);
     if (!new) {
-        exceptionptr = proto_java_lang_OutOfMemoryError;
+        *exceptionptr = proto_java_lang_OutOfMemoryError;
         return NULL;
     }
     memcpy (new, this, c->instancesize);
index 85b4014d21064aaccf2080d5d5cc3d3ef8d2455e..396f2f0f84a0e9aeed6a84e88ce76efd372caab8 100644 (file)
@@ -42,7 +42,7 @@ JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy (JNIEnv *env, jclass cl
        fflush(stdout);*/
 
        if (!s || !d) { 
-            exceptionptr = proto_java_lang_NullPointerException; 
+            *exceptionptr = proto_java_lang_NullPointerException; 
             return; 
         }
 
@@ -50,12 +50,12 @@ JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy (JNIEnv *env, jclass cl
         ddesc = d->objheader.vftbl->arraydesc;
 
         if (!sdesc || !ddesc || (sdesc->arraytype != ddesc->arraytype)) {
-            exceptionptr = proto_java_lang_ArrayStoreException; 
+            *exceptionptr = proto_java_lang_ArrayStoreException; 
             return; 
         }
 
        if ((len<0) || (sp<0) || (sp+len > s->size) || (dp<0) || (dp+len > d->size)) {
-            exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException; 
+            *exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException; 
             return; 
         }
 
@@ -76,7 +76,7 @@ JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy (JNIEnv *env, jclass cl
                 for (i=0; i<len; i++) {
                     java_objectheader *o = oas->data[sp+i];
                     if (!builtin_canstore(oad, o)) {
-                        exceptionptr = proto_java_lang_ArrayStoreException;
+                        *exceptionptr = proto_java_lang_ArrayStoreException;
                         return;
                     }
                     oad->data[dp+i] = o;
@@ -92,7 +92,7 @@ JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy (JNIEnv *env, jclass cl
                 for (i=len-1; i>=0; i--) {
                     java_objectheader *o = oas->data[sp+i];
                     if (!builtin_canstore(oad, o)) {
-                        exceptionptr = proto_java_lang_ArrayStoreException;
+                        *exceptionptr = proto_java_lang_ArrayStoreException;
                         return;
                     }
                     oad->data[dp+i] = o;
index aa3ca7801c913c477a4d4a87e069718c8e60f862..1ea972ae1bb008f369efd87a925279e6504117ac 100644 (file)
@@ -247,7 +247,7 @@ JNIEXPORT s4 JNICALL Java_java_lang_Thread_interrupted (JNIEnv *env ,jclass claz
  */
 JNIEXPORT void JNICALL Java_java_lang_Thread_nativeInit (JNIEnv *env ,  struct java_lang_Thread* this , s8 par1) {
        log_text("Thread_nativeInit");
-       if (exceptionptr) log_text("There has been an exception, strange...");
+       if (*exceptionptr) log_text("There has been an exception, strange...");
        this->priority=5;
 }
 
index 84a58b86cd607997e5cb52090530f1548dfa886e..f200794c816d0228f274d974f9b3e2f13e8d2ae2 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "thread.h"
 #include "locks.h"
+#include "builtin.h"
 
 #include "tables.h"
 #include "native.h"
@@ -474,7 +475,7 @@ internal_wait_cond(iMux* mux, iCv* cv, s8 timeout)
     DBG( fprintf(stderr, "waiting on %p\n", cv); );
 
     if (mux->holder != currentThread) {
-               exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
+               *exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
     }
 
        assert(blockInts > 0);
@@ -518,7 +519,7 @@ internal_signal_cond (iCv* cv)
     }
 
     if (cv->mux->holder != currentThread) {
-               exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
+               *exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
     }
 
        assert(blockInts > 0);
@@ -550,7 +551,7 @@ internal_broadcast_cond (iCv* cv)
     }
 
     if (cv->mux->holder != currentThread) {
-               exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
+               *exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
     }
 
        assert(blockInts > 0);
index bba20c00b291c069923d8e90802b76c82c2a9d7c..7f1d2cf39fb9f45321ff5d2ddf7f7ffe3140f9b7 100644 (file)
@@ -40,7 +40,7 @@ pthread_mutex_t compiler_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
 int cast_counter;
 
 #ifndef HAVE___THREAD
-pthread_key_t tkey_exceptionptr;
+pthread_key_t tkey_threadinfo;
 #endif
 #endif
 
@@ -129,7 +129,7 @@ void
 initThreads(u1 *stackbottom)
 {
 #if defined(NATIVE_THREADS) && !defined(HAVE___THREAD)
-       pthread_key_create(&tkey_exceptionptr, NULL);
+       pthread_key_create(&tkey_threadinfo, NULL);
 #endif
 
        thread *the_main_thread;
@@ -174,7 +174,7 @@ printf("DEADCODE LIVES ?????????\n");fflush(stdout);
        }*/
     the_main_thread->priority = NORM_THREAD_PRIO;
     CONTEXT(the_main_thread).priority = (u1)the_main_thread->priority;
-    CONTEXT(the_main_thread).exceptionptr = 0;
+    CONTEXT(the_main_thread).texceptionptr = 0;
     the_main_thread->next = 0;
     CONTEXT(the_main_thread).status = THREAD_SUSPENDED;
     CONTEXT(the_main_thread).stackBase = CONTEXT(the_main_thread).stackEnd = stackbottom;
@@ -245,7 +245,7 @@ startThread (thread* tid)
     CONTEXT(tid).flags = THREAD_FLAGS_GENERAL;
     CONTEXT(tid).status = THREAD_SUSPENDED;
     CONTEXT(tid).priority = (u1)tid->priority;
-    CONTEXT(tid).exceptionptr = 0;
+    CONTEXT(tid).texceptionptr = 0;
 
     /* Construct the initial restore point. */
     THREADINIT((&CONTEXT(tid)), firstStartThread);
@@ -332,8 +332,8 @@ firstStartThread(void)
 
        asm_calljavafunction(method, currentThread, NULL, NULL, NULL);
 
-    if (exceptionptr) {
-        utf_display(exceptionptr->vftbl->class->name);
+    if (*exceptionptr) {
+        utf_display((*exceptionptr)->vftbl->class->name);
         printf("\n");
     }
 
@@ -737,14 +737,14 @@ reschedule(void)
                                        lastThread = currentThread;
                                        currentThread = threadQhead[i];
 
-                                       CONTEXT(currentThread).exceptionptr = exceptionptr;
+                                       CONTEXT(currentThread).texceptionptr = *exceptionptr;
 
                     DBG( fprintf(stderr, "thread switch from: %p to: %p\n", lastThread, currentThread); );
                                        THREADSWITCH((&CONTEXT(currentThread)),
                                                                 (&CONTEXT(lastThread)));
                                        blockInts = b;
 
-                                       exceptionptr = CONTEXT(currentThread).exceptionptr;
+                                       *exceptionptr = CONTEXT(currentThread).texceptionptr;
 
                                        if (stack_to_be_freed != 0) {
                                                stack_to_be_freed = 0;
@@ -767,7 +767,7 @@ reschedule(void)
                                                != 0)
                                        {
                                                CONTEXT(lastThread).flags &= ~THREAD_FLAGS_KILLED;
-                                               exceptionptr = native_new_and_init(class_java_lang_ThreadDeath);
+                                               *exceptionptr = native_new_and_init(class_java_lang_ThreadDeath);
                                        }
                                }
                                /* Now we kill the schedule and turn ints
index f3d43adf69d85d20532fc34866a294c94a3d4711..3b9a48d8a45f6461cbb132dfb5af8674652aefad 100644 (file)
@@ -19,6 +19,7 @@
 #ifdef USE_THREADS
 
 #include "global.h"
+#include "builtin.h"
 
 #define MAXTHREADS              256          /* schani */
 
@@ -62,7 +63,7 @@ typedef struct _ctx
     u1*                stackEnd;
     u1*                usedStackTop;
     s8                 time;
-    java_objectheader *exceptionptr;
+    java_objectheader *texceptionptr;
     struct _thread    *nextlive;
     u1                 flags;
 } ctx;
@@ -170,8 +171,12 @@ extern thread *threadQhead[MAX_THREAD_PRIO + 1];
 void asm_perform_threadswitch(u1 **from, u1 **to, u1 **stackTop);
 u1*  asm_initialize_thread_stack(void *func, u1 *stack);
 
+typedef struct {
+       java_objectheader *_exceptionptr;
+} nativethread;
+
 #if defined(NATIVE_THREADS) && !defined(HAVE___THREAD)
-extern pthread_key_t tkey_exceptionptr;
+extern pthread_key_t tkey_threadinfo;
 #endif
 
 #else
index 7779e88a0c889b730df5b352e219ff93aace241f..68bcb9b720769636f6f457e1fe2d1bc3e6655f9d 100644 (file)
@@ -34,7 +34,7 @@
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 853 2004-01-06 15:36:25Z twisti $
+   $Id: builtin.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -388,34 +388,20 @@ java_objectheader *builtin_throw_exception(java_objectheader *local_exceptionptr
                        }
                log_text(logtext);
        }
-       exceptionptr = local_exceptionptr;
+       *exceptionptr = local_exceptionptr;
        return local_exceptionptr;
 }
 
-java_objectheader *builtin_get_exceptionptr()
+void builtin_reset_exceptionptr()
 {
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
 #ifdef HAVE___THREAD
-       return exceptionptr;
+       _exceptionptr = NULL;
 #else
-       pthread_getspecific(tkey_exceptionptr);
+       ((nativethread*) pthread_getspecific(tkey_exceptionptr))->_exceptionptr = 0;
 #endif
 #else
-       panic("builtin_get_exceptionptr should not be used in this configuration");
-       return NULL;
-#endif
-}
-
-void builtin_set_exceptionptr(java_objectheader *e)
-{
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
-#ifdef HAVE___THREAD
-       exceptionptr = e;
-#else
-       pthread_setspecific(tkey_exceptionptr, e);
-#endif
-#else
-       panic("builtin_set_exceptionptr should not be used in this configuration");
+       panic("builtin_reset_exceptionptr should not be used in this configuration");
 #endif
 }
 
@@ -639,7 +625,7 @@ java_arrayheader *builtin_newarray(s4 size, vftbl *arrayvftbl)
        s4 actualsize;
 
        if (size<0) {
-               exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/NegativeArraySizeException")));
+               *exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/NegativeArraySizeException")));
                return NULL;
        }
 #ifdef SIZE_FROM_CLASSINFO
@@ -649,7 +635,7 @@ java_arrayheader *builtin_newarray(s4 size, vftbl *arrayvftbl)
 #endif
 
        if (((u4)actualsize)<((u4)size)) { /* overflow */
-               exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/OutOfMemoryError")));
+               *exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/OutOfMemoryError")));
                return NULL;
        }
        a = heap_allocate(actualsize,
@@ -861,7 +847,7 @@ java_arrayheader *builtin_nmultianewarray (int n, vftbl *arrayvftbl, long *dims)
 
 u4 methodindent = 0;
 
-java_objectheader *builtin_trace_exception(java_objectheader *exceptionptr,
+java_objectheader *builtin_trace_exception(java_objectheader *_exceptionptr,
                                                                                   methodinfo *method, int *pos, 
                                                                                   int noindent)
 {
@@ -873,8 +859,8 @@ java_objectheader *builtin_trace_exception(java_objectheader *exceptionptr,
        }
        if (verbose || runverbose) {
                printf("Exception ");
-               if (exceptionptr) {
-                       utf_display (exceptionptr->vftbl->class->name);
+               if (_exceptionptr) {
+                       utf_display (_exceptionptr->vftbl->class->name);
                }
                else {
                        printf("Error: <Nullpointer instead of exception>");
@@ -905,7 +891,7 @@ java_objectheader *builtin_trace_exception(java_objectheader *exceptionptr,
                        printf("call_java_method\n");
                fflush (stdout);
        }
-       return exceptionptr;
+       return _exceptionptr;
 }
 
 
index e2d48bd7501b6b2a30d4c5021433a5f3483ca0fd..63c407205a6e2525dd6b4b781f3c226f2820de93 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Edwin Steiner
 
-   $Id: builtin.h 851 2004-01-05 23:59:28Z stefan $
+   $Id: builtin.h 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -37,6 +37,7 @@
 #define _BUILTIN_H
 
 #include "config.h"
+#include "toolbox/loging.h"
 
 
 /* define infinity for floating point numbers */
@@ -115,7 +116,24 @@ extern builtin_descriptor builtin_desc[];
 /* GLOBAL VARIABLES                                                   */
 /**********************************************************************/
 
-extern java_objectheader* exceptionptr;
+#define THREADSPECIFIC
+#define exceptionptr (&_exceptionptr)
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+#ifdef HAVE___THREAD
+
+#undef THREADSPECIFIC
+#define THREADSPECIFIC __thread
+
+#else
+
+#undef exceptionptr
+#define exceptionptr builtin_get_exceptionptrptr()
+
+#endif
+#endif
+
+extern THREADSPECIFIC java_objectheader* _exceptionptr;
 
 
 /**********************************************************************/
@@ -167,14 +185,14 @@ s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl *target);
 
 java_objectheader *builtin_throw_exception(java_objectheader *exception);
 /* NOT AN OP */
-java_objectheader *builtin_trace_exception(java_objectheader *exceptionptr,
+java_objectheader *builtin_trace_exception(java_objectheader *_exceptionptr,
                                                                                   methodinfo *method, 
                                                                                   int *pos, int noindent);
 /* NOT AN OP */
 
-java_objectheader *builtin_get_exceptionptr();
+static inline java_objectheader **builtin_get_exceptionptrptr();
 /* NOT AN OP */
-void builtin_set_exceptionptr(java_objectheader*);
+void builtin_reset_exceptionptr();
 /* NOT AN OP */
 
 java_objectheader *builtin_new(classinfo *c);
@@ -361,6 +379,21 @@ java_arrayheader *builtin_clone_array(void *env, java_arrayheader *o);
 inline float intBitsToFloat(s4 i);
 inline float longBitsToDouble(s8 l);
 
+
+static inline java_objectheader **builtin_get_exceptionptrptr()
+{
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+#ifdef HAVE___THREAD
+    return &_exceptionptr;
+#else
+    return &((nativethread*) pthread_getspecific(tkey_exceptionptr))->_exceptionptr;
+#endif
+#else
+    panic("builtin_get_exceptionptrptr should not be used in this configuration");
+    return NULL;
+#endif
+}
+
 #endif /* _BUILTIN_H */
 
 
index aca321e51e3190c177a6dde1e5a2e1e7092227fd..4daa122da44272f01b50eee092a9819b94bfd94b 100644 (file)
@@ -28,7 +28,7 @@
    Authors: Andreas Krall
             Reinhard Grafl
 
-   $Id: codegen.c 837 2004-01-05 00:04:51Z twisti $
+   $Id: codegen.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -3867,7 +3867,7 @@ u1 *createnativestub(functionptr f, methodinfo *m)
        mcodeptr = (s4 *) (cs);             /* code generation pointer            */
 
        *(cs-1) = (u8) f;                   /* address of native method           */
-       *(cs-2) = (u8) (&exceptionptr);     /* address of exceptionptr            */
+       *(cs-2) = (u8) (&_exceptionptr);    /* address of exceptionptr            */
        *(cs-3) = (u8) asm_handle_nat_exception; /* addr of asm exception handler */
        *(cs-4) = (u8) (&env);              /* addr of jni_environement           */
        *(cs-5) = (u8) asm_builtin_trace;
index c8d851b63125d3b7021f665446be5f82ef42e415..167fd3a0229424152463c71397402ae1db6c9c60 100644 (file)
@@ -28,7 +28,7 @@
    Authors: Andreas Krall
             Christian Thalinger
 
-   $Id: codegen.c 847 2004-01-05 10:49:05Z twisti $
+   $Id: codegen.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -4797,7 +4797,12 @@ void removecompilerstub(u1 *stub)
 
 *******************************************************************************/
 
-#define NATIVESTUBSIZE 320
+#define NATIVESTUBSIZE 340
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+static java_objectheader *(*callgetexceptionptrptr)() = builtin_get_exceptionptrptr;
+static void (*callresetexceptionptr)() = builtin_reset_exceptionptr;
+#endif
 
 u1 *createnativestub(functionptr f, methodinfo *m)
 {
@@ -4964,16 +4969,32 @@ u1 *createnativestub(functionptr f, methodinfo *m)
     }
 
        /* we can't use REG_ITMP3 == REG_RESULT2 */
-       i386_mov_imm_reg((s4) &exceptionptr, REG_ITMP2);
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       i386_push_reg(REG_RESULT);
+       i386_push_reg(REG_RESULT2);
+       i386_call_mem(&callgetexceptionptrptr);
+       i386_mov_membase_reg(REG_RESULT, 0, REG_ITMP2);
+       i386_test_reg_reg(REG_ITMP2, REG_ITMP2);
+       i386_pop_reg(REG_RESULT2);
+       i386_pop_reg(REG_RESULT);
+#else
+       i386_mov_imm_reg((s4) &_exceptionptr, REG_ITMP2);
        i386_mov_membase_reg(REG_ITMP2, 0, REG_ITMP2);
        i386_test_reg_reg(REG_ITMP2, REG_ITMP2);
+#endif
        i386_jcc(I386_CC_NE, 1);
 
        i386_ret();
 
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       i386_push_reg(REG_ITMP2);
+       i386_call_mem(&callresetexceptionptr);
+       i386_pop_reg(REG_ITMP1_XPTR);
+#else
        i386_mov_reg_reg(REG_ITMP2, REG_ITMP1_XPTR);
-       i386_mov_imm_reg((s4) &exceptionptr, REG_ITMP2);
+       i386_mov_imm_reg((s4) &_exceptionptr, REG_ITMP2);
        i386_mov_imm_membase(0, REG_ITMP2, 0);
+#endif
        i386_mov_membase_reg(REG_SP, 0, REG_ITMP2_XPC);
        i386_alu_imm_reg(I386_SUB, 2, REG_ITMP2_XPC);
 
index 0c820c05af097f8b78e86fde05176575805af9a6..62c9381fa53b344ffbb83886a919b85869179006 100644 (file)
@@ -32,7 +32,7 @@
    This module generates MIPS machine code for a sequence of
    intermediate code commands (ICMDs).
 
-   $Id: codegen.c 860 2004-01-06 18:49:09Z twisti $
+   $Id: codegen.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -3735,7 +3735,7 @@ u1 *createnativestub(functionptr f, methodinfo *m)
        s4 *mcodeptr = (s4 *) (cs);         /* code generation pointer            */
 
        *(cs-1) = (u8) f;                   /* address of native method           */
-       *(cs-2) = (u8) (&exceptionptr);     /* address of exceptionptr            */
+       *(cs-2) = (u8) (&_exceptionptr);     /* address of exceptionptr            */
        *(cs-3) = (u8) asm_handle_nat_exception;/* addr of asm exception handler  */
        *(cs-4) = (u8) (&env);              /* addr of jni_environement           */
        *(cs-5) = (u8) asm_builtin_trace;
index 0eac79e0a3bbb50b5985eac56b9db929f2cef257..8e88ba8e439183833c92f2ae5caecd29f0e01408 100644 (file)
@@ -28,7 +28,7 @@
    Authors: Andreas Krall
             Stefan Ring
 
-   $Id: codegen.c 759 2003-12-13 22:36:08Z stefan $
+   $Id: codegen.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -3274,7 +3274,7 @@ u1 *createnativestub (functionptr f, methodinfo *m)
        s4 *mcodeptr = cs;                  /* code generation pointer            */
 
        *(cs-1) = (s4) f;                   /* address of native method           */
-       *(cs-2) = (s4) (&exceptionptr);     /* address of exceptionptr            */
+       *(cs-2) = (s4) (&_exceptionptr);    /* address of exceptionptr            */
        *(cs-3) = (s4) asm_handle_nat_exception; /* addr of asm exception handler */
        *(cs-4) = (s4) (&env);              /* addr of jni_environement           */
 //     *(cs-5) = (s4) asm_builtin_trace;
index a3f5b7f9fcb0cb742f7b237292e054c81a9cbb4e..f6e0b37cb56b8a091736eed479fb4e204a4bcec2 100644 (file)
@@ -28,7 +28,7 @@
    Authors: Andreas Krall
             Christian Thalinger
 
-   $Id: codegen.c 724 2003-12-09 18:56:11Z edwin $
+   $Id: codegen.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -3874,7 +3874,7 @@ u1 *createnativestub(functionptr f, methodinfo *m)
                x86_64_alu_imm_reg(X86_64_ADD, 3 * 8, REG_SP);    /* keep stack 16-byte aligned */
        }
 
-       x86_64_mov_imm_reg((s8) &exceptionptr, REG_ITMP3);
+       x86_64_mov_imm_reg((s8) &_exceptionptr, REG_ITMP3);
        x86_64_mov_membase_reg(REG_ITMP3, 0, REG_ITMP3);
        x86_64_test_reg_reg(REG_ITMP3, REG_ITMP3);
        x86_64_jcc(X86_64_CC_NE, 1);
@@ -3882,7 +3882,7 @@ u1 *createnativestub(functionptr f, methodinfo *m)
        x86_64_ret();
 
        x86_64_mov_reg_reg(REG_ITMP3, REG_ITMP1_XPTR);
-       x86_64_mov_imm_reg((s8) &exceptionptr, REG_ITMP3);
+       x86_64_mov_imm_reg((s8) &_exceptionptr, REG_ITMP3);
        x86_64_alu_reg_reg(X86_64_XOR, REG_ITMP2, REG_ITMP2);
        x86_64_mov_reg_membase(REG_ITMP2, REG_ITMP3, 0);    /* clear exception pointer */
 
index 7e3221a6d130c45a4c5bfc4ff4f1131cbabcd137..19215b8fd25624bd44052cf00600a444214b5b09 100644 (file)
@@ -30,7 +30,7 @@
             Mark Probst
                        Edwin Steiner
 
-   $Id: loader.c 861 2004-01-06 20:55:56Z twisti $
+   $Id: loader.c 862 2004-01-06 23:42:01Z stefan $
 
 */
 
@@ -2674,10 +2674,10 @@ void class_init(classinfo *c)
 #endif
 
        /* we have to throw an exception */
-       if (exceptionptr) {
+       if (*exceptionptr) {
                printf("Exception in thread \"main\" java.lang.ExceptionInInitializerError\n");
                printf("Caused by: ");
-               utf_display(exceptionptr->vftbl->class->name);
+               utf_display((*exceptionptr)->vftbl->class->name);
                printf("\n");
                fflush(stdout);
                exit(1);
@@ -2719,9 +2719,9 @@ void class_init(classinfo *c)
                blockInts = b;
 #endif
 
-               if (exceptionptr) {
+               if (*exceptionptr) {
                        printf("#### initializeSystemClass has thrown: ");
-                       utf_display(exceptionptr->vftbl->class->name);
+                       utf_display((*exceptionptr)->vftbl->class->name);
                        printf("\n");
                        fflush(stdout);
                }
@@ -3048,7 +3048,7 @@ classinfo *loader_load(utf *topname)
                                if (linkverbose)
                                        dolog("Cannot resolve linking dependencies");
                                top = NULL;
-                               if (!exceptionptr)
+                               if (!*exceptionptr)
                                        throw_linkageerror_message(c->name);
                                break;
                        }
index 84a58b86cd607997e5cb52090530f1548dfa886e..f200794c816d0228f274d974f9b3e2f13e8d2ae2 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "thread.h"
 #include "locks.h"
+#include "builtin.h"
 
 #include "tables.h"
 #include "native.h"
@@ -474,7 +475,7 @@ internal_wait_cond(iMux* mux, iCv* cv, s8 timeout)
     DBG( fprintf(stderr, "waiting on %p\n", cv); );
 
     if (mux->holder != currentThread) {
-               exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
+               *exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
     }
 
        assert(blockInts > 0);
@@ -518,7 +519,7 @@ internal_signal_cond (iCv* cv)
     }
 
     if (cv->mux->holder != currentThread) {
-               exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
+               *exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
     }
 
        assert(blockInts > 0);
@@ -550,7 +551,7 @@ internal_broadcast_cond (iCv* cv)
     }
 
     if (cv->mux->holder != currentThread) {
-               exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
+               *exceptionptr = native_new_and_init(class_java_lang_IllegalMonitorStateException);
     }
 
        assert(blockInts > 0);
index bba20c00b291c069923d8e90802b76c82c2a9d7c..7f1d2cf39fb9f45321ff5d2ddf7f7ffe3140f9b7 100644 (file)
@@ -40,7 +40,7 @@ pthread_mutex_t compiler_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
 int cast_counter;
 
 #ifndef HAVE___THREAD
-pthread_key_t tkey_exceptionptr;
+pthread_key_t tkey_threadinfo;
 #endif
 #endif
 
@@ -129,7 +129,7 @@ void
 initThreads(u1 *stackbottom)
 {
 #if defined(NATIVE_THREADS) && !defined(HAVE___THREAD)
-       pthread_key_create(&tkey_exceptionptr, NULL);
+       pthread_key_create(&tkey_threadinfo, NULL);
 #endif
 
        thread *the_main_thread;
@@ -174,7 +174,7 @@ printf("DEADCODE LIVES ?????????\n");fflush(stdout);
        }*/
     the_main_thread->priority = NORM_THREAD_PRIO;
     CONTEXT(the_main_thread).priority = (u1)the_main_thread->priority;
-    CONTEXT(the_main_thread).exceptionptr = 0;
+    CONTEXT(the_main_thread).texceptionptr = 0;
     the_main_thread->next = 0;
     CONTEXT(the_main_thread).status = THREAD_SUSPENDED;
     CONTEXT(the_main_thread).stackBase = CONTEXT(the_main_thread).stackEnd = stackbottom;
@@ -245,7 +245,7 @@ startThread (thread* tid)
     CONTEXT(tid).flags = THREAD_FLAGS_GENERAL;
     CONTEXT(tid).status = THREAD_SUSPENDED;
     CONTEXT(tid).priority = (u1)tid->priority;
-    CONTEXT(tid).exceptionptr = 0;
+    CONTEXT(tid).texceptionptr = 0;
 
     /* Construct the initial restore point. */
     THREADINIT((&CONTEXT(tid)), firstStartThread);
@@ -332,8 +332,8 @@ firstStartThread(void)
 
        asm_calljavafunction(method, currentThread, NULL, NULL, NULL);
 
-    if (exceptionptr) {
-        utf_display(exceptionptr->vftbl->class->name);
+    if (*exceptionptr) {
+        utf_display((*exceptionptr)->vftbl->class->name);
         printf("\n");
     }
 
@@ -737,14 +737,14 @@ reschedule(void)
                                        lastThread = currentThread;
                                        currentThread = threadQhead[i];
 
-                                       CONTEXT(currentThread).exceptionptr = exceptionptr;
+                                       CONTEXT(currentThread).texceptionptr = *exceptionptr;
 
                     DBG( fprintf(stderr, "thread switch from: %p to: %p\n", lastThread, currentThread); );
                                        THREADSWITCH((&CONTEXT(currentThread)),
                                                                 (&CONTEXT(lastThread)));
                                        blockInts = b;
 
-                                       exceptionptr = CONTEXT(currentThread).exceptionptr;
+                                       *exceptionptr = CONTEXT(currentThread).texceptionptr;
 
                                        if (stack_to_be_freed != 0) {
                                                stack_to_be_freed = 0;
@@ -767,7 +767,7 @@ reschedule(void)
                                                != 0)
                                        {
                                                CONTEXT(lastThread).flags &= ~THREAD_FLAGS_KILLED;
-                                               exceptionptr = native_new_and_init(class_java_lang_ThreadDeath);
+                                               *exceptionptr = native_new_and_init(class_java_lang_ThreadDeath);
                                        }
                                }
                                /* Now we kill the schedule and turn ints
index f3d43adf69d85d20532fc34866a294c94a3d4711..3b9a48d8a45f6461cbb132dfb5af8674652aefad 100644 (file)
@@ -19,6 +19,7 @@
 #ifdef USE_THREADS
 
 #include "global.h"
+#include "builtin.h"
 
 #define MAXTHREADS              256          /* schani */
 
@@ -62,7 +63,7 @@ typedef struct _ctx
     u1*                stackEnd;
     u1*                usedStackTop;
     s8                 time;
-    java_objectheader *exceptionptr;
+    java_objectheader *texceptionptr;
     struct _thread    *nextlive;
     u1                 flags;
 } ctx;
@@ -170,8 +171,12 @@ extern thread *threadQhead[MAX_THREAD_PRIO + 1];
 void asm_perform_threadswitch(u1 **from, u1 **to, u1 **stackTop);
 u1*  asm_initialize_thread_stack(void *func, u1 *stack);
 
+typedef struct {
+       java_objectheader *_exceptionptr;
+} nativethread;
+
 #if defined(NATIVE_THREADS) && !defined(HAVE___THREAD)
-extern pthread_key_t tkey_exceptionptr;
+extern pthread_key_t tkey_threadinfo;
 #endif
 
 #else