X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Floader.h;h=52dd1f53f847dee4b634c5cb78d7fee81d66866e;hb=6b2286d27fed193b85137848654d58fbdf8c7b65;hp=06213ca23560b8f56f15d0a5311823849f89f5a2;hpb=27f5ade9474972c059a0215fc8ffdd96a9e8103f;p=cacao.git diff --git a/src/vm/loader.h b/src/vm/loader.h index 06213ca23..52dd1f53f 100644 --- a/src/vm/loader.h +++ b/src/vm/loader.h @@ -1,9 +1,9 @@ -/* loader.c - class loader header +/* src/vm/loader.h - class loader header - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 - R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, - M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, - P. Tomsich, J. Wenninger + 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 This file is part of CACAO. @@ -26,45 +26,163 @@ Authors: Reinhard Grafl - $Id: loader.h 593 2003-11-09 19:50:55Z twisti $ - + $Id: loader.h 2154 2005-03-30 20:03:06Z twisti $ */ #ifndef _LOADER_H #define _LOADER_H -/************************* program switches ***********************************/ +#include + + +/* forward typedefs ***********************************************************/ + +typedef struct classbuffer classbuffer; +typedef struct classpath_info classpath_info; + + +#include "config.h" +#include "types.h" +#include "vm/class.h" +#include "vm/descriptor.h" +#include "vm/global.h" +#include "vm/method.h" +#include "vm/utf8.h" + +#if defined(USE_ZLIB) +# include "vm/unzip.h" +#endif + + +/* signed suck defines ********************************************************/ + +#define suck_s8(a) (s8) suck_u8((a)) +#define suck_s2(a) (s2) suck_u2((a)) +#define suck_s4(a) (s4) suck_u4((a)) +#define suck_s1(a) (s1) suck_u1((a)) + + +/* constant pool entries ******************************************************* + + All constant pool entries need a data structure which contain the entrys + value. In some cases this structure exist already, in the remaining cases + this structure must be generated: + + kind structure generated? + ---------------------------------------------------------------------- + CONSTANT_Class classinfo no XXX this will change + CONSTANT_Fieldref constant_FMIref yes + CONSTANT_Methodref constant_FMIref yes + CONSTANT_InterfaceMethodref constant_FMIref yes + CONSTANT_String unicode no + CONSTANT_Integer constant_integer yes + CONSTANT_Float constant_float yes + CONSTANT_Long constant_long yes + CONSTANT_Double constant_double yes + CONSTANT_NameAndType constant_nameandtype yes + CONSTANT_Utf8 unicode no + CONSTANT_UNUSED - + +*******************************************************************************/ + +typedef struct { /* Fieldref, Methodref and InterfaceMethodref */ + classinfo *class; /* class containing this field/method/intfmeth. */ /* XXX remove */ + constant_classref *classref; /* class containing this field/meth./intfm. */ + utf *name; /* field/method/interfacemethod name */ + utf *descriptor; /* field/method/intfmeth. type descriptor string */ + parseddesc parseddesc; /* parsed descriptor */ +} constant_FMIref; + + +typedef struct { /* Integer */ + s4 value; +} constant_integer; + + +typedef struct { /* Float */ + float value; +} constant_float; + + +typedef struct { /* Long */ + s8 value; +} constant_long; + + +typedef struct { /* Double */ + double value; +} constant_double; + -extern bool loadverbose; /* Print debug messages during loading */ -extern bool linkverbose; -extern bool initverbose; /* Log class initialization */ -extern bool makeinitializations; /* Initialize classes automatically */ +typedef struct { /* NameAndType (Field or Method) */ + utf *name; /* field/method name */ + utf *descriptor; /* field/method type descriptor string */ +} constant_nameandtype; -extern bool getloadingtime; -extern long int loadingtime; /* CPU time for class loading */ -extern list unlinkedclasses; /* List containing all unlinked classes */ -extern list linkedclasses; /* List containing all linked classes */ +/* classbuffer ****************************************************************/ +struct classbuffer { + classinfo *class; /* pointer to classinfo structure */ + u1 *data; /* pointer to byte code */ + s4 size; /* size of the byte code */ + u1 *pos; /* current read position */ +}; -/************************ prototypes ******************************************/ -/* initialize laoder, load important systemclasses */ -void loader_init(); +/* classpath_info *************************************************************/ + +#define CLASSPATH_PATH 0 +#define CLASSPATH_ARCHIVE 1 + +struct classpath_info { +#if defined(USE_THREADS) + /* Required for monitor locking on zip/jar files. */ + java_objectheader header; +#endif + s4 type; + char *path; + s4 pathlen; +#if defined(USE_ZLIB) + unzFile uf; +#endif + classpath_info *next; +}; + + +/* export variables ***********************************************************/ + +#if defined(USE_THREADS) +extern int blockInts; +#endif + +extern classpath_info *classpath_entries; + + +/* function prototypes ********************************************************/ + +/* initialize loader, load important systemclasses */ +bool loader_init(u1 *stackbottom); void suck_init(char *cpath); +void create_all_classes(void); +void suck_stop(classbuffer *cb); -/* free resources */ -void loader_close(); +inline bool check_classbuffer_size(classbuffer *cb, s4 len); + +inline u1 suck_u1(classbuffer *cb); +inline u2 suck_u2(classbuffer *cb); +inline u4 suck_u4(classbuffer *cb); -/* load a class and all referenced classes */ -classinfo *loader_load(utf *topname); +/* free resources */ +void loader_close(void); -/* initializes all loaded classes */ -void loader_initclasses(); +/* class loading functions */ +classinfo *load_class_from_classloader(classinfo *c, java_objectheader *cl); +classinfo *load_class_bootstrap(classinfo *c); +classinfo *load_class_from_classbuffer(classbuffer *cb); -void loader_compute_subclasses(); /* retrieve constantpool element */ voidptr class_getconstant(classinfo *class, u4 pos, u4 ctype); @@ -74,10 +192,14 @@ u4 class_constanttype(classinfo *class, u4 pos); /* search class for a field */ fieldinfo *class_findfield(classinfo *c, utf *name, utf *desc); +fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc, classinfo *referer, bool except); /* search for a method with a specified name and descriptor */ methodinfo *class_findmethod(classinfo *c, utf *name, utf *desc); +methodinfo *class_fetchmethod(classinfo *c, utf *name, utf *desc); methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *dest); +methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *dest, classinfo *referer, bool except); +methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *dest, classinfo *referer, bool except); /* search for a method with specified name and arguments (returntype ignored) */ methodinfo *class_findmethod_approx(classinfo *c, utf *name, utf *desc); @@ -86,30 +208,36 @@ methodinfo *class_resolvemethod_approx(classinfo *c, utf *name, utf *dest); bool class_issubclass(classinfo *sub, classinfo *super); /* call initializer of class */ -void class_init(classinfo *c); - -void class_showconstanti(classinfo *c, int ii); +classinfo *class_init(classinfo *c); /* debug purposes */ -void class_showconstantpool(classinfo *c); void class_showmethods(classinfo *c); - -classinfo *loader_load(utf *topname); - -/* set buffer for reading classdata */ -void classload_buffer(u1 *buf,int len); - -/* create class representing specific arraytype */ -classinfo *create_array_class(utf *u); - -/* create the arraydescriptor for the arraytype specified by the utf-string */ -constant_arraydescriptor * buildarraydescriptor(char *utf, u4 namelen); - -void class_link(classinfo *c); - -void field_display(fieldinfo *f); - -void method_display(methodinfo *m); +void class_showconstantpool(classinfo *c); +void print_arraydescriptor(FILE *file, arraydescriptor *desc); + +/* return the primitive class inidicated by the given signature character */ +classinfo *class_primitive_from_sig(char sig); + + +/* return the class indicated by the given descriptor */ +/* (see loader.c for documentation) */ +#define CLASSLOAD_NEW 0 /* default */ +#define CLASSLOAD_LOAD 0x0001 +#define CLASSLOAD_SKIP 0x0002 +#define CLASSLOAD_PANIC 0 /* default */ +#define CLASSLOAD_NOPANIC 0x0010 +#define CLASSLOAD_PRIMITIVE 0 /* default */ +#define CLASSLOAD_NULLPRIMITIVE 0x0020 +#define CLASSLOAD_VOID 0 /* default */ +#define CLASSLOAD_NOVOID 0x0040 +#define CLASSLOAD_NOCHECKEND 0 /* default */ +#define CLASSLOAD_CHECKEND 0x1000 + +classinfo *class_from_descriptor(char *utf_ptr,char *end_ptr,char **next,int mode); +int type_from_descriptor(classinfo **cls,char *utf_ptr,char *end_ptr,char **next,int mode); + +/* (used by class_new, don't use directly) */ +void class_new_array(classinfo *c); #endif /* _LOADER_H */