X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=headers.c;h=038ccffc89354849a1e185523648a8dc1dfd2178;hb=55f59d4e8e4adea7173ad5414a00bea908baebc3;hp=a56f63d246113e5ab5690849d6eb4861e2edcfda;hpb=d3d85b67410eb21783c39598ab7fda36d08341fd;p=cacao.git diff --git a/headers.c b/headers.c index a56f63d24..038ccffc8 100644 --- a/headers.c +++ b/headers.c @@ -1,197 +1,285 @@ -/* headers.c ******************************************************************* +/* headers.c - functions for header generation - Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst + 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 - See file COPYRIGHT for information on usage and disclaimer of warranties + This file is part of CACAO. - This module replaces 'main' for header file generation. It also fakes some - references to external modules which would otherwise depend on the header - files generated by this very program. + This program 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 module is quite a quick hack and not documented very well as a - consequence. + This program 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. - Authors: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at - Changes: Mark Probst EMAIL: cacao@complang.tuwien.ac.at - Philipp Tomsich EMAIL: cacao@complang.tuwien.ac.at + 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. - Last Change: $Id: headers.c 542 2003-10-30 20:58:18Z twisti $ + Contact: cacao@complang.tuwien.ac.at -*******************************************************************************/ + Authors: Reinhard Grafl -#define CACAOH + Changes: Mark Probst + Philipp Tomsich + Christian Thalinger -#include "config.h" /* phil */ + $Id: headers.c 1368 2004-08-01 21:50:08Z stefan $ + +*/ + + +#include +#include +#include +#include "config.h" #include "global.h" #include "tables.h" #include "loader.h" +#include "options.h" +#include "builtin.h" +#include "mm/boehm.h" +#include "toolbox/chain.h" +#include "toolbox/memory.h" +#include "toolbox/logging.h" +#include "nat/java_lang_String.h" +#include "nat/java_lang_Throwable.h" /******* replace some external functions *********/ -functionptr native_findfunction (utf *cname, utf *mname, utf *desc, bool isstatic) +functionptr native_findfunction(utf *cname, utf *mname, utf *desc, bool isstatic) { return NULL; } -java_objectheader *javastring_new (utf *text) /* schani */ +java_objectheader *javastring_new(utf *text) { return NULL; } +java_objectheader *javastring_new_char(char *text) { return NULL; } + +char *javastring_tochar(java_objectheader *so) { return NULL; } +utf *javastring_toutf(java_lang_String *string, bool isclassname) { return NULL; } -void throw_classnotfoundexception() -{ - panic("class not found"); -} -java_objectheader *literalstring_new (utf *u) -{ 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 literalstring_free (java_objectheader *o) { } -void stringtable_update () { } +java_objectheader *literalstring_new(utf *u) { return NULL; } + + +void literalstring_free(java_objectheader *o) {} +void stringtable_update() { } void synchronize_caches() { } -void asm_call_jit_compiler () { } -void asm_calljavamethod () { } -void asm_dumpregistersandcall () { } +void asm_call_jit_compiler() { } +void asm_calljavafunction() { } 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_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; } +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 asm_builtin_monitorenter (java_objectheader *o) {} -void asm_builtin_monitorexit (java_objectheader *o) {} +void use_class_as_object() {} +void asm_builtin_monitorenter(java_objectheader *o) {} +void *asm_builtin_monitorexit(java_objectheader *o) {} + +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 -s4 asm_builtin_checkarraycast(java_objectheader *o, constant_arraydescriptor *d) {return 0;} #if defined(__I386__) s4 asm_builtin_arrayinstanceof(java_objectheader *obj, classinfo *class) { return 0; } -void asm_builtin_anewarray (s4 size, classinfo *elementtype) {} -void asm_builtin_newarray_array (s4 size, constant_arraydescriptor *elementdesc) {} +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 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 removecompilerstub(u1 *stub) {} +void removenativestub(u1 *stub) {} -void asm_perform_threadswitch (u1 **from, u1 **to) {} -u1* asm_initialize_thread_stack (void *func, u1 *stack) { return NULL; } -void asm_switchstackandcall () { } +void asm_perform_threadswitch(u1 **from, u1 **to, u1 **stackTop) {} +u1* asm_initialize_thread_stack(void *func, u1 *stack) { return NULL; } +void thread_restartcriticalsection() {} +void asm_switchstackandcall() {} +void asm_handle_builtin_exception(classinfo *c) {} +void asm_getclassvalues_atomic() {} + +#if defined(__DARWIN__) +int cacao_catch_Handler() {} +#endif + +#if defined(USE_THREADS) && defined(NATIVE_THREADS) +threadcritnode asm_criticalsections; +#endif -java_objectheader *native_new_and_init (void *p) { return NULL; } /************************ global variables **********************/ -java_objectheader *exceptionptr; /* schani */ -bool verbose = false; +THREADSPECIFIC java_objectheader *_exceptionptr; -static chain *nativemethod_chain; /* chain with native methods */ -static chain *nativeclass_chain; /* chain with processed classes */ -static chain *ident_chain; /* chain with method and field names in current class */ -static FILE *file = NULL; +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 */ +FILE *file = NULL; static u4 outputsize; static bool dopadding; -static void printIDpart (int c) -{ - if ( (c>='a' && c<='z') - || (c>='A' && c<='Z') - || (c>='0' && c<='9') - || (c=='_') ) - putc (c,file); - else putc ('_',file); +static void printIDpart(int 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) + +static void printID(utf *u) { char *utf_ptr = u->text; int i; - for (i=0; itext; + u2 c; -static char *printtype (char *utf_ptr) + fprintf(file,"__"); + 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"); + } + } +} + +static char *printtype(char *utf_ptr) { u2 c; switch (utf_nextu2(&utf_ptr)) { - case 'V': fprintf (file, "void"); - break; - case 'I': - case 'S': - case 'B': - case 'C': - case 'Z': addoutputsize (4); - fprintf (file, "s4"); - break; - case 'J': addoutputsize (8); - fprintf (file, "s8"); - break; - case 'F': addoutputsize (4); - fprintf (file, "float"); - break; - case 'D': addoutputsize (8); - fprintf (file, "double"); - break; - case '[': - addoutputsize ( sizeof(java_arrayheader*) ); - 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 'V': fprintf (file, "void"); + break; + case 'I': + case 'S': + case 'B': + case 'C': + case 'Z': addoutputsize (4); + fprintf (file, "s4"); + break; + case 'J': addoutputsize (8); + fprintf (file, "s8"); + break; + case 'F': addoutputsize (4); + fprintf (file, "float"); + break; + case 'D': addoutputsize (8); + fprintf (file, "double"); + break; + case '[': + addoutputsize ( sizeof(java_arrayheader*) ); + 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 '[': fprintf (file, "java_arrayarray*"); - while ((c = utf_nextu2(&utf_ptr)) == '[') ; - if (c=='L') - while (utf_nextu2(&utf_ptr) != ';'); - break; + case '[': fprintf (file, "java_objectarray*"); + 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) != ';'); - break; - default: panic ("invalid type descriptor"); - } + case 'L': fprintf (file, "java_objectarray*"); + while ( utf_nextu2(&utf_ptr) != ';'); break; + default: panic ("invalid type descriptor"); + } + break; - case 'L': - addoutputsize ( sizeof(java_objectheader*)); - fprintf (file, "struct "); - while ( (c = utf_nextu2(&utf_ptr)) != ';' ) printIDpart (c); - fprintf (file, "*"); - break; + case 'L': + addoutputsize ( sizeof(java_objectheader*)); + fprintf (file, "struct "); + while ( (c = utf_nextu2(&utf_ptr)) != ';' ) printIDpart (c); + fprintf (file, "*"); + break; - default: panic ("Unknown type in field descriptor"); + default: panic ("Unknown type in field descriptor"); } return utf_ptr; } -/******* determine the number of entries of a utf string in the ident chain *****/ + +/***** determine the number of entries of a utf string in the ident chain *****/ static int searchidentchain_utf(utf *ident) { @@ -206,47 +294,49 @@ static int searchidentchain_utf(utf *ident) return count; } -/**************** print structure for direct access to objects ******************/ -static void printfields (classinfo *c) +/************** print structure for direct access to objects ******************/ + +static void printfields(classinfo *c) { u4 i; fieldinfo *f; int ident_count; if (!c) { - addoutputsize ( sizeof(java_objectheader) ); - fprintf (file, " java_objectheader header;\n"); + addoutputsize(sizeof(java_objectheader)); + fprintf(file, " java_objectheader header;\n"); return; - } + } - printfields (c->super); + printfields(c->super); - for (i=0; ifieldscount; i++) { + for (i = 0; i < c->fieldscount; i++) { f = &(c->fields[i]); - if (! (f->flags & ACC_STATIC) ) { - fprintf (file," "); - printtype (f->descriptor->text); - fprintf (file, " "); - utf_fprint (file, f->name); + if (!(f->flags & ACC_STATIC)) { + fprintf(file, " "); + printtype(f->descriptor->text); + fprintf(file, " "); + utf_fprint(file, f->name); /* rename multiple fieldnames */ if ((ident_count = searchidentchain_utf(f->name))) - fprintf(file,"%d",ident_count - 1); - chain_addlast(ident_chain,f->name); + fprintf(file, "%d", ident_count - 1); + chain_addlast(ident_chain, f->name); - fprintf (file, ";\n"); - } + fprintf(file, ";\n"); } + } } + /***************** store prototype for native method in file ******************/ -static void printmethod (methodinfo *m) +void printmethod(methodinfo *m) { char *utf_ptr; - u2 paramnum=1; + u2 paramnum = 1; u2 ident_count; /* search for return-type in descriptor */ @@ -254,340 +344,218 @@ static void printmethod (methodinfo *m) while (utf_nextu2(&utf_ptr) != ')'); /* create remarks */ - fprintf (file,"/*\n * Class: "); - utf_fprint (file, m->class->name); - fprintf (file,"\n * Method: "); - utf_fprint (file, m->name); - fprintf (file,"\n * Signature: "); - utf_fprint (file, m->descriptor); - fprintf (file,"\n */\n"); + fprintf(file, "\n/*\n * Class: "); + utf_fprint(file, m->class->name); + fprintf(file, "\n * Method: "); + utf_fprint(file, m->name); + fprintf(file, "\n * Signature: "); + utf_fprint(file, m->descriptor); + fprintf(file, "\n */\n"); /* create prototype */ - fprintf (file,"JNIEXPORT "); - printtype (utf_ptr); - fprintf (file," JNICALL Java_"); - printID (m->class->name); - - /* rename overloaded method */ - if ((ident_count = searchidentchain_utf(m->name))) - fprintf(file,"%d",ident_count - 1); - chain_addlast(ident_chain,m->name); - - fprintf (file,"_"); - printID (m->name); - fprintf (file," (JNIEnv *env "); + fprintf(file, "JNIEXPORT "); + printtype(utf_ptr); + fprintf(file, " JNICALL Java_"); + printID(m->class->name); + + chain_addlast(ident_chain, m->name); + + fprintf(file, "_"); + printID(m->name); + if (m->nativelyoverloaded) printOverloadPart(m->descriptor); + fprintf(file, "(JNIEnv *env"); - utf_ptr = m->descriptor->text+1; + utf_ptr = m->descriptor->text + 1; - if (! (m->flags & ACC_STATIC) ) { - - fprintf (file, ", struct "); - printID (m->class->name); - fprintf (file, "* this "); + if (!(m->flags & ACC_STATIC)) { + fprintf(file, ", struct "); + printID(m->class->name); + fprintf(file, "* this"); - }; + } else { + fprintf(file, ", jclass clazz"); + } - if ((*utf_ptr)!=')') fprintf (file, ", "); + if ((*utf_ptr) != ')') fprintf(file, ", "); - while ((*utf_ptr)!=')') { - utf_ptr = printtype (utf_ptr); - fprintf (file, " par%d", paramnum++); - if ((*utf_ptr)!=')') fprintf (file, ", "); - } + while ((*utf_ptr) != ')') { + utf_ptr = printtype(utf_ptr); + fprintf(file, " par%d", paramnum++); + if ((*utf_ptr)!=')') fprintf(file, ", "); + } - fprintf (file, ");\n"); + fprintf(file, ");\n\n"); } -/****************** remove package-name in fully-qualified classname *********************/ +/******* remove package-name in fully-qualified classname *********************/ -static void simple_classname(char *buffer, utf *u) +void gen_header_filename(char *buffer, utf *u) { - int i, simplename_start; - - for (i=utf_strlen(u)-1; i>=0; i--) { - - if (u->text[i] == '$') u->text[i] = '_'; else /* convert '$' to '_' */ - if (u->text[i] == '/') { - /* beginning of simple name */ - simplename_start = i+1; - break; + s4 i; + + for (i = 0; i < utf_strlen(u); i++) { + if ((u->text[i] == '/') || (u->text[i] == '$')) { + buffer[i] = '_'; /* convert '$' and '/' to '_' */ + + } else { + buffer[i] = u->text[i]; + } } - } - - for (i=simplename_start; i < utf_strlen(u); i++) - buffer[i-simplename_start] = u->text[i]; - - buffer[i-simplename_start] = '\0'; + buffer[utf_strlen(u)] = '\0'; } -/*********** create headerfile for classes and store native methods in chain ************/ -static void headerfile_generate (classinfo *c) +/* create headerfile for classes and store native methods in chain ************/ + +void headerfile_generate(classinfo *c) { char header_filename[1024] = ""; char classname[1024]; + char uclassname[1024]; u2 i; methodinfo *m; + u2 i2; + methodinfo *m2; + u2 nativelyoverloaded; /* store class in chain */ - chain_addlast (nativeclass_chain, c); + chain_addlast(nativeclass_chain, c); /* open headerfile for class */ - simple_classname(classname,c->name); + gen_header_filename(classname, c->name); /* create chain for renaming fields */ - ident_chain = chain_new (); + ident_chain = chain_new(); sprintf(header_filename, "nat/%s.h", classname); - file = fopen (header_filename, "w"); - if (!file) panic ("Can not open file to store header information"); - fprintf (file, "/* This file is machine generated, don't edit it !*/\n\n"); + file = fopen(header_filename, "w"); + if (!file) panic("Can not open file to store header information"); + + fprintf(file, "/* This file is machine generated, don't edit it !*/\n\n"); + + /* convert to uppercase */ + for (i = 0; classname[i]; i++) { + uclassname[i] = toupper(classname[i]); + } + uclassname[i] = '\0'; + + fprintf(file, "#ifndef _%s_H\n#define _%s_H\n\n", uclassname, uclassname); /* create structure for direct access to objects */ - fprintf (file, "/* Structure information for class: "); - utf_fprint (file, c->name); - fprintf (file, " */\n\n"); - fprintf (file, "typedef struct "); - printID (c->name); - fprintf (file, " {\n"); - outputsize=0; - dopadding=true; - printfields (c); - fprintf (file, "} "); - printID (c->name); - fprintf (file, ";\n\n"); + fprintf(file, "/* Structure information for class: "); + utf_fprint(file, c->name); + fprintf(file, " */\n\n"); + fprintf(file, "typedef struct "); + printID(c->name); + fprintf(file, " {\n"); + outputsize = 0; + dopadding = true; + + printfields(c); + + fprintf(file, "} "); + printID(c->name); + fprintf(file, ";\n\n"); /* create chain for renaming overloaded methods */ - chain_free(ident_chain); - ident_chain = chain_new (); + chain_free(ident_chain); + ident_chain = chain_new(); /* create method-prototypes */ - for (i=0; imethodscount; i++) { + /* find overloaded methods */ + 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; + } + } + m->nativelyoverloaded=nativelyoverloaded; + } + + } + + for (i = 0; i < c->methodscount; i++) { m = &(c->methods[i]); if (m->flags & ACC_NATIVE) { - chain_addlast (nativemethod_chain, m); - printmethod(m); - } + chain_addlast(nativemethod_chain, m); + printmethod(m); } - + } + + chain_free(ident_chain); + + fprintf(file, "#endif\n\n"); - chain_free(ident_chain); fclose(file); } + /******** print classname, '$' used to seperate inner-class name ***********/ -void print_classname (classinfo *clazz) +void print_classname(classinfo *clazz) { utf *u = clazz->name; char *endpos = u->text + u->blength; char *utf_ptr = u->text; u2 c; - while (utf_ptrclass); - fprintf (file, "\",\n \""); - utf_fprint (file, m->name); - fprintf (file, "\",\n \""); - utf_fprint (file, m->descriptor); - fprintf (file, "\",\n "); - if ( (m->flags & ACC_STATIC) !=0) fprintf (file, "true"); - else fprintf (file, "false"); - fprintf (file, ",\n "); - fprintf (file, "(functionptr) Java_"); - printID (m->class->name); - fprintf (file,"_"); - printID (m->name); - fprintf (file,"\n },\n"); + fprintf(file, "\",\n \""); + utf_fprint(file, m->name); + fprintf(file, "\",\n \""); + utf_fprint(file, m->descriptor); + fprintf(file, "\",\n "); + + if ((m->flags & ACC_STATIC) != 0) + fprintf(file, "true"); + else + fprintf(file, "false"); + + fprintf(file, ",\n "); + fprintf(file, "(functionptr) Java_"); + printID(m->class->name); + fprintf(file,"_"); + printID(m->name); + if (m->nativelyoverloaded) printOverloadPart(m->descriptor); + fprintf(file,"\n },\n"); } -/*************************************************************************** - - create the nativetypes-headerfile which includes - the headerfiles of the classes stored in the classes-chain - -****************************************************************************/ - -static void headers_finish () +void setVMClassField(classinfo *c) { - methodinfo *m; - classinfo *c; - char classname[1024]; - - file = fopen ("nativetypes.hh", "w"); - if (!file) panic ("Can not open file 'native.h' to store header information"); - - fprintf (file, "/* Headerfile for native methods: nativetypes.hh */\n"); - fprintf (file, "/* This file is machine generated, don't edit it !*/\n\n"); - fprintf (file, "\n/* include native-Headerfiles */\n\n"); - - c = chain_first (nativeclass_chain); - while (c) { - - dopadding=false; - simple_classname(classname,c->name); - fprintf(file,"#include \"nat/%s.h\"\n",classname); - c = chain_next (nativeclass_chain); - } - - fclose(file); - chain_free (nativeclass_chain); - - /* create table of native-methods */ - - file = fopen ("nativetable.hh", "w"); - if (!file) panic ("Can not open file 'nativetable' to store native-link-table"); - - fprintf (file, "/* Table of native methods: nativetables.hh */\n"); - fprintf (file, "/* This file is machine generated, don't edit it !*/\n\n"); - - while ( (m = chain_first (nativemethod_chain)) != NULL) { - chain_remove (nativemethod_chain); - printnativetableentry (m); - } - - chain_free (nativemethod_chain); - fclose (file); - } -/******************** internal function: print_usage ************************ - -Prints usage information for the JAVA header generator to stdout. - -***************************************************************************/ - -static void print_usage() -{ - printf ("USAGE: jch class [class..]\n"); -} - - - -/************************** Function: main ******************************* - - Main program. - -**************************************************************************/ - -int main(int argc, char **argv) -{ - s4 i,a; - char *cp; - classinfo *topclass; - void *dummy; - - - /********** internal (only used by main) *****************************/ - - char classpath[500] = ""; - char offsets_filename[1024] = ""; /* phil */ - u4 heapsize = 100000; - - /*********** options so only headers are generated *******************/ - - makeinitializations=false; - - - /************ Collect some info from the environment *****************/ - - cp = getenv ("CLASSPATH"); - if (cp) { - strcpy (classpath + strlen(classpath), ":"); - strcpy (classpath + strlen(classpath), cp); - } - - if (argc < 2) { - print_usage (); - exit(10); - } - - - /**************************** Program start **************************/ - - log_init (NULL); - log_text ("Java - header-generator started"); - - sprintf(offsets_filename, "%s/offsets.h", SYSDEP_DIR); /* phil */ - file = fopen(offsets_filename, "w"); - if (file == NULL) { - fprintf (stderr, "Can not open file '%s' for write", offsets_filename); - exit(-1); - } - - fprintf (file, "/* This file is machine generated, don't edit it !*/\n\n"); - - fprintf (file, "#define offobjvftbl %3d\n", (int) OFFSET(java_objectheader, vftbl)); - fprintf (file, "#define offarraysize %3d\n", (int) OFFSET(java_arrayheader, size)); - fprintf (file, "#define offobjarrdata %3d\n\n", (int) OFFSET(java_objectarray, data[0])); - fprintf (file, "#define offbaseval %3d\n", (int) OFFSET(vftbl, baseval)); - fprintf (file, "#define offdiffval %3d\n", (int) OFFSET(vftbl, diffval)); - - fclose (file); - - suck_init (classpath); - - tables_init (); - heap_init (heapsize, heapsize, &dummy); - loader_init (); - - - /*********************** Load JAVA classes **************************/ - - nativemethod_chain = chain_new (); - nativeclass_chain = chain_new (); - - for (a=1; a=0; i--) - switch (cp[i]) { - case '.': cp[i]='/'; - break; - case '_': cp[i]='$'; - } - - topclass = loader_load ( utf_new_char (cp) ); - - headerfile_generate (topclass); - } - - headers_finish (); - - /************************ Release all resources **********************/ - - loader_close (); - heap_close (); - tables_close ( literalstring_free ); - - - /* Print "finished" message */ - - log_text ("Java - header-generator stopped"); - log_cputime (); - mem_usagelog(1); - +void *Java_java_lang_VMObject_clone(void *env, void *clazz, void * this) { return 0; }