One should not cast carelessly
[cacao.git] / loader.c
index 4bf70f15ba4155aa2e4bf20fb942e56011648338..bc2919c347be28c60a045b96a89795eb64669d97 100644 (file)
--- a/loader.c
+++ b/loader.c
 #endif
 #include "asmpart.h"
 
+#ifdef USE_BOEHM
+#include "toolbox/memory.h"
+#endif
+
 #include "threads/thread.h"
 #include <sys/stat.h>
 
@@ -142,13 +146,24 @@ static int classbuffer_size;        /* size of classfile-data                 */
 
 #define skip_nbytes(len) classbuf_pos+=len;
 
-#define suck_u1() (*++classbuf_pos)
+inline u1 suck_u1()
+{
+       return *++classbuf_pos;
+}
+inline u2 suck_u2()
+{
+       u1 a=suck_u1(), b=suck_u1();
+       return ((u2)a<<8)+(u2)b;
+}
+inline u4 suck_u4()
+{
+       u1 a=suck_u1(), b=suck_u1(), c=suck_u1(), d=suck_u1();
+       return ((u4)a<<24)+((u4)b<<16)+((u4)c<<8)+(u4)d;
+}
 #define suck_s8() (s8) suck_u8()
 #define suck_s2() (s2) suck_u2()
 #define suck_s4() (s4) suck_u4()
 #define suck_s1() (s1) suck_u1()
-#define suck_u2() (u2) ((suck_u1()<<8)+suck_u1())
-#define suck_u4() (u4) ((((u4)suck_u1())<<24)+(((u4)suck_u1())<<16)+(((u4)suck_u1())<<8)+((u4)suck_u1()))
 
 
 /* get u8 from classfile data */
@@ -722,16 +737,15 @@ static void displayarraydescriptor (constant_arraydescriptor *d)
 
 
 /******************************************************************************/
-/******************** Functionen fuer Fields **********************************/
+/**************************  Functions for fields  ****************************/
 /******************************************************************************/
 
 
 /************************ Function: field_load *********************************
 
-       l"adt alle Informationen f"ur eine Feld einer Methode aus dem ClassFile,
-       und f"ullt mit diesen Infos eine schon existierende 'fieldinfo'-Struktur.
-       Bei 'static'-Fields wird auch noch ein Platz auf dem Datensegment
-       reserviert.
+       Load everything about a class field from the class file and fill a
+       'fieldinfo' structure. For static fields, space in the data segment is
+       allocated.
 
 *******************************************************************************/
 
@@ -839,7 +853,7 @@ static void field_free (fieldinfo *f)
 }
 
 
-/************** Function: field_display (nur zu Debug-Zwecken) ****************/
+/**************** Function: field_display (debugging only) ********************/
 
 static void field_display (fieldinfo *f)
 {
@@ -1858,6 +1872,9 @@ static void class_free (classinfo *c)
        if (c->innerclasscount)
                MFREE (c->innerclass, innerclassinfo, c->innerclasscount);
 
+       if (c->classvftbl)
+               mem_free(c->header.vftbl, sizeof(vftbl) + sizeof(methodptr)*(c->vftbl->vftbllength-1));
+       
        FREE (c, classinfo);
 }