The .hh files created with the header file generator are all
included here as are the C functions implementing these methods.
- $Id: native.c 1173 2004-06-16 14:56:18Z jowenn $
+ $Id: native.c 1322 2004-07-17 12:29:18Z motse $
*/
#include "config.h"
#include "global.h"
-#include "main.h"
+#include "options.h"
#include "jni.h"
#include "native.h"
-#include "nativetypes.hh"
#include "builtin.h"
#include "asmpart.h"
#include "tables.h"
#include "threads/threadio.h"
+/* include table of native functions */
+
+#include "nativetable.inc"
+
+
/* searchpath for classfiles */
char *classpath;
methodinfo *method_vmclass_init;
-/* system exception classes required while compiling */
+/* system exception classes required in cacao */
classinfo *class_java_lang_Throwable;
+classinfo *class_java_lang_Exception;
+classinfo *class_java_lang_Error;
/* exception/error super class */
void use_class_as_object(classinfo *c)
{
if (!c->classvftbl) {
- c->classvftbl = true;
-
c->header.vftbl = class_java_lang_Class->vftbl;
+ c->classvftbl = true;
}
}
#include "nat/GdkPixbufDecoder.c"
#include "nat/GtkScrollPanePeer.c"
#include "nat/GtkFileDialogPeer.c"
-#include "nat/GtkLabelPeer.c"
#endif
#undef JOWENN_DEBUG
#undef JOWENN_DEBUG1
-/* table for locating native methods */
-static struct nativeref {
- char *classname;
- char *methodname;
- char *descriptor;
- bool isstatic;
- functionptr func;
-} nativetable [] = {
-
-#include "nativetable.hh"
-
-};
-
-
#define NATIVETABLESIZE (sizeof(nativetable)/sizeof(struct nativeref))
/* table for fast string comparison */
-static struct nativecompref {
- utf *classname;
- utf *methodname;
- utf *descriptor;
- bool isstatic;
- functionptr func;
-} nativecomptable [NATIVETABLESIZE];
+static nativecompref nativecomptable[NATIVETABLESIZE];
/* string comparsion table initialized */
static bool nativecompdone = false;
void init_system_exceptions()
{
- classinfo *c;
-
/* java/lang/Throwable */
class_java_lang_Throwable =
class_new(utf_new_char(string_java_lang_Throwable));
class_load(class_java_lang_Throwable);
class_link(class_java_lang_Throwable);
- compile_all_class_methods(class_java_lang_Throwable);
-
- /* java/lang/VMThrowable */
-
- c = class_new(utf_new_char(string_java_lang_VMThrowable));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
-
- /* java/lang/ClassFormatError */
-
- c = class_new(utf_new_char(string_java_lang_ClassFormatError));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
-
- /* java/lang/Error */
-
- c = class_new(utf_new_char(string_java_lang_Error));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
/* java/lang/Exception */
- c = class_new(utf_new_char(string_java_lang_Exception));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
-
- /* java/lang/IncompatibleClassChangeError */
-
- c = class_new(utf_new_char(string_java_lang_IncompatibleClassChangeError));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
-
- /* java/lang/LinkageError */
-
- c = class_new(utf_new_char(string_java_lang_LinkageError));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
-
- /* java/lang/NoClassDefFoundError */
+ class_java_lang_Exception =
+ class_new(utf_new_char(string_java_lang_Exception));
+ class_load(class_java_lang_Exception);
+ class_link(class_java_lang_Exception);
- c = class_new(utf_new_char(string_java_lang_NoClassDefFoundError));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
-
- /* java/lang/NoSuchFieldError */
-
- c = class_new(utf_new_char(string_java_lang_NoSuchFieldError));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
-
- /* java/lang/NoSuchMethodError */
-
- c = class_new(utf_new_char(string_java_lang_NoSuchMethodError));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
-
- /* java/lang/OutOfMemoryError */
-
- c = class_new(utf_new_char(string_java_lang_OutOfMemoryError));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
-
- /* java/lang/VerifyError */
-
- c = class_new(utf_new_char(string_java_lang_VerifyError));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
-
- /* java/lang/VirtualMachineError */
+ /* java/lang/Error */
- c = class_new(utf_new_char(string_java_lang_VirtualMachineError));
- class_load(c);
- class_link(c);
- compile_all_class_methods(c);
+ class_java_lang_Error =
+ class_new(utf_new_char(string_java_lang_Error));
+ class_load(class_java_lang_Error);
+ class_link(class_java_lang_Error);
}
}
-void throw_exception_exit()
+static void throw_exception_exit_intern(bool doexit)
{
java_objectheader *xptr;
classinfo *c;
/* clear exception, because we are calling jit code again */
*exceptionptr = NULL;
- fprintf(stderr, "Exception in thread \"main\" ");
- fflush(stderr);
-
c = xptr->vftbl->class;
-/* ts = class_resolveclassmethod(c, */
-/* utf_new_char("toString"), */
-/* utf_new_char("()Ljava/lang/String;"), */
-/* class_java_lang_Object, */
-/* false); */
-
-/* if (!ts) { */
-/* panic("internal error"); */
-/* } */
-
-/* tostring = asm_calljavafunction(ts, xptr, NULL, NULL, NULL); */
-
-/* utf_display(javastring_toutf(tostring, false)); */
-
pss = class_resolveclassmethod(c,
utf_new_char("printStackTrace"),
utf_new_char("()V"),
fflush(stderr);
/* good bye! */
- exit(1);
+ if (doexit) {
+ exit(1);
+ }
}
}
+void throw_exception()
+{
+ throw_exception_exit_intern(false);
+}
+
+
+void throw_exception_exit()
+{
+ throw_exception_exit_intern(true);
+}
+
+
+void throw_main_exception()
+{
+ fprintf(stderr, "Exception in thread \"main\" ");
+ fflush(stderr);
+
+ throw_exception_exit_intern(false);
+}
+
+
+void throw_main_exception_exit()
+{
+ fprintf(stderr, "Exception in thread \"main\" ");
+ fflush(stderr);
+
+ throw_exception_exit_intern(true);
+}
+
+
void throw_cacao_exception_exit(char *exception, char *message)
{
s4 i;
buflength = u2_utflength(unicode_pos, unicode_length);
buffer = MNEW(char, buflength);
- /* memory allocation failed */
- if (!buffer) {
- printf("length: %d\n",buflength);
- log_text("utf_new_u2:buffer==NULL");
- }
-
left = buflength;
pos = buffer;
literalstring *s; /* hashtable element */
java_lang_String *js; /* u2-array wrapped in javastring */
java_chararray *stringdata; /* copy of u2-array */
- u4 key;
- u4 slot;
+ classinfo *c;
+ u4 key;
+ u4 slot;
u2 i;
//#define DEBUG_LITERALSTRING_U2
stringdata->header.objheader.vftbl = primitivetype_table[ARRAYTYPE_CHAR].arrayvftbl;
stringdata->header.size = length;
+ /* if we use eager loading, we have to check loaded String class */
+ if (opt_eager) {
+ class_java_lang_String =
+ class_new_intern(utf_new_char("java/lang/String"));
+
+ if (!class_load(class_java_lang_String))
+ return NULL;
+
+ list_addfirst(&unlinkedclasses, class_java_lang_String);
+ }
+
/* create new javastring */
js = LNEW(java_lang_String);
- /* TWISTI */
-/* js->header.vftbl = class_java_lang_String->vftbl; */
- js->header.vftbl = class_load(class_new(utf_new_char("java/lang/String")))->vftbl;
+ js->header.vftbl = class_java_lang_String->vftbl;
js->value = stringdata;
js->offset = 0;
js->count = length;
+#ifdef DEBUG_LITERALSTRING_U2
+ printf("literalstring_u2: newly created at %p\n", js);
+ utf_display(javastring_toutf(js, 0));
+ printf("\n\n");
+ fflush(stdout);
+#endif
+
/* create new literalstring */
s = NEW(literalstring);
s->hashlink = string_hash.ptr[slot];
s->string = (java_objectheader *) js;
string_hash.ptr[slot] = s;
- /* update numbe of hashtable entries */
+ /* update number of hashtable entries */
string_hash.entries++;
/* reorganization of hashtable */
the external chains is approx. 2 */
u4 i;
- literalstring *s;
+ literalstring *s;
hashtable newhash; /* the new hashtable */
/* create new hashtable, double the size */
string_hash = newhash;
}
-#ifdef DEBUG_LITERALSTRING_U2
- printf("literalstring_u2: newly created at %p\n", js);
- utf_display(javastring_toutf(js, 0));
- printf("\n\n");
- fflush(stdout);
-#endif
-
return (java_objectheader *) js;
}
}
-void copy_vftbl(vftbl **dest, vftbl *src)
+void copy_vftbl(vftbl_t **dest, vftbl_t *src)
{
*dest = src;
#if 0
}
-/******************************************************************************************
+/* get_parametertypes **********************************************************
- use the descriptor of a method to generate a java/lang/Class array
- which contains the classes of the parametertypes of the method
+ use the descriptor of a method to generate a java/lang/Class array
+ which contains the classes of the parametertypes of the method
-*******************************************************************************************/
+*******************************************************************************/
java_objectarray* get_parametertypes(methodinfo *m)
{
utf_nextu2(&utf_ptr);
/* determine number of parameters */
- while ( *utf_ptr != ')' ) {
- get_type(&utf_ptr,desc_end,true);
- parametercount++;
+ while (*utf_ptr != ')') {
+ get_type(&utf_ptr, desc_end, true);
+ parametercount++;
}
/* create class-array */
result = builtin_anewarray(parametercount, class_java_lang_Class);
- utf_ptr = descr->text;
+ utf_ptr = descr->text;
utf_nextu2(&utf_ptr);
/* get returntype classes */
for (i = 0; i < parametercount; i++)
- result->data[i] = (java_objectheader *) get_type(&utf_ptr,desc_end, false);
+ result->data[i] =
+ (java_objectheader *) get_type(&utf_ptr, desc_end, false);
return result;
}
+/* get_exceptiontypes **********************************************************
+ get the exceptions which can be thrown by a method
-
-/******************************************************************************************
-
- get the exceptions which can be thrown by a method
-
-*******************************************************************************************/
+*******************************************************************************/
java_objectarray* get_exceptiontypes(methodinfo *m) {
u2 exccount=m->thrownexceptionscount;