-/* native.c - table of native functions
+/* native/native.c - table of native functions
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
The .hh files created with the header file generator are all
included here as are the C functions implementing these methods.
- $Id: native.c 1269 2004-07-03 10:31:02Z stefan $
+ $Id: native.c 1655 2004-12-02 16:51:20Z carolyn $
*/
#include <sys/time.h>
#include <utime.h>
-#include "config.h"
-#include "global.h"
-#include "options.h"
-#include "jni.h"
-#include "native.h"
-#include "builtin.h"
-#include "asmpart.h"
-#include "tables.h"
-#include "loader.h"
-#include "jni.h"
-#include "jit/jit.h"
-#include "toolbox/logging.h"
-#include "toolbox/memory.h"
-#include "threads/thread.h"
-#include "threads/threadio.h"
-#include "threads/locks.h"
-#include "nat/java_lang_VMClass.h"
-#include "nat/java_lang_Throwable.h"
-
/* Include files for IO functions */
#include <fcntl.h>
#endif
#include <sys/stat.h>
+#include "config.h"
+#include "mm/memory.h"
+#include "native/jni.h"
+#include "native/native.h"
+#include "native/include/java_lang_Throwable.h"
+#include "toolbox/logging.h"
+#include "vm/builtin.h"
+#include "vm/exceptions.h"
+#include "vm/global.h"
+#include "vm/loader.h"
+#include "vm/options.h"
+#include "vm/tables.h"
+#include "vm/jit/asmpart.h"
+#include "vm/jit/jit.h"
+#if 0
+#include "threads/thread.h"
#include "threads/threadio.h"
+#include "threads/locks.h"
+#endif
-/* include table of native functions */
-#include "nativetable.inc"
+/* include table of native functions ******************************************/
+/* XXX quick hack? */
+#if defined(USE_GTK)
+#include "native/vm/GtkComponentPeer.c"
+#include "native/vm/GtkScrollPanePeer.c"
+#include "native/vm/GtkFileDialogPeer.c"
+#endif
+
+#include "nativetable.inc"
-/* searchpath for classfiles */
-char *classpath;
/* for java-string to char conversion */
#define MAXSTRINGSIZE 1000
methodinfo *method_vmclass_init;
-/* 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 */
-
-char *string_java_lang_Throwable =
- "java/lang/Throwable";
-
-char *string_java_lang_VMThrowable =
- "java/lang/VMThrowable";
-
-
-/* specify some exception strings for code generation */
-
-char *string_java_lang_ArithmeticException =
- "java/lang/ArithmeticException";
-
-char *string_java_lang_ArithmeticException_message =
- "/ by zero";
-
-char *string_java_lang_ArrayIndexOutOfBoundsException =
- "java/lang/ArrayIndexOutOfBoundsException";
-
-char *string_java_lang_ArrayStoreException =
- "java/lang/ArrayStoreException";
-
-char *string_java_lang_ClassCastException =
- "java/lang/ClassCastException";
-
-char *string_java_lang_ClassNotFoundException =
- "java/lang/ClassNotFoundException";
-
-char *string_java_lang_CloneNotSupportedException =
- "java/lang/CloneNotSupportedException";
-
-char *string_java_lang_Exception =
- "java/lang/Exception";
-
-char *string_java_lang_IllegalArgumentException =
- "java/lang/IllegalArgumentException";
-
-char *string_java_lang_IllegalMonitorStateException =
- "java/lang/IllegalMonitorStateException";
-
-char *string_java_lang_NegativeArraySizeException =
- "java/lang/NegativeArraySizeException";
-
-char *string_java_lang_NoSuchFieldException =
- "java/lang/NoSuchFieldException";
-
-char *string_java_lang_NoSuchMethodException =
- "java/lang/NoSuchMethodException";
-
-char *string_java_lang_NullPointerException =
- "java/lang/NullPointerException";
-
-
-/* specify some error strings for code generation */
-
-char *string_java_lang_AbstractMethodError =
- "java/lang/AbstractMethodError";
-
-char *string_java_lang_ClassCircularityError =
- "java/lang/ClassCircularityError";
-
-char *string_java_lang_ClassFormatError =
- "java/lang/ClassFormatError";
-
-char *string_java_lang_Error =
- "java/lang/Error";
-
-char *string_java_lang_ExceptionInInitializerError =
- "java/lang/ExceptionInInitializerError";
-
-char *string_java_lang_IncompatibleClassChangeError =
- "java/lang/IncompatibleClassChangeError";
-
-char *string_java_lang_InternalError =
- "java/lang/InternalError";
-
-char *string_java_lang_LinkageError =
- "java/lang/LinkageError";
-
-char *string_java_lang_NoClassDefFoundError =
- "java/lang/NoClassDefFoundError";
-
-char *string_java_lang_NoSuchFieldError =
- "java/lang/NoSuchFieldError";
-
-char *string_java_lang_NoSuchMethodError =
- "java/lang/NoSuchMethodError";
-
-char *string_java_lang_OutOfMemoryError =
- "java/lang/OutOfMemoryError";
-
-char *string_java_lang_VerifyError =
- "java/lang/VerifyError";
-
-char *string_java_lang_VirtualMachineError =
- "java/lang/VirtualMachineError";
-
-
/* the system classloader object */
struct java_lang_ClassLoader *SystemClassLoader = NULL;
}
-/*************************** include native methods ***************************/
-
-#ifdef USE_GTK
-#include "nat/GdkGraphics.c"
-#include "nat/GtkComponentPeer.c"
-#include "nat/GdkPixbufDecoder.c"
-#include "nat/GtkScrollPanePeer.c"
-#include "nat/GtkFileDialogPeer.c"
-#include "nat/GtkLabelPeer.c"
-#endif
-
-
/************************** tables for methods ********************************/
#undef JOWENN_DEBUG
#undef JOWENN_DEBUG1
+#ifdef STATIC_CLASSPATH
#define NATIVETABLESIZE (sizeof(nativetable)/sizeof(struct nativeref))
/* table for fast string comparison */
/* string comparsion table initialized */
static bool nativecompdone = false;
+#endif
-
-/******************************************************************************/
-/******************************************************************************/
-#include "natcalls.h"
-
-/* string call comparison table initialized */
-
-/******************************************************************************/
/******************************************************************************/
-/* init_system_exceptions *****************************************************
-
- load, link and compile exceptions used in the system
-
-*******************************************************************************/
-
-void init_system_exceptions()
-{
- /* 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);
-
- /* java/lang/Exception */
-
- 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);
-
- /* java/lang/Error */
-
- 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 compile_all_class_methods(classinfo *c)
-{
- s4 i;
-
- for (i = 0; i < c->methodscount; i++) {
- (void) jit_compile(&(c->methods[i]));
- }
-}
-
-
-static void throw_exception_exit_intern(bool doexit)
-{
- java_objectheader *xptr;
- classinfo *c;
- methodinfo *pss;
-
- if (*exceptionptr) {
- xptr = *exceptionptr;
-
- /* clear exception, because we are calling jit code again */
- *exceptionptr = NULL;
-
- c = xptr->vftbl->class;
-
- pss = class_resolveclassmethod(c,
- utf_new_char("printStackTrace"),
- utf_new_char("()V"),
- class_java_lang_Object,
- false);
-
- /* print the stacktrace */
- if (pss) {
- asm_calljavafunction(pss, xptr, NULL, NULL, NULL);
-
- /* this normally means, we are EXTREMLY out of memory, but may be
- any other exception */
- if (*exceptionptr) {
- utf_fprint_classname(stderr, c->name);
- fprintf(stderr, "\n");
- }
-
- } else {
- utf_fprint_classname(stderr, c->name);
- fprintf(stderr, ": printStackTrace()V not found!\n");
- }
-
- fflush(stderr);
-
- /* good bye! */
- 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;
- char *tmp;
- s4 len;
-
- len = strlen(exception);
- tmp = MNEW(char, len);
- strncpy(tmp, exception, len);
-
- /* convert to classname */
-
- for (i = len - 1; i >= 0; i--) {
- if (tmp[i] == '/') tmp[i] = '.';
- }
-
- fprintf(stderr, "Exception in thread \"main\" %s", tmp);
-
- MFREE(tmp, char, len);
-
- if (strlen(message) > 0)
- fprintf(stderr, ": %s", message);
-
- fprintf(stderr, "\n");
- fflush(stderr);
-
- /* good bye! */
- exit(1);
-}
-
-
-#define CREATENEW_EXCEPTION(ex) \
- java_objectheader *newEx; \
- java_objectheader *oldexception=*exceptionptr;\
- *exceptionptr=0;\
- newEx=ex;\
- *exceptionptr=oldexception;\
- return newEx;
-
-java_objectheader *new_exception(char *classname)
-{
- classinfo *c = class_new(utf_new_char(classname));
-
- CREATENEW_EXCEPTION(native_new_and_init(c));
-}
-
-java_objectheader *new_exception_message(char *classname, char *message)
-{
- classinfo *c = class_new(utf_new_char(classname));
-
- CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new_char(message)));
-}
-
-
-java_objectheader *new_exception_throwable(char *classname, java_lang_Throwable *throwable)
-{
- classinfo *c = class_new(utf_new_char(classname));
-
- CREATENEW_EXCEPTION(native_new_and_init_throwable(c, throwable));
-}
-
-
-java_objectheader *new_exception_utfmessage(char *classname, utf *message)
-{
- classinfo *c = class_new(utf_new_char(classname));
-
- CREATENEW_EXCEPTION(native_new_and_init_string(c, javastring_new(message)));
-}
-
-
-java_objectheader *new_exception_javastring(char *classname, java_lang_String *message)
-{
- classinfo *c = class_new(utf_new_char(classname));
-
- CREATENEW_EXCEPTION(native_new_and_init_string(c, message));
-}
-
-
-java_objectheader *new_exception_int(char *classname, s4 i)
-{
- classinfo *c = class_new(utf_new_char(classname));
-
- CREATENEW_EXCEPTION(native_new_and_init_int(c, i));
-}
+/**include "natcalls.h" **/
/*********************** function: native_loadclasses **************************
}
-/********************* function: native_setclasspath **************************/
-
-void native_setclasspath(char *path)
-{
- /* set searchpath for classfiles */
- classpath = path;
-}
-
-
/*********************** Function: native_findfunction *************************
Looks up a method (must have the same class name, method name, descriptor
functionptr native_findfunction(utf *cname, utf *mname,
utf *desc, bool isstatic)
{
+#ifdef STATIC_CLASSPATH
int i;
/* entry of table for fast string comparison */
struct nativecompref *n;
/* keep compiler happy */
return NULL;
+#else
+/* dynamic classpath */
+ return 0;
+#endif
}
java_lang_String *javastring_new(utf *u)
{
- char *utf_ptr = u->text; /* current utf character in utf string */
- int utflength = utf_strlen(u); /* length of utf-string if uncompressed */
+ char *utf_ptr; /* current utf character in utf string */
+ u4 utflength; /* length of utf-string if uncompressed */
java_lang_String *s; /* result-string */
java_chararray *a;
s4 i;
-
+
+ if (!u) {
+ *exceptionptr = new_nullpointerexception();
+ return NULL;
+ }
+
+ utf_ptr = u->text;
+ utflength = utf_strlen(u);
+
s = (java_lang_String *) builtin_new(class_java_lang_String);
a = builtin_newarray_char(utflength);
java_lang_String *javastring_new_char(char *text)
{
s4 i;
- s4 len = strlen(text); /* length of the string */
+ s4 len; /* length of the string */
java_lang_String *s; /* result-string */
java_chararray *a;
-
+
+ if (!text) {
+ *exceptionptr = new_nullpointerexception();
+ return NULL;
+ }
+
+ len = strlen(text);
+
s = (java_lang_String *) builtin_new(class_java_lang_String);
a = builtin_newarray_char(len);
utf_new_char("()V"));
if (!m) { /* initializer not found */
- if (verbose) {
+ if (opt_verbose) {
char logtext[MAXLOGTEXT];
sprintf(logtext, "Warning: class has no instance-initializer: ");
utf_sprint_classname(logtext + strlen(logtext), c->name);
utf_new_char("(Ljava/lang/String;)V"));
if (!m) { /* initializer not found */
- if (verbose) {
+ if (opt_verbose) {
char logtext[MAXLOGTEXT];
sprintf(logtext, "Warning: class has no instance-initializer: ");
utf_sprint_classname(logtext + strlen(logtext), c->name);
utf_new_char("(I)V"));
if (!m) { /* initializer not found */
- if (verbose) {
+ if (opt_verbose) {
char logtext[MAXLOGTEXT];
sprintf(logtext, "Warning: class has no instance-initializer: ");
utf_sprint_classname(logtext + strlen(logtext), c->name);
utf_new_char("(Ljava/lang/Throwable;)V"));
if (!m) { /* initializer not found */
- if (verbose) {
+ if (opt_verbose) {
char logtext[MAXLOGTEXT];
sprintf(logtext, "Warning: class has no instance-initializer: ");
utf_sprint_classname(logtext + strlen(logtext), c->name);
literalstring *s; /* hashtable element */
java_lang_String *js; /* u2-array wrapped in javastring */
java_chararray *stringdata; /* copy of u2-array */
- classinfo *c;
u4 key;
u4 slot;
u2 i;
-//#define DEBUG_LITERALSTRING_U2
+/* #define DEBUG_LITERALSTRING_U2 */
#ifdef DEBUG_LITERALSTRING_U2
printf("literalstring_u2: length=%d, offset=%d\n", length, offset);
fflush(stdout);
/* string already in hashtable, free memory */
if (!copymode)
- lit_mem_free(a, sizeof(java_chararray) + sizeof(u2) * (length - 1) + 10);
+ mem_free(a, sizeof(java_chararray) + sizeof(u2) * (length - 1) + 10);
#ifdef DEBUG_LITERALSTRING_U2
printf("literalstring_u2: foundentry at %p\n", js);
if (copymode) {
/* create copy of u2-array for new javastring */
u4 arraysize = sizeof(java_chararray) + sizeof(u2) * (length - 1) + 10;
- stringdata = lit_mem_alloc(arraysize);
+ stringdata = mem_alloc(arraysize);
/* memcpy(stringdata, a, arraysize); */
memcpy(&(stringdata->header), &(a->header), sizeof(java_arrayheader));
memcpy(&(stringdata->data), &(a->data) + offset, sizeof(u2) * (length - 1) + 10);
list_addfirst(&unlinkedclasses, class_java_lang_String);
}
- /* create new javastring */
- js = LNEW(java_lang_String);
+ /* create new javastring */
+ js = NEW(java_lang_String);
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+ initObjectLock(&js->header);
+#endif
js->header.vftbl = class_java_lang_String->vftbl;
- js->value = stringdata;
- js->offset = 0;
- js->count = length;
+ js->value = stringdata;
+ js->offset = 0;
+ js->count = length;
#ifdef DEBUG_LITERALSTRING_U2
printf("literalstring_u2: newly created at %p\n", js);
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;
+ /* create new literalstring */
+ s = NEW(literalstring);
+ s->hashlink = string_hash.ptr[slot];
+ s->string = (java_objectheader *) js;
+ string_hash.ptr[slot] = s;
- /* update number of hashtable entries */
- string_hash.entries++;
+ /* update number of hashtable entries */
+ string_hash.entries++;
- /* reorganization of hashtable */
- if (string_hash.entries > (string_hash.size * 2)) {
+ /* reorganization of hashtable */
+ if (string_hash.entries > (string_hash.size * 2)) {
/* reorganization of hashtable, average length of
- the external chains is approx. 2 */
+ the external chains is approx. 2 */
u4 i;
literalstring *s;
/* dispose old table */
MFREE(string_hash.ptr, void*, string_hash.size);
string_hash = newhash;
- }
+ }
- return (java_objectheader *) js;
+ return (java_objectheader *) js;
}
u4 i;
/* allocate memory */
- a = lit_mem_alloc(sizeof(java_chararray) + sizeof(u2) * (utflength - 1) + 10);
+ a = mem_alloc(sizeof(java_chararray) + sizeof(u2) * (utflength - 1) + 10);
/* convert utf-string to u2-array */
for (i = 0; i < utflength; i++)
java_chararray *a = s->value;
/* dispose memory of java.lang.String object */
- LFREE(s, java_lang_String);
+ FREE(s, java_lang_String);
/* dispose memory of java-characterarray */
- LFREE(a, sizeof(java_chararray) + sizeof(u2) * (a->header.size - 1)); /* +10 ?? */
+ FREE(a, sizeof(java_chararray) + sizeof(u2) * (a->header.size - 1)); /* +10 ?? */
}
-void copy_vftbl(vftbl **dest, vftbl *src)
+void copy_vftbl(vftbl_t **dest, vftbl_t *src)
{
*dest = src;
#if 0
if (retType) buffer_size += strlen(retType);
/* allocate buffer */
- buffer = MNEW(u1, buffer_size);
+ buffer = MNEW(char, buffer_size);
pos = buffer;
/* method-desciptor starts with parenthesis */
/* create utf-string */
result = utf_new(buffer, (pos - buffer));
- MFREE(buffer, u1, buffer_size);
+ MFREE(buffer, char, buffer_size);
return result;
}
*******************************************************************************/
-java_objectarray* get_exceptiontypes(methodinfo *m) {
- u2 exccount=m->thrownexceptionscount;
+java_objectarray* get_exceptiontypes(methodinfo *m)
+{
+ u2 excount;
u2 i;
java_objectarray *result;
+
+ excount = m->thrownexceptionscount;
+
/* create class-array */
- result = builtin_anewarray(exccount, class_java_lang_Class);
- for (i=0;i<exccount;i++) {
- java_objectheader *oh=(java_objectheader*)(m->thrownexceptions[i]);
- use_class_as_object(oh);
- result->data[i]=oh;
+ result = builtin_anewarray(excount, class_java_lang_Class);
+
+ for (i = 0; i < excount; i++) {
+ java_objectheader *o = (java_objectheader *) (m->thrownexceptions[i]);
+ use_class_as_object((classinfo *) o);
+ result->data[i] = o;
}
+
return result;
}
/*--------------------------------------------------------*/
-java_objectarray *builtin_asm_createclasscontextarray(classinfo **end,classinfo **start)
+java_objectarray *builtin_asm_createclasscontextarray(classinfo **end, classinfo **start)
{
#if defined(__GNUC__)
#warning platform dependend
#endif
- java_objectarray *tmpArray;
- int i;
- classinfo **current;
+ java_objectarray *tmpArray;
+ int i;
+ classinfo **current;
classinfo *c;
- size_t size=(((size_t)start)-((size_t)end)) / sizeof (classinfo*);
- /*printf("end %p, start %p, size %ld\n",end,start,size);*/
- if (!class_java_lang_Class)
- class_java_lang_Class = class_new(utf_new_char ("java/lang/Class"));
- if (!class_java_lang_SecurityManager)
- class_java_lang_SecurityManager = class_new(utf_new_char ("java/lang/SecurityManager"));
- if (size>0) {
- if (start==class_java_lang_SecurityManager) {
+ size_t size;
+
+ size = (((size_t) start) - ((size_t) end)) / sizeof(classinfo*);
+
+ /*printf("end %p, start %p, size %ld\n",end,start,size);*/
+ if (!class_java_lang_Class)
+ class_java_lang_Class = class_new(utf_new_char("java/lang/Class"));
+
+ if (!class_java_lang_SecurityManager)
+ class_java_lang_SecurityManager =
+ class_new(utf_new_char("java/lang/SecurityManager"));
+
+ if (size > 0) {
+ if (start == class_java_lang_SecurityManager) {
size--;
start--;
}
}
- tmpArray=builtin_newarray(size, class_array_of(class_java_lang_Class)->vftbl);
- for(i=0,current=start;i<size;i++,current--) {
- c=*current;
-/* printf("%d\n",i);
+ tmpArray =
+ builtin_newarray(size, class_array_of(class_java_lang_Class)->vftbl);
+
+ for(i = 0, current = start; i < size; i++, current--) {
+ c = *current;
+ /* printf("%d\n",i);
utf_display(c->name);*/
use_class_as_object(c);
- tmpArray->data[i]=c;
- }
- return tmpArray;
+ tmpArray->data[i] = (java_objectheader *) c;
+ }
+ return tmpArray;
}
-java_lang_ClassLoader *builtin_asm_getclassloader(classinfo **end,classinfo **start)
+
+java_lang_ClassLoader *builtin_asm_getclassloader(classinfo **end, classinfo **start)
{
#if defined(__GNUC__)
#warning platform dependend
#endif
- int i;
- classinfo **current;
+ int i;
+ classinfo **current;
classinfo *c;
classinfo *privilegedAction;
- size_t size=(((size_t)start)-((size_t)end)) / sizeof (classinfo*);
-/* log_text("builtin_asm_getclassloader");
+ size_t size;
+
+ size = (((size_t) start) - ((size_t) end)) / sizeof(classinfo*);
+
+ /* log_text("builtin_asm_getclassloader");
printf("end %p, start %p, size %ld\n",end,start,size);*/
- if (!class_java_lang_SecurityManager)
- class_java_lang_SecurityManager = class_new(utf_new_char ("java/lang/SecurityManager"));
- if (size>0) {
- if (start==class_java_lang_SecurityManager) {
+ if (!class_java_lang_SecurityManager)
+ class_java_lang_SecurityManager =
+ class_new(utf_new_char("java/lang/SecurityManager"));
+
+ if (size > 0) {
+ if (start == class_java_lang_SecurityManager) {
size--;
start--;
}
privilegedAction=class_new(utf_new_char("java/security/PrivilegedAction"));
- for(i=0,current=start;i<size;i++,current--) {
- c=*current;
- if (c==privilegedAction) return NULL;
- if (c->classloader) return c->classloader;
- }
- return NULL;
+ for(i = 0, current = start; i < size; i++, current--) {
+ c = *current;
+ if (c == privilegedAction)
+ return NULL;
+ if (c->classloader)
+ return (java_lang_ClassLoader *) c->classloader;
+ }
+ return NULL;
-/*
+ /*
log_text("Java_java_lang_VMSecurityManager_currentClassLoader");
init_systemclassloader();
return SystemClassLoader;*/
}
+
/*
* These are local overrides for various environment variables in Emacs.
* Please do not remove this and leave it at the end of the file, where