X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fcacaoh%2Fheaders.c;h=ab25e9b2a1b6de3740dc62164221169825aa10ac;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=aca364eada60d00b8ebf11c039f801f1ae8ae8e1;hpb=a908356b064eb0363df5df7efe7ef61e2fb66919;p=cacao.git diff --git a/src/cacaoh/headers.c b/src/cacaoh/headers.c index aca364ead..ab25e9b2a 100644 --- a/src/cacaoh/headers.c +++ b/src/cacaoh/headers.c @@ -1,9 +1,9 @@ /* src/cacaoh/headers.c - functions for header generation - 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,267 +19,195 @@ 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 - - Changes: Mark Probst - Philipp Tomsich - Christian Thalinger - - $Id: headers.c 2002 2005-03-05 17:10:18Z twisti $ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ +#include "config.h" + +#include +#include +#include +#include #include #include -#include - -#include "config.h" -#if defined(USE_THREADS) && defined(NATIVE_THREADS) +#if defined(ENABLE_THREADS) # if defined(__DARWIN__) # include # endif # include #endif -#include "mm/boehm.h" +#include "mm/gc-common.h" #include "mm/memory.h" -#include "native/include/java_lang_String.h" -#include "native/include/java_lang_Throwable.h" + #include "toolbox/chain.h" #include "toolbox/logging.h" -#include "vm/global.h" -#include "vm/tables.h" -#include "vm/loader.h" -#include "vm/options.h" -#include "vm/builtin.h" - - -/******* replace some external functions *********/ - -functionptr native_findfunction(utf *cname, utf *mname, utf *desc, bool isstatic) -{ return NULL; } - -java_objectheader *native_new_and_init(classinfo *c) { return NULL; } -java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s) { return NULL; } -java_objectheader *native_new_and_init_int(classinfo *c, s4 i) { return NULL; } -java_objectheader *native_new_and_init_throwable(classinfo *c, java_lang_Throwable *t) { return NULL; } - - -void synchronize_caches(void) {} -void asm_call_jit_compiler(void) {} -void asm_calljavafunction(void) {} -s4 asm_builtin_checkcast(java_objectheader *obj, classinfo *class) { return 0; } -s4 asm_builtin_idiv(s4 a, s4 b) { return 0; } -s4 asm_builtin_irem(s4 a, s4 b) { return 0; } -s8 asm_builtin_ldiv(s8 a, s8 b) { return 0; } -s8 asm_builtin_lrem(s8 a, s8 b) { return 0; } - -s4 asm_builtin_f2i(float a) { return 0; } -s8 asm_builtin_f2l(float a) { return 0; } -s4 asm_builtin_d2i(double a) { return 0; } -s8 asm_builtin_d2l(double a) { return 0; } - -void use_class_as_object(void) {} -void asm_builtin_monitorenter(java_objectheader *o) {} -void *asm_builtin_monitorexit(java_objectheader *o) { return NULL; } - -s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl_t *target) { - return 0; -} - -#if defined(__MIPS__) -long compare_and_swap(long *p, long oldval, long newval) -{ - if (*p == oldval) { - *p = newval; - return oldval; - } else - return *p; -} -#endif - - -#if defined(__I386__) -s4 asm_builtin_arrayinstanceof(java_objectheader *obj, classinfo *class) { - return 0; -} -void asm_builtin_newarray(s4 size, vftbl_t *arrayvftbl) {} -#endif - -void asm_builtin_aastore(java_objectarray *a, s4 index, java_objectheader *o) {} - -u1 *createcompilerstub(methodinfo *m) { return NULL; } -u1 *createnativestub(functionptr f, methodinfo *m) { return NULL; } -u1 *oldcreatenativestub(functionptr f, methodinfo *m) { return NULL; } - -void removecompilerstub(u1 *stub) {} -void removenativestub(u1 *stub) {} - -void asm_perform_threadswitch(u1 **from, u1 **to, u1 **stackTop) {} -u1* asm_initialize_thread_stack(void *func, u1 *stack) { return NULL; } -void asm_switchstackandcall(void) {} -void asm_handle_builtin_exception(classinfo *c) {} -void asm_getclassvalues_atomic(void) {} - -#if defined(__DARWIN__) -int cacao_catch_Handler(void) {} -#endif +#include "vm/builtin.h" +#include "vm/global.h" +#include "vm/stringlocal.h" -#if defined(USE_THREADS) && defined(NATIVE_THREADS) -threadcritnode asm_criticalsections; -void thread_restartcriticalsection(ucontext_t *uc) {} -#endif - - -void setVMClassField(classinfo *c) {} -void *Java_java_lang_VMObject_clone(void *env, void *clazz, void * this) -{ - return NULL; -} +#include "vmcore/class.h" +#include "vmcore/method.h" +#include "vmcore/loader.h" +#include "vmcore/options.h" /************************ global variables **********************/ -chain *nativemethod_chain; /* chain with native methods */ -chain *nativeclass_chain; /* chain with processed classes */ -static chain *ident_chain; /* chain with method and field names in current class */ +#define ACC_NATIVELY_OVERLOADED 0x10000000 + +chain *ident_chain; /* chain with method and field names in current class */ FILE *file = NULL; -static u4 outputsize; +static uint32_t outputsize; static bool dopadding; static void printIDpart(int c) { - if ((c >= 'a' && c <= 'z') - || (c >= 'A' && c <= 'Z') - || (c >= '0' && c <= '9') - || (c == '_')) + if ((c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || + (c == '_')) putc(c, file); else putc('_', file); } -static void printID(utf *u) +void printID(utf *u) { char *utf_ptr = u->text; int i; - for (i = 0; i < utf_strlen(u); i++) + for (i = 0; i < utf_get_number_of_u2s(u); i++) printIDpart(utf_nextu2(&utf_ptr)); } -static void addoutputsize (int len) +static void addoutputsize(int len) { - u4 newsize,i; - if (!dopadding) return; + uint32_t newsize; + int32_t i; + + if (!dopadding) + return; - newsize = ALIGN(outputsize, len); + newsize = MEMORY_ALIGN(outputsize, len); - for (i = outputsize; i < newsize; i++) fprintf(file, " u1 pad%d\n", (int) i); + for (i = outputsize; i < newsize; i++) + fprintf(file, " uint8_t pad%d\n", (int) i); + outputsize = newsize; } -static void printOverloadPart(utf *desc) +void printOverloadPart(utf *desc) { char *utf_ptr=desc->text; - u2 c; + uint16_t c; + + fprintf(file, "__"); - fprintf(file,"__"); - while ((c=utf_nextu2(&utf_ptr))!=')') { + while ((c = utf_nextu2(&utf_ptr)) != ')') { switch (c) { - case 'I': - case 'S': - case 'B': - case 'C': - case 'Z': - case 'J': - case 'F': - case 'D': - fprintf (file, "%c",(char)c); - break; - case '[': - fprintf(file,"_3"); - break; - case 'L': - putc('L',file); - while ( (c=utf_nextu2(&utf_ptr)) != ';') - printIDpart (c); - fprintf(file,"_2"); - break; - case '(': - break; - default: panic ("invalid method descriptor"); + case 'I': + case 'S': + case 'B': + case 'C': + case 'Z': + case 'J': + case 'F': + case 'D': + fprintf(file, "%c", (char) c); + break; + case '[': + fprintf(file, "_3"); + break; + case 'L': + putc('L', file); + while ((c = utf_nextu2(&utf_ptr)) != ';') + printIDpart(c); + fprintf(file, "_2"); + break; + case '(': + break; + default: + log_text("invalid method descriptor"); + assert(0); } } } static char *printtype(char *utf_ptr) { - u2 c; + uint16_t c; switch (utf_nextu2(&utf_ptr)) { - case 'V': fprintf (file, "void"); + case 'V': + fprintf(file, "void"); break; case 'I': case 'S': case 'B': case 'C': - case 'Z': addoutputsize (4); - fprintf (file, "s4"); + case 'Z': + addoutputsize(4); + fprintf(file, "int32_t"); break; - case 'J': addoutputsize (8); - fprintf (file, "s8"); + case 'J': + addoutputsize(8); + fprintf(file, "int64_t"); break; - case 'F': addoutputsize (4); - fprintf (file, "float"); + case 'F': + addoutputsize(4); + fprintf(file, "float"); break; - case 'D': addoutputsize (8); - fprintf (file, "double"); + case 'D': + addoutputsize(8); + fprintf(file, "double"); break; case '[': - addoutputsize ( sizeof(java_arrayheader*) ); + addoutputsize ( sizeof(java_array_t*) ); switch (utf_nextu2(&utf_ptr)) { - case 'I': fprintf (file, "java_intarray*"); break; - case 'J': fprintf (file, "java_longarray*"); break; - case 'Z': fprintf (file, "java_booleanarray*"); break; - case 'B': fprintf (file, "java_bytearray*"); break; - case 'S': fprintf (file, "java_shortarray*"); break; - case 'C': fprintf (file, "java_chararray*"); break; - case 'F': fprintf (file, "java_floatarray*"); break; - case 'D': fprintf (file, "java_doublearray*"); break; + case 'I': fprintf (file, "java_intarray_t*"); break; + case 'J': fprintf (file, "java_longarray_t*"); break; + case 'Z': fprintf (file, "java_booleanarray_t*"); break; + case 'B': fprintf (file, "java_bytearray_t*"); break; + case 'S': fprintf (file, "java_shortarray_t*"); break; + case 'C': fprintf (file, "java_chararray_t*"); break; + case 'F': fprintf (file, "java_floatarray_t*"); break; + case 'D': fprintf (file, "java_doublearray_t*"); break; - case '[': fprintf (file, "java_objectarray*"); - while ((c = utf_nextu2(&utf_ptr)) == '[') ; - if (c=='L') + case '[': fprintf(file, "java_objectarray_t*"); + while ((c = utf_nextu2(&utf_ptr)) == '['); + if (c == 'L') while (utf_nextu2(&utf_ptr) != ';'); break; - case 'L': fprintf (file, "java_objectarray*"); - while ( utf_nextu2(&utf_ptr) != ';'); + case 'L': fprintf(file, "java_objectarray_t*"); + while (utf_nextu2(&utf_ptr) != ';'); break; - default: panic ("invalid type descriptor"); + default: + log_text("invalid type descriptor"); + assert(0); } break; case 'L': - addoutputsize ( sizeof(java_objectheader*)); + addoutputsize ( sizeof(java_object_t*)); fprintf (file, "struct "); while ( (c = utf_nextu2(&utf_ptr)) != ';' ) printIDpart (c); fprintf (file, "*"); break; - default: panic ("Unknown type in field descriptor"); + default: + log_text("Unknown type in field descriptor"); + assert(0); } return utf_ptr; @@ -306,17 +234,17 @@ static int searchidentchain_utf(utf *ident) static void printfields(classinfo *c) { - u4 i; + int32_t i; fieldinfo *f; int ident_count; if (!c) { - addoutputsize(sizeof(java_objectheader)); - fprintf(file, " java_objectheader header;\n"); + addoutputsize(sizeof(java_object_t)); + fprintf(file, " java_object_t header;\n"); return; } - printfields(c->super); + printfields(c->super.cls); for (i = 0; i < c->fieldscount; i++) { f = &(c->fields[i]); @@ -325,7 +253,7 @@ static void printfields(classinfo *c) fprintf(file, " "); printtype(f->descriptor->text); fprintf(file, " "); - utf_fprint(file, f->name); + utf_fprint_printable_ascii(file, f->name); /* rename multiple fieldnames */ if ((ident_count = searchidentchain_utf(f->name))) @@ -343,7 +271,7 @@ static void printfields(classinfo *c) void printmethod(methodinfo *m) { char *utf_ptr; - u2 paramnum = 1; + int32_t paramnum = 1; /* search for return-type in descriptor */ utf_ptr = m->descriptor->text; @@ -351,24 +279,29 @@ void printmethod(methodinfo *m) /* create remarks */ fprintf(file, "\n/*\n * Class: "); - utf_fprint(file, m->class->name); + utf_fprint_printable_ascii(file, m->class->name); fprintf(file, "\n * Method: "); - utf_fprint(file, m->name); + utf_fprint_printable_ascii(file, m->name); fprintf(file, "\n * Signature: "); - utf_fprint(file, m->descriptor); - fprintf(file, "\n */\n"); + utf_fprint_printable_ascii(file, m->descriptor); + fprintf(file, "\n */\n"); /* create prototype */ - fprintf(file, "JNIEXPORT "); + fprintf(file, "JNIEXPORT "); printtype(utf_ptr); fprintf(file, " JNICALL Java_"); - printID(m->class->name); + printID(m->class->name); - chain_addlast(ident_chain, m->name); + chain_addlast(ident_chain, m->name); fprintf(file, "_"); printID(m->name); - if (m->nativelyoverloaded) printOverloadPart(m->descriptor); + + /* ATTENTION: We use a dummy flag here. */ + + if (m->flags & ACC_NATIVELY_OVERLOADED) + printOverloadPart(m->descriptor); + fprintf(file, "(JNIEnv *env"); utf_ptr = m->descriptor->text + 1; @@ -398,9 +331,9 @@ void printmethod(methodinfo *m) void gen_header_filename(char *buffer, utf *u) { - s4 i; + int32_t i; - for (i = 0; i < utf_strlen(u); i++) { + for (i = 0; i < utf_get_number_of_u2s(u); i++) { if ((u->text[i] == '/') || (u->text[i] == '$')) { buffer[i] = '_'; /* convert '$' and '/' to '_' */ @@ -408,7 +341,7 @@ void gen_header_filename(char *buffer, utf *u) buffer[i] = u->text[i]; } } - buffer[utf_strlen(u)] = '\0'; + buffer[utf_get_number_of_u2s(u)] = '\0'; } @@ -419,15 +352,16 @@ void headerfile_generate(classinfo *c, char *opt_directory) char header_filename[1024] = ""; char classname[1024]; char uclassname[1024]; - u2 i; + int32_t i; methodinfo *m; - u2 i2; + int32_t j; methodinfo *m2; - u2 nativelyoverloaded; - - /* store class in chain */ - chain_addlast(nativeclass_chain, c); - + bool nativelyoverloaded; + + /* prevent compiler warnings */ + + nativelyoverloaded = false; + /* open headerfile for class */ gen_header_filename(classname, c->name); @@ -442,10 +376,12 @@ void headerfile_generate(classinfo *c, char *opt_directory) } file = fopen(header_filename, "w"); - if (!file) - panic("Can not open file to store header information"); + if (!file) { + log_text("Can not open file to store header information"); + assert(0); + } - fprintf(file, "/* This file is machine generated, don't edit it !*/\n\n"); + fprintf(file, "/* This file is machine generated, don't edit it! */\n\n"); /* convert to uppercase */ for (i = 0; classname[i]; i++) { @@ -457,7 +393,7 @@ void headerfile_generate(classinfo *c, char *opt_directory) /* create structure for direct access to objects */ fprintf(file, "/* Structure information for class: "); - utf_fprint(file, c->name); + utf_fprint_printable_ascii(file, c->name); fprintf(file, " */\n\n"); fprintf(file, "typedef struct "); printID(c->name); @@ -478,34 +414,40 @@ void headerfile_generate(classinfo *c, char *opt_directory) /* create method-prototypes */ /* find overloaded methods */ - for (i = 0; i < c->methodscount; i++) { + for (i = 0; i < c->methodscount; i++) { m = &(c->methods[i]); - if (!(m->flags & ACC_NATIVE)) continue; - if (!m->nativelyoverloaded) { - nativelyoverloaded=false; - for (i2=i+1;i2methodscount; i2++) { - m2 = &(c->methods[i2]); - if (!(m2->flags & ACC_NATIVE)) continue; - if (m->name==m2->name) { - m2->nativelyoverloaded=true; - nativelyoverloaded=true; + if (!(m->flags & ACC_NATIVE)) + continue; + + /* We use a dummy flag here. */ + + if (!(m->flags & ACC_NATIVELY_OVERLOADED)) { + nativelyoverloaded = false; + + for (j = i + 1; j < c->methodscount; j++) { + m2 = &(c->methods[j]); + + if (!(m2->flags & ACC_NATIVE)) + continue; + + if (m->name == m2->name) { + m2->flags |= ACC_NATIVELY_OVERLOADED; + nativelyoverloaded = true; } } - m->nativelyoverloaded=nativelyoverloaded; } + if (nativelyoverloaded == true) + m->flags |= ACC_NATIVELY_OVERLOADED; } for (i = 0; i < c->methodscount; i++) { - m = &(c->methods[i]); - if (m->flags & ACC_NATIVE) { - chain_addlast(nativemethod_chain, m); + if (m->flags & ACC_NATIVE) printmethod(m); - } } chain_free(ident_chain); @@ -523,15 +465,13 @@ void print_classname(classinfo *clazz) utf *u = clazz->name; char *endpos = u->text + u->blength; char *utf_ptr = u->text; - u2 c; + uint16_t c; while (utf_ptr < endpos) { - if ((c = utf_nextu2(&utf_ptr)) == '_') { + if ((c = utf_nextu2(&utf_ptr)) == '_') putc('$', file); - - } else { + else putc(c, file); - } } } @@ -547,4 +487,5 @@ void print_classname(classinfo *clazz) * c-basic-offset: 4 * tab-width: 4 * End: + * vim:noexpandtab:sw=4:ts=4: */