X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fjava%2Fjcf.h;h=c92c34bd6c4574a36280d3a76ba2ab07d0cf74b1;hb=4fd216d574350d23961db14d4b25f74ed20905f8;hp=32f2759e742438b6152c641861cddd5b66114094;hpb=94594daf19d8bf756a7ad5179fd362d97f219027;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/java/jcf.h b/gcc/java/jcf.h index 32f2759e742..c92c34bd6c4 100644 --- a/gcc/java/jcf.h +++ b/gcc/java/jcf.h @@ -1,21 +1,23 @@ /* Utility macros to read Java(TM) .class files and byte codes. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. - Copyright (C) 1996, 97-98, 1999 Free Software Foundation, Inc. +This file is part of GCC. -This program is free software; you can redistribute it and/or modify +GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. -This program is distributed in the hope that it will be useful, +GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. +along with GCC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. @@ -23,28 +25,9 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ /* Written by Per Bothner , February 1996. */ -#ifndef JCF_H -#define JCF_H +#ifndef GCC_JCF_H +#define GCC_JCF_H #include "javaop.h" -#ifndef DEFUN -#if defined (__STDC__) -#define AND , -#define PTR void * -#define DEFUN(name, arglist, args) name(args) -#else -#define PTR char * -#define AND ; -#define DEFUN(name, arglist, args) name arglist args; -#endif -#endif /* !DEFUN */ - -#ifndef PROTO -#if defined (__STDC__) -#define PROTO(paramlist) paramlist -#else -#define PROTO(paramlist) () -#endif -#endif #ifndef JCF_u4 #define JCF_u4 unsigned long @@ -53,8 +36,8 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ #define JCF_u2 unsigned short #endif -#define ALLOC (void*)malloc -#define REALLOC (void*)realloc +#define ALLOC xmalloc +#define REALLOC xrealloc #ifndef FREE #define FREE(PTR) free(PTR) #endif @@ -63,14 +46,44 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */ #define JCF_word JCF_u4 #endif -#define JCF_ZIP 1 -#define JCF_CLASS 2 -#define JCF_SOURCE 3 +/* If we have both "scandir" and "alphasort", we can cache directory + listings to reduce the time taken to search the classpath. */ +#if defined(HAVE_SCANDIR) && defined(HAVE_ALPHASORT) +#define JCF_USE_SCANDIR 1 +#else +#define JCF_USE_SCANDIR 0 +#endif + +/* On case-insensitive file systems, we need to ensure that a request + to open a .java or .class file is honored only if the file to be + opened is of the exact case we are asking for. In other words, we + want to override the inherent case insensitivity of the underlying + file system. On other platforms, this macro becomes the vanilla + open() call. + + If you want to add another host, add your define to the list below + (i.e. defined(WIN32) || defined(YOUR_HOST)) and add a host-specific + .c file to Make-lang.in similar to win32-host.c. */ +#if defined(WIN32) +extern int +jcf_open_exact_case (const char* filename, int oflag); +#define JCF_OPEN_EXACT_CASE(X, Y) jcf_open_exact_case (X, Y) +#else +#define JCF_OPEN_EXACT_CASE open +#endif /* WIN32 */ struct JCF; -typedef int (*jcf_filbuf_t) PROTO ((struct JCF*, int needed)); +typedef int (*jcf_filbuf_t) (struct JCF*, int needed); -typedef struct CPool { +union cpool_entry GTY(()) { + jword GTY ((tag ("0"))) w; + tree GTY ((tag ("1"))) t; +}; + +#define cpool_entry_is_tree(tag) \ + (tag & CONSTANT_ResolvedFlag) || tag == CONSTANT_Utf8 + +typedef struct CPool GTY(()) { /* Available number of elements in the constants array, before it must be re-allocated. */ int capacity; @@ -78,33 +91,39 @@ typedef struct CPool { /* The constant_pool_count. */ int count; - uint8* tags; + uint8* GTY((length ("%h.count"))) tags; - jword* data; + union cpool_entry * GTY((length ("%h.count"), + desc ("cpool_entry_is_tree (%1.tags%a)"))) data; } CPool; +struct ZipDirectory; + /* JCF encapsulates the state of reading a Java Class File. */ -typedef struct JCF { - unsigned char *buffer; - unsigned char *buffer_end; - unsigned char *read_ptr; - unsigned char *read_end; - int seen_in_zip; - int java_source; - int outofsynch; /* Found a class file out of synch - with the matching source file. */ - long zip_offset; +typedef struct JCF GTY(()) { + unsigned char * GTY ((skip)) buffer; + unsigned char * GTY ((skip)) buffer_end; + unsigned char * GTY ((skip)) read_ptr; + unsigned char * GTY ((skip)) read_end; + unsigned int java_source : 1; + unsigned int right_zip : 1; + unsigned int finished : 1; jcf_filbuf_t filbuf; - void *read_state; - char *filename; - char *classname; - void *zipd; /* Directory entry where it was found */ - JCF_u2 access_flags, this_class, super_class; + PTR GTY ((skip)) read_state; + const char *filename; + const char *classname; + /* Directory entry where it was found. */ + struct ZipDirectory * GTY ((skip)) zipd; + JCF_u2 access_flags; + JCF_u2 this_class; + JCF_u2 super_class; CPool cpool; } JCF; /*typedef JCF* JCF_FILE;*/ +#define JCF_SEEN_IN_ZIP(JCF) ((JCF)->zipd != NULL) + /* The CPOOL macros take a (pointer to a) CPool. The JPOOL macros take a (pointer to a) JCF. Some of the latter should perhaps be deprecated or removed. */ @@ -113,13 +132,13 @@ typedef struct JCF { #define JPOOL_SIZE(JCF) CPOOL_COUNT(&(JCF)->cpool) #define JPOOL_TAG(JCF, INDEX) ((JCF)->cpool.tags[INDEX]) /* The INDEX'th constant pool entry as a JCF_u4. */ -#define CPOOL_UINT(CPOOL, INDEX) ((CPOOL)->data[INDEX]) +#define CPOOL_UINT(CPOOL, INDEX) ((CPOOL)->data[INDEX].w) #define JPOOL_UINT(JCF, INDEX) CPOOL_UINT(&(JCF)->cpool, INDEX) /*deprecated*/ /* The first uint16 of the INDEX'th constant pool entry. */ -#define CPOOL_USHORT1(CPOOL, INDEX) ((CPOOL)->data[INDEX] & 0xFFFF) +#define CPOOL_USHORT1(CPOOL, INDEX) ((CPOOL)->data[INDEX].w & 0xFFFF) #define JPOOL_USHORT1(JCF, INDEX) CPOOL_USHORT1(&(JCF)->cpool, INDEX) /* The second uint16 of the INDEX'th constant pool entry. */ -#define CPOOL_USHORT2(CPOOL, INDEX) ((CPOOL)->data[INDEX] >> 16) +#define CPOOL_USHORT2(CPOOL, INDEX) ((CPOOL)->data[INDEX].w >> 16) #define JPOOL_USHORT2(JCF, INDEX) CPOOL_USHORT2(&(JCF)->cpool, INDEX) #define JPOOL_LONG(JCF, INDEX) \ WORDS_TO_LONG (JPOOL_UINT(JCF, INDEX), JPOOL_UINT(JCF, (INDEX)+1)) @@ -133,21 +152,23 @@ typedef struct JCF { #define JPOOL_UTF_DATA(JCF, INDEX) \ ((JCF)->buffer+JPOOL_UINT(JCF, INDEX)+2) #endif -#define JPOOL_INT(JCF, INDEX) ((jint) JPOOL_UINT (JCF, INDEX)) +#define JPOOL_INT(JCF, INDEX) (WORD_TO_INT(JPOOL_UINT (JCF, INDEX))) #define JPOOL_FLOAT(JCF, INDEX) WORD_TO_FLOAT (JPOOL_UINT (JCF, INDEX)) #define CPOOL_INDEX_IN_RANGE(CPOOL, INDEX) \ ((INDEX) > 0 && (INDEX) < CPOOL_COUNT(CPOOL)) -#define CPOOL_FINISH(CPOOL) { \ - if ((CPOOL)->tags) FREE ((CPOOL)->tags); \ - if ((CPOOL)->data) FREE ((CPOOL)->data); } +#define CPOOL_FINISH(CPOOL) { \ + (CPOOL)->tags = 0; \ + (CPOOL)->data = 0; \ + } #define JCF_FINISH(JCF) { \ CPOOL_FINISH(&(JCF)->cpool); \ if ((JCF)->buffer) FREE ((JCF)->buffer); \ - if ((JCF)->filename) FREE ((JCF)->filename); \ - if ((JCF)->classname) FREE ((JCF)->classname); } + if ((JCF)->filename) FREE ((char *) (JCF)->filename); \ + if ((JCF)->classname) FREE ((char *) (JCF)->classname); \ + (JCF)->finished = 1; } #define CPOOL_INIT(CPOOL) \ ((CPOOL)->capacity = 0, (CPOOL)->count = 0, (CPOOL)->tags = 0, (CPOOL)->data = 0) @@ -157,7 +178,8 @@ typedef struct JCF { #define JCF_ZERO(JCF) \ ((JCF)->buffer = (JCF)->buffer_end = (JCF)->read_ptr = (JCF)->read_end = 0,\ (JCF)->read_state = 0, (JCF)->filename = (JCF)->classname = 0, \ - CPOOL_INIT(&(JCF)->cpool), (JCF)->java_source = 0) + CPOOL_INIT(&(JCF)->cpool), (JCF)->java_source = 0, (JCF)->zipd = 0, \ + (JCF)->finished = 0) /* Given that PTR points to a 2-byte unsigned integer in network (big-endian) byte-order, return that integer. */ @@ -207,6 +229,12 @@ typedef struct JCF { #define ACC_NATIVE 0x0100 #define ACC_INTERFACE 0x0200 #define ACC_ABSTRACT 0x0400 +#define ACC_STRICT 0x0800 +/* "Invisible" refers to Miranda methods inserted into an abstract + #class. It is also used in the runtime. */ +#define ACC_INVISIBLE 0x1000 + +#define ACC_VISIBILITY (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED) #define CONSTANT_Class 7 #define CONSTANT_Fieldref 9 @@ -223,16 +251,15 @@ typedef struct JCF { #define DEFAULT_CLASS_PATH "." -extern char *find_class PROTO ((const char *, int, JCF*, int)); -extern char *find_classfile PROTO ((char *, JCF*, char *)); -extern int jcf_filbuf_from_stdio PROTO ((JCF *jcf, int count)); -extern void jcf_out_of_synch PROTO((JCF *)); -extern int jcf_unexpected_eof PROTO ((JCF*, int)); +extern const char *find_class (const char *, int, JCF*, int); +extern const char *find_classfile (char *, JCF*, const char *); +extern int jcf_filbuf_from_stdio (JCF *jcf, int count); +extern int jcf_unexpected_eof (JCF*, int) ATTRIBUTE_NORETURN; /* Extract a character from a Java-style Utf8 string. * PTR points to the current character. * LIMIT points to the end of the Utf8 string. - * PTR is incremented to point after the character thta gets returns. + * PTR is incremented to point after the character that gets returned. * On an error, -1 is returned. */ #define UTF8_GET(PTR, LIMIT) \ ((PTR) >= (LIMIT) ? -1 \ @@ -241,10 +268,10 @@ extern int jcf_unexpected_eof PROTO ((JCF*, int)); ? (((PTR)[-2] & 0x1F) << 6) + ((PTR)[-1] & 0x3F) \ : (*(PTR) & 0xF0) == 0xE0 && ((PTR) += 3) <= (LIMIT) \ && ((PTR)[-2] & 0xC0) == 0x80 && ((PTR)[-1] & 0xC0) == 0x80 \ - ? (((PTR)[-3]&0x1F) << 12) + (((PTR)[-2]&0x3F) << 6) + ((PTR)[-1]&0x3F) \ + ? (((PTR)[-3]&0x0F) << 12) + (((PTR)[-2]&0x3F) << 6) + ((PTR)[-1]&0x3F) \ : ((PTR)++, -1)) -extern char *jcf_write_base_directory; +extern const char *jcf_write_base_directory; /* Debug macros, for the front end */ @@ -258,25 +285,27 @@ extern int quiet_flag; #endif /* Declarations for dependency code. */ -extern void jcf_dependency_reset PROTO ((void)); -extern void jcf_dependency_set_target PROTO ((char *)); -extern void jcf_dependency_add_target PROTO ((char *)); -extern void jcf_dependency_set_dep_file PROTO ((const char *)); -extern void jcf_dependency_add_file PROTO ((const char *, int)); -extern void jcf_dependency_write PROTO ((void)); -extern void jcf_dependency_init PROTO ((int)); +extern void jcf_dependency_reset (void); +extern void jcf_dependency_set_target (const char *); +extern void jcf_dependency_add_target (const char *); +extern void jcf_dependency_set_dep_file (const char *); +extern void jcf_dependency_add_file (const char *, int); +extern void jcf_dependency_write (void); +extern void jcf_dependency_init (int); +extern void jcf_dependency_print_dummies (void); /* Declarations for path handling code. */ -extern void jcf_path_init PROTO ((void)); -extern void jcf_path_classpath_arg PROTO ((char *)); -extern void jcf_path_CLASSPATH_arg PROTO ((char *)); -extern void jcf_path_include_arg PROTO ((char *)); -extern void jcf_path_seal PROTO ((void)); -extern void *jcf_path_start PROTO ((void)); -extern void *jcf_path_next PROTO ((void *)); -extern char *jcf_path_name PROTO ((void *)); -extern int jcf_path_is_zipfile PROTO ((void *)); -extern int jcf_path_is_system PROTO ((void *)); -extern int jcf_path_max_len PROTO ((void)); - -#endif +extern void jcf_path_init (void); +extern void jcf_path_classpath_arg (const char *); +extern void jcf_path_bootclasspath_arg (const char *); +extern void jcf_path_extdirs_arg (const char *); +extern void jcf_path_include_arg (const char *); +extern void jcf_path_seal (int); +extern void *jcf_path_start (void); +extern void *jcf_path_next (void *); +extern char *jcf_path_name (void *); +extern int jcf_path_is_zipfile (void *); +extern int jcf_path_is_system (void *); +extern int jcf_path_max_len (void); + +#endif /* ! GCC_JCF_H */