* src/cacaoh/headers.c (HEAP_PREFIX): Added define.
authormichi <none@none>
Tue, 21 Aug 2007 11:16:03 +0000 (11:16 +0000)
committermichi <none@none>
Tue, 21 Aug 2007 11:16:03 +0000 (11:16 +0000)
(printtype): Added arguments prefix and infix.
(printfields): Pass correct prefix for reference types.
(printmethod): Pass correct infix for array types.
(headerfile_generate): Print correct prefix for heap object.
(headerfile_generate) [ENABLE_HANDLES]: Also create struct typedef for handle.

--HG--
branch : exact-gc

m4/classpath.m4
src/cacaoh/headers.c

index 2b11adc8de79cc16e495c68591ad201a05fdb22d..42345e8deda9281aaba2dcdc5a50dca0597188be 100644 (file)
@@ -22,7 +22,7 @@ dnl along with this program; if not, write to the Free Software
 dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 dnl 02110-1301, USA.
 dnl 
-dnl $Id: classpath.m4 8248 2007-07-31 12:47:11Z twisti $
+dnl $Id: classpath.m4 8299 2007-08-13 08:41:18Z michi $
 
 
 dnl which Java core library should we use
index 2dccb9855141bab4c3284ff728c9ab0b3da3ebf7..11548b1229a52b12230dd514409634cd111fc554 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: headers.c 8318 2007-08-16 10:05:34Z michi $
+   $Id: headers.c 8377 2007-08-21 11:16:03Z michi $
 
 */
 
 
 #define ACC_NATIVELY_OVERLOADED    0x10000000
 
+#if defined(ENABLE_HANDLES)
+# define HEAP_PREFIX "heap_"
+#else
+# define HEAP_PREFIX ""
+#endif
+
 chain *ident_chain;     /* chain with method and field names in current class */
 FILE *file = NULL;
 static uint32_t outputsize;
@@ -145,7 +151,7 @@ void printOverloadPart(utf *desc)
        }
 }
 
-static char *printtype(char *utf_ptr)
+static char *printtype(char *utf_ptr, char *prefix, char *infix)
 {
        uint16_t c;
 
@@ -176,22 +182,22 @@ static char *printtype(char *utf_ptr)
        case '[':
                addoutputsize ( sizeof(java_array_t*) ); 
                switch (utf_nextu2(&utf_ptr)) {
-               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 'I':  fprintf (file, "java%s_intarray_t*", infix); break;
+               case 'J':  fprintf (file, "java%s_longarray_t*", infix); break;
+               case 'Z':  fprintf (file, "java%s_booleanarray_t*", infix); break;
+               case 'B':  fprintf (file, "java%s_bytearray_t*", infix); break;
+               case 'S':  fprintf (file, "java%s_shortarray_t*", infix); break;
+               case 'C':  fprintf (file, "java%s_chararray_t*", infix); break;
+               case 'F':  fprintf (file, "java%s_floatarray_t*", infix); break;
+               case 'D':  fprintf (file, "java%s_doublearray_t*", infix); break;
                                
-               case '[': fprintf(file, "java_objectarray_t*");
+               case '[': fprintf(file, "java%s_objectarray_t*", infix);
                        while ((c = utf_nextu2(&utf_ptr)) == '[');
                        if (c == 'L')
                                while (utf_nextu2(&utf_ptr) != ';');
                        break;
                            
-               case 'L':  fprintf(file, "java_objectarray_t*");
+               case 'L':  fprintf(file, "java%s_objectarray_t*", infix);
                        while (utf_nextu2(&utf_ptr) != ';');
                        break;
                default:
@@ -202,7 +208,7 @@ static char *printtype(char *utf_ptr)
                
        case 'L': 
                addoutputsize ( sizeof(java_object_t*));
-               fprintf (file, "struct ");
+               fprintf (file, "struct %s", prefix);
                while ( (c = utf_nextu2(&utf_ptr)) != ';' ) printIDpart (c);     
                fprintf (file, "*");
                break;
@@ -253,7 +259,7 @@ static void printfields(classinfo *c)
                
                if (!(f->flags & ACC_STATIC)) {
                        fprintf(file, "   ");
-                       printtype(f->descriptor->text);
+                       printtype(f->descriptor->text, HEAP_PREFIX, "");
                        fprintf(file, " ");
                        utf_fprint_printable_ascii(file, f->name);
 
@@ -290,7 +296,7 @@ void printmethod(methodinfo *m)
 
        /* create prototype */                  
        fprintf(file, "JNIEXPORT ");
-       printtype(utf_ptr);
+       printtype(utf_ptr, "", "_handle");
        fprintf(file, " JNICALL Java_");
        printID(m->class->name);
 
@@ -320,7 +326,7 @@ void printmethod(methodinfo *m)
        if ((*utf_ptr) != ')') fprintf(file, ", ");
                        
        while ((*utf_ptr) != ')') {
-               utf_ptr = printtype(utf_ptr);
+               utf_ptr = printtype(utf_ptr, "", "_handle");
                fprintf(file, " par%d", paramnum++);
                if ((*utf_ptr)!=')') fprintf(file, ", ");
        }
@@ -397,17 +403,30 @@ void headerfile_generate(classinfo *c, char *opt_directory)
        fprintf(file, "/* Structure information for class: ");
        utf_fprint_printable_ascii(file, c->name);
        fprintf(file, " */\n\n");
-       fprintf(file, "typedef struct ");
-       printID(c->name);                                                       
+       fprintf(file, "typedef struct %s", HEAP_PREFIX);
+       printID(c->name);
        fprintf(file, " {\n");
        outputsize = 0;
        dopadding = true;
 
        printfields(c);
 
+       fprintf(file, "} %s", HEAP_PREFIX);
+       printID(c->name);
+       fprintf(file, ";\n\n");
+
+#if defined(ENABLE_HANDLES)
+       /* create structure for indirection cell */
+       fprintf(file, "typedef struct ");
+       printID(c->name);
+       fprintf(file, " {\n");
+       fprintf(file, "   %s", HEAP_PREFIX);
+       printID(c->name);
+       fprintf(file, " *heap_object;\n");
        fprintf(file, "} ");
        printID(c->name);
        fprintf(file, ";\n\n");
+#endif
 
        /* create chain for renaming overloaded methods */
        chain_free(ident_chain);