X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fnative%2Fnative.h;h=ee0403283c7a7a7e42e985590d6241005f7ee3bf;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=6e92889d08d70ddaf3c4f6ddf8ee45a7370717fd;hpb=d75b6037acf17c342166b9c9bd6e657dfdd12cd9;p=cacao.git diff --git a/src/native/native.h b/src/native/native.h index 6e92889d0..ee0403283 100644 --- a/src/native/native.h +++ b/src/native/native.h @@ -1,9 +1,9 @@ -/* native/native.h - table of native functions +/* src/native/native.h - table of native functions - Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates, - R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner, - C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger, - Institut f. Computersprachen - TU Wien + Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel, + C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring, + E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, + J. Wenninger, Institut f. Computersprachen - TU Wien This file is part of CACAO. @@ -19,14 +19,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. - - Contact: cacao@complang.tuwien.ac.at - - Authors: Reinhard Grafl - - $Id: native.h 1735 2004-12-07 14:33:27Z twisti $ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ @@ -34,210 +28,121 @@ #ifndef _NATIVE_H #define _NATIVE_H +#include "config.h" -#include "native/jni.h" -#include "native/include/java_lang_String.h" -#include "native/include/java_lang_ClassLoader.h" -#include "native/include/java_lang_Throwable.h" - - -/* table for locating native methods */ - -typedef struct nativeref nativeref; -typedef struct nativecompref nativecompref; - -struct nativeref { - char *classname; - char *methodname; - char *descriptor; - bool isstatic; - functionptr func; -}; - -/* table for fast string comparison */ - -struct nativecompref { - utf *classname; - utf *methodname; - utf *descriptor; - bool isstatic; - functionptr func; -}; - - -extern classinfo *class_java_lang_Class; -extern classinfo *class_java_lang_VMClass; -extern classinfo *class_java_lang_System; -extern classinfo *class_java_lang_ClassLoader; -extern classinfo *class_java_lang_Double; -extern classinfo *class_java_lang_Float; -extern classinfo *class_java_lang_Long; -extern classinfo *class_java_lang_Byte; -extern classinfo *class_java_lang_Short; -extern classinfo *class_java_lang_Boolean; -extern classinfo *class_java_lang_Void; -extern classinfo *class_java_lang_Character; -extern classinfo *class_java_lang_Integer; - - -/* the system classloader object */ -extern java_lang_ClassLoader *SystemClassLoader; - -/* for raising exceptions from native methods */ -/* extern java_objectheader* exceptionptr; */ - -/* javastring-hashtable */ -extern hashtable string_hash; +#if defined(ENABLE_LTDL) && defined(HAVE_LTDL_H) +# include +#endif -void use_class_as_object(classinfo *c); +#include -/* load classes required for native methods */ -void native_loadclasses(); - -/* find native function */ -functionptr native_findfunction(utf *cname, utf *mname, - utf *desc, bool isstatic); - -/* creates a new object of type java/lang/String from a utf-text */ -/* java_objectheader *javastring_new(utf *text); */ -java_lang_String *javastring_new(utf *text); - -/* creates a new object of type java/lang/String from a c-string */ -/* java_objectheader *javastring_new_char(char *text); */ -java_lang_String *javastring_new_char(char *text); - -/* make c-string from a javastring (debugging) */ -char *javastring_tochar(java_objectheader *s); - -/* create new object on the heap and call the initializer */ -java_objectheader *native_new_and_init(classinfo *c); - -/* create new object on the heap and call the initializer - mainly used for exceptions with a message */ -java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s); - -/* create new object on the heap and call the initializer - mainly used for exceptions with an index */ -java_objectheader *native_new_and_init_int(classinfo *c, s4 i); +#include "native/jni.h" -/* create new object on the heap and call the initializer - mainly used for exceptions with cause */ -java_objectheader *native_new_and_init_throwable(classinfo *c, java_lang_Throwable *t); +#include "vm/global.h" -/* add property to temporary property list -- located in nat/VMRuntime.c */ -void create_property(char *key, char *value); +#include "vmcore/class.h" +#include "vmcore/method.h" +#include "vmcore/utf8.h" -/* correct vftbl-entries of javastring-hash */ -void stringtable_update(); +/* defines ********************************************************************/ -/* make utf symbol from javastring */ -utf *javastring_toutf(java_lang_String *string, bool isclassname); +#define NATIVE_METHODS_COUNT sizeof(methods) / sizeof(JNINativeMethod) -/* make utf symbol from u2 array */ -utf *utf_new_u2(u2 *unicodedata, u4 unicodelength, bool isclassname); -/* determine utf length in bytes of a u2 array */ -u4 u2_utflength(u2 *text, u4 u2_length); +/* table for locating native methods */ -/* create systemclassloader object and initialize its instance fields */ -void init_systemclassloader(); +#if defined(WITH_STATIC_CLASSPATH) +typedef struct nativeref nativeref; +typedef struct nativecompref nativecompref; +#endif -/* search 'classinfo'-structure for a field with the specified name */ -fieldinfo *class_findfield_approx(classinfo *c, utf *name); -s4 class_findfield_index_approx(classinfo *c, utf *name); -/* creates a new javastring with the text of the utf-symbol */ -java_objectheader *literalstring_new(utf *u); +/* native_methods_node_t ******************************************************/ -/* creates a new javastring with the text of the u2-array */ -java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset, - bool copymode); +typedef struct native_methods_node_t native_methods_node_t; -/* dispose a javastring */ -void literalstring_free(java_objectheader*); +struct native_methods_node_t { + utf *classname; /* class name */ + utf *name; /* method name */ + utf *descriptor; /* descriptor name */ + functionptr function; /* pointer to the implementation */ +}; -void copy_vftbl(vftbl_t **dest, vftbl_t *src); -utf *create_methodsig(java_objectarray* types, char *retType); -classinfo *get_type(char **utf_ptr,char *desc_end, bool skip); -java_objectarray* get_parametertypes(methodinfo *m); -java_objectarray* get_exceptiontypes(methodinfo *m); -classinfo *get_returntype(methodinfo *m); +/* hashtable_library_loader_entry *********************************************/ +#if defined(ENABLE_LTDL) +typedef struct hashtable_library_loader_entry hashtable_library_loader_entry; +typedef struct hashtable_library_name_entry hashtable_library_name_entry; +struct hashtable_library_loader_entry { + classloader *loader; /* class loader */ + hashtable_library_name_entry *namelink;/* libs loaded by this loader */ + hashtable_library_loader_entry *hashlink;/* link for external chaining */ +}; +#endif -java_objectarray *builtin_asm_createclasscontextarray(classinfo **end,classinfo **start); -java_lang_ClassLoader *builtin_asm_getclassloader(classinfo **end,classinfo **start); +/* hashtable_library_name_entry ***********************************************/ -/*----- For Static Analysis of Natives by parseRT -----*/ +#if defined(ENABLE_LTDL) +struct hashtable_library_name_entry { + utf *name; /* library name */ + lt_dlhandle handle; /* libtool library handle */ + hashtable_library_name_entry *hashlink; /* link for external chaining */ +}; +#endif -/*---------- global variables ---------------------------*/ -typedef struct classMeth classMeth; -typedef struct nativeCall nativeCall; -typedef struct methodCall methodCall; -typedef struct nativeMethod nativeMethod; -typedef struct nativeCompCall nativeCompCall; -typedef struct methodCompCall methodCompCall; -typedef struct nativeCompMethod nativeCompMethod; +struct nativeref { + char *classname; + char *methodname; + char *descriptor; + bool isstatic; + functionptr func; +}; -/*---------- Define Constants ---------------------------*/ -#define MAXCALLS 30 +/* table for fast string comparison */ -struct classMeth { - int i_class; - int j_method; - int methCnt; +struct nativecompref { + utf *classname; + utf *methodname; + utf *descriptor; + bool isstatic; + functionptr func; }; -struct methodCall{ - char *classname; - char *methodname; - char *descriptor; -}; -struct nativeMethod { - char *methodname; - char *descriptor; - struct methodCall methodCalls[MAXCALLS]; -}; +/* function prototypes ********************************************************/ +bool native_init(void); -struct nativeCall { - char *classname; - struct nativeMethod methods[MAXCALLS]; - int methCnt; - int callCnt[MAXCALLS]; -}; +void native_method_register(utf *classname, const JNINativeMethod *methods, + int32_t count); +#if defined(WITH_STATIC_CLASSPATH) -struct methodCompCall { - utf *classname; - utf *methodname; - utf *descriptor; -}; +functionptr native_findfunction(utf *cname, utf *mname, utf *desc, + bool isstatic); +#else /* defined(WITH_STATIC_CLASSPATH) */ -struct nativeCompMethod { - utf *methodname; - utf *descriptor; - struct methodCompCall methodCalls[MAXCALLS]; -}; +# if defined(ENABLE_LTDL) +lt_dlhandle native_library_open(utf *filename); +void native_library_add(utf *filename, classloader *loader, + lt_dlhandle handle); +hashtable_library_name_entry *native_library_find(utf *filename, + classloader *loader); +# endif +functionptr native_resolve_function(methodinfo *m); -struct nativeCompCall { - utf *classname; - struct nativeCompMethod methods[MAXCALLS]; - int methCnt; - int callCnt[MAXCALLS]; -}; +#endif /* defined(WITH_STATIC_CLASSPATH) */ +java_handle_t *native_new_and_init(classinfo *c); -bool natcall2utf(bool); -void printNativeCall(nativeCall); -void markNativeMethodsRT(utf *, utf* , utf* ); +java_handle_t *native_new_and_init_string(classinfo *c, java_handle_t *s); #endif /* _NATIVE_H */