* src/native/localref.c: Adapted ifdefs to above change.
* src/vmcore/class.c: Adapted ifdefs to above change.
(class_free): Fixed, fields array get freed properly.
* src/vmcore/field.c: Adapted ifdefs to above change.
(field_free): Implemented, field value memory gets freed.
#define CFREE(ptr,num) memory_cfree((ptr),(num))
-/* GC macros ******************************************************************/
+/* GC macros (boehm only) *****************************************************/
-#if !defined(ENABLE_GC_CACAO)
+#if defined(ENABLE_GC_BOEHM)
/* Uncollectable memory which can contain references */
assert(LOCALREFTABLE == NULL);
-#if defined(ENABLE_GC_CACAO)
+#if !defined(ENABLE_GC_BOEHM)
/* this is freed by localref_table_destroy */
lrt = NEW(localref_table);
#else
assert(lrt);
assert(lrt->prev == NULL);
-#if defined(ENABLE_GC_CACAO)
+#if !defined(ENABLE_GC_BOEHM)
FREE(lrt, localref_table);
#endif
else
additionalrefs = 0;
-#if defined(ENABLE_GC_CACAO)
+#if !defined(ENABLE_GC_BOEHM)
nlrt = (localref_table *)
MNEW(u1, sizeof(localref_table) + additionalrefs * SIZEOF_VOID_P);
#else
localref_table *lrt;
localref_table *plrt;
int32_t localframes;
-#if defined(ENABLE_GC_CACAO)
+#if !defined(ENABLE_GC_BOEHM)
int32_t additionalrefs;
#endif
lrt->prev = NULL;
-#if defined(ENABLE_GC_CACAO)
+#if !defined(ENABLE_GC_BOEHM)
/* for the exact GC local reference tables are not on the heap,
so we need to free them explicitly here. */
log_message_utf("Creating class: ", classname);
#endif
- /* GCNEW_UNCOLLECTABLE clears the allocated memory */
-
-#if defined(ENABLE_GC_CACAO)
+#if !defined(ENABLE_GC_BOEHM)
c = (classinfo *) heap_alloc_uncollectable(sizeof(classinfo));
+ /*c = NEW(classinfo);
+ MZERO(c, classinfo, 1);*/
#else
c = GCNEW_UNCOLLECTABLE(classinfo, 1);
- /*c=NEW(classinfo);*/
+ /* GCNEW_UNCOLLECTABLE clears the allocated memory */
#endif
+
c->name = classname;
/* Set the header.vftbl of all loaded classes to the one of
{
s4 i;
vftbl_t *v;
-
+
class_freecpool(c);
if (c->interfaces != NULL)
if (c->fields) {
for (i = 0; i < c->fieldscount; i++)
field_free(&(c->fields[i]));
-#if defined(ENABLE_CACAO_GC)
MFREE(c->fields, fieldinfo, c->fieldscount);
-#endif
}
if (c->methods) {
break;
case TYPE_ADR:
-#if defined(ENABLE_GC_CACAO)
+#if !defined(ENABLE_GC_BOEHM)
f->value = NEW(imm_union);
#else
f->value = GCNEW_UNCOLLECTABLE(imm_union, 1);
void field_free(fieldinfo *f)
{
- /* empty */
+ /* free memory for fields which have a value */
+
+ if (f->value)
+#if defined(ENABLE_GC_BOEHM)
+ if (f->type != TYPE_ADR)
+#endif
+ FREE(f->value, imm_union);
}