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 $
*/
}
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
}
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
#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,
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)
{
}
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>");
printf("call_java_method\n");
fflush (stdout);
}
- return exceptionptr;
+ return _exceptionptr;
}
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 $
*/
#define _BUILTIN_H
#include "config.h"
+#include "toolbox/loging.h"
/* define infinity for floating point numbers */
/* 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;
/**********************************************************************/
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);
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 */
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 $
*/
#include "global.h"
#include "tables.h"
#include "loader.h"
+#include "builtin.h"
#include "mm/boehm.h"
#include "toolbox/chain.h"
#include "toolbox/memory.h"
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; }
/************************ 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 */
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 $
*/
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;
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 $
*/
*******************************************************************************/
-#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)
{
}
/* 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);
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 $
*/
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;
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 $
*/
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;
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 $
*/
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);
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 */
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 $
*/
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;
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) {
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;
}
}
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;
/*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) {
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;
}
}
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) {
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;
}
}
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;
}
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;
}
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;
}
}
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;
}
}
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;
}
*/
if (methodID == 0) {
- exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+ *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
return 0;
}
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;
}
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;
}
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;
}
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;
}
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;
}
*/
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;
}
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;
}
jint Throw(JNIEnv* env, jthrowable obj)
{
- exceptionptr = (java_objectheader*) obj;
+ *exceptionptr = (java_objectheader*) obj;
return 0;
}
o->detailMessage = (java_lang_String*) javastring_new_char((char *) msg);
- exceptionptr = (java_objectheader*) o;
+ *exceptionptr = (java_objectheader*) o;
return 0;
}
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);
}
void ExceptionClear (JNIEnv* env)
{
- exceptionptr = NULL;
+ *exceptionptr = NULL;
}
/* 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;
}
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;
}
/* 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;
}
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;
}
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;
}
{
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;
}
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;
}
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;
}
{
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;
}
{
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;
}
{
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;
}
{
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;
}
{
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;
}
{
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;
}
{
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;
}
{
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;
}
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]));
}
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)
{
log_text("JNI-Call: ExceptionCheck");
- return exceptionptr ? JNI_TRUE : JNI_FALSE;
+ return *exceptionptr ? JNI_TRUE : JNI_FALSE;
}
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);
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;
}
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;
}
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);
0,
0);
- if (exceptionptr != NULL)
+ if (*exceptionptr != NULL)
panic("jni.c: error while creating InvocationTargetException wrapper");
- exceptionptr = ivte;
+ *exceptionptr = ivte;
}
return (jobject *) retVal;
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 $
*/
#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);
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);
}
if (linkverbose)
dolog("Cannot resolve linking dependencies");
top = NULL;
- if (!exceptionptr)
+ if (!*exceptionptr)
throw_linkageerror_message(c->name);
break;
}
- 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 $
*/
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) {
/* 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");
}
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 $
*/
#include "global.h"
#include "native.h"
#include "asmpart.h"
+#include "builtin.h"
#include "threads/thread.h"
#include "toolbox/loging.h"
asm_calljavafunction(ob->vftbl->class->finalizer, ob, NULL, NULL, NULL);
/* if we had an exception in the finalizer, ignore it */
- exceptionptr = NULL;
+ *exceptionptr = NULL;
}
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
return NULL;
}
}
/* raise exception */
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
return 0;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
*/
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;
}
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 $
*/
/* 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;
/* 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]);
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;
}
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;
}
#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"
}
/* illegal primitive classname specified */
- exceptionptr = native_new_and_init (class_java_lang_ClassNotFoundException);
+ *exceptionptr = native_new_and_init (class_java_lang_ClassNotFoundException);
return NULL;
}
/* 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;
}
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);
fflush(stdout);*/
if (!s || !d) {
- exceptionptr = proto_java_lang_NullPointerException;
+ *exceptionptr = proto_java_lang_NullPointerException;
return;
}
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;
}
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;
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;
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 $
*/
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 **************/
}
/* 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));
}
}
/* 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));
}
}
/* 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;
}
}
/* 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;
}
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 */
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 */
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 $
*/
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;
- 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 $
*/
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) {
/* 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");
}
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 $
*/
#include "global.h"
#include "tables.h"
#include "loader.h"
+#include "builtin.h"
#include "mm/boehm.h"
#include "toolbox/chain.h"
#include "toolbox/memory.h"
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; }
/************************ 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 */
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 $
*/
#include "global.h"
#include "native.h"
#include "asmpart.h"
+#include "builtin.h"
#include "threads/thread.h"
#include "toolbox/loging.h"
asm_calljavafunction(ob->vftbl->class->finalizer, ob, NULL, NULL, NULL);
/* if we had an exception in the finalizer, ignore it */
- exceptionptr = NULL;
+ *exceptionptr = NULL;
}
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 $
*/
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;
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) {
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;
}
}
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;
/*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) {
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;
}
}
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) {
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;
}
}
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;
}
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;
}
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;
}
}
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;
}
}
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;
}
*/
if (methodID == 0) {
- exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
+ *exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
return 0;
}
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;
}
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;
}
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;
}
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;
}
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;
}
*/
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;
}
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;
}
jint Throw(JNIEnv* env, jthrowable obj)
{
- exceptionptr = (java_objectheader*) obj;
+ *exceptionptr = (java_objectheader*) obj;
return 0;
}
o->detailMessage = (java_lang_String*) javastring_new_char((char *) msg);
- exceptionptr = (java_objectheader*) o;
+ *exceptionptr = (java_objectheader*) o;
return 0;
}
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);
}
void ExceptionClear (JNIEnv* env)
{
- exceptionptr = NULL;
+ *exceptionptr = NULL;
}
/* 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;
}
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;
}
/* 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;
}
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;
}
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;
}
{
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;
}
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;
}
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;
}
{
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;
}
{
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;
}
{
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;
}
{
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;
}
{
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;
}
{
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;
}
{
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;
}
{
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;
}
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]));
}
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)
{
log_text("JNI-Call: ExceptionCheck");
- return exceptionptr ? JNI_TRUE : JNI_FALSE;
+ return *exceptionptr ? JNI_TRUE : JNI_FALSE;
}
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);
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;
}
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;
}
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);
0,
0);
- if (exceptionptr != NULL)
+ if (*exceptionptr != NULL)
panic("jni.c: error while creating InvocationTargetException wrapper");
- exceptionptr = ivte;
+ *exceptionptr = ivte;
}
return (jobject *) retVal;
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 $
*/
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 **************/
}
/* 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));
}
}
/* 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));
}
}
/* 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;
}
}
/* 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;
}
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 */
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 */
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 $
*/
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;
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
return NULL;
}
}
/* raise exception */
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
return 0;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
/*
}
}
- exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
+ *exceptionptr = native_new_and_init(class_java_lang_IllegalArgumentException);
}
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 $
*/
/* 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;
/* 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]);
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;
}
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;
}
#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"
}
/* illegal primitive classname specified */
- exceptionptr = native_new_and_init (class_java_lang_ClassNotFoundException);
+ *exceptionptr = native_new_and_init (class_java_lang_ClassNotFoundException);
return NULL;
}
/* 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;
}
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);
fflush(stdout);*/
if (!s || !d) {
- exceptionptr = proto_java_lang_NullPointerException;
+ *exceptionptr = proto_java_lang_NullPointerException;
return;
}
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;
}
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;
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;
*/
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;
}
#include "thread.h"
#include "locks.h"
+#include "builtin.h"
#include "tables.h"
#include "native.h"
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);
}
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);
}
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);
int cast_counter;
#ifndef HAVE___THREAD
-pthread_key_t tkey_exceptionptr;
+pthread_key_t tkey_threadinfo;
#endif
#endif
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;
}*/
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;
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);
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");
}
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;
!= 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
#ifdef USE_THREADS
#include "global.h"
+#include "builtin.h"
#define MAXTHREADS 256 /* schani */
u1* stackEnd;
u1* usedStackTop;
s8 time;
- java_objectheader *exceptionptr;
+ java_objectheader *texceptionptr;
struct _thread *nextlive;
u1 flags;
} ctx;
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
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 $
*/
}
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
}
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
#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,
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)
{
}
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>");
printf("call_java_method\n");
fflush (stdout);
}
- return exceptionptr;
+ return _exceptionptr;
}
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 $
*/
#define _BUILTIN_H
#include "config.h"
+#include "toolbox/loging.h"
/* define infinity for floating point numbers */
/* 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;
/**********************************************************************/
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);
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 */
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 $
*/
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;
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 $
*/
*******************************************************************************/
-#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)
{
}
/* 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);
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 $
*/
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;
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 $
*/
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;
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 $
*/
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);
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 */
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 $
*/
#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);
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);
}
if (linkverbose)
dolog("Cannot resolve linking dependencies");
top = NULL;
- if (!exceptionptr)
+ if (!*exceptionptr)
throw_linkageerror_message(c->name);
break;
}
#include "thread.h"
#include "locks.h"
+#include "builtin.h"
#include "tables.h"
#include "native.h"
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);
}
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);
}
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);
int cast_counter;
#ifndef HAVE___THREAD
-pthread_key_t tkey_exceptionptr;
+pthread_key_t tkey_threadinfo;
#endif
#endif
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;
}*/
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;
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);
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");
}
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;
!= 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
#ifdef USE_THREADS
#include "global.h"
+#include "builtin.h"
#define MAXTHREADS 256 /* schani */
u1* stackEnd;
u1* usedStackTop;
s8 time;
- java_objectheader *exceptionptr;
+ java_objectheader *texceptionptr;
struct _thread *nextlive;
u1 flags;
} ctx;
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