X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Floader.h;h=6909bdae4656d4c424acfa7260d0077197655099;hb=d75b6037acf17c342166b9c9bd6e657dfdd12cd9;hp=ceaeaae87151f7524056551df323a720025f9442;hpb=41f6c25ddbab3fe7da1069e1f76ea6d224afce46;p=cacao.git diff --git a/src/vm/loader.h b/src/vm/loader.h index ceaeaae87..6909bdae4 100644 --- a/src/vm/loader.h +++ b/src/vm/loader.h @@ -1,9 +1,9 @@ -/* loader.h - class loader header +/* 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,7 +26,7 @@ Authors: Reinhard Grafl - $Id: loader.h 723 2003-12-08 19:51:32Z edwin $ + $Id: loader.h 1735 2004-12-07 14:33:27Z twisti $ */ @@ -35,41 +35,80 @@ #include +#if defined(USE_ZLIB) +# include "vm/unzip.h" +#endif + -/************************* program switches ***********************************/ +/* datastruture from a classfile */ -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 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 */ +} classbuffer; -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 */ +/* export variables */ #ifdef USE_THREADS extern int blockInts; #endif +/* references to some system classes ******************************************/ + +extern classinfo *class_java_lang_Object; +extern classinfo *class_java_lang_String; +extern classinfo *class_java_lang_Cloneable; +extern classinfo *class_java_io_Serializable; +extern utf *utf_fillInStackTrace_name; +extern utf *utf_fillInStackTrace_desc; + +/* pseudo classes for the type checker ****************************************/ + +/* + * pseudo_class_Arraystub + * (extends Object implements Cloneable, java.io.Serializable) + * + * If two arrays of incompatible component types are merged, + * the resulting reference has no accessible components. + * The result does, however, implement the interfaces Cloneable + * and java.io.Serializable. This pseudo class is used internally + * to represent such results. (They are *not* considered arrays!) + * + * pseudo_class_Null + * + * This pseudo class is used internally to represent the + * null type. + * + * pseudo_class_New + * + * This pseudo class is used internally to represent the + * the 'uninitialized object' type. + */ + +extern classinfo *pseudo_class_Arraystub; +extern classinfo *pseudo_class_Null; +extern classinfo *pseudo_class_New; +extern vftbl_t *pseudo_class_Arraystub_vftbl; + +extern utf *array_packagename; + + /************************ prototypes ******************************************/ /* initialize laoder, load important systemclasses */ void loader_init(); void suck_init(char *cpath); +void create_all_classes(); +void suck_stop(classbuffer *cb); /* free resources */ void loader_close(); -/* load a class and all referenced classes */ -classinfo *loader_load(utf *topname); - -/* initializes all loaded classes */ -void loader_initclasses(); - void loader_compute_subclasses(); /* retrieve constantpool element */ @@ -82,10 +121,15 @@ s4 class_findmethodIndex(classinfo *c, utf *name, utf *desc); /* 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_findmethod_w(classinfo *c, utf *name, utf *desc, char*); 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); @@ -94,7 +138,7 @@ 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); +classinfo *class_init(classinfo *c); void class_showconstanti(classinfo *c, int ii); @@ -103,11 +147,6 @@ void class_showmethods(classinfo *c); void class_showconstantpool(classinfo *c); void print_arraydescriptor(FILE *file, arraydescriptor *desc); -classinfo *loader_load(utf *topname); - -/* set buffer for reading classdata */ -void classload_buffer(u1 *buf, int len); - /* return the primitive class inidicated by the given signature character */ classinfo *class_primitive_from_sig(char sig); @@ -132,15 +171,50 @@ int type_from_descriptor(classinfo **cls,char *utf_ptr,char *end_ptr,char **next /* (used by class_new, don't use directly) */ void class_new_array(classinfo *c); -void class_link(classinfo *c); +#define LAZYLOADING(class) { \ + if (!class->loaded) \ + if (!class_load(class)) \ + return 0; \ + if (!class->linked) \ + if (!class_link(class)) \ + return 0; } + + +classinfo *class_load(classinfo *c); +classinfo *class_load_intern(classbuffer *cb); +classinfo *class_link(classinfo *c); +void class_free(classinfo *c); void field_display(fieldinfo *f); void method_display(methodinfo *m); +void method_display_w_class(methodinfo *m); utf* clinit_desc(); utf* clinit_name(); + +/******************************** CLASSPATH handling *******************/ +#define CLASSPATH_MAXFILENAME 1000 /* maximum length of a filename */ +#define CLASSPATH_PATH 0 +#define CLASSPATH_ARCHIVE 1 + +typedef union classpath_info { + struct { + s4 type; + union classpath_info *next; + char *path; + s4 pathlen; + } filepath; +#if defined(USE_ZLIB) + struct { + s4 type; + union classpath_info *next; + unzFile uf; + } archive; +#endif +} classpath_info; + #endif /* _LOADER_H */