Author: heimdall
Date: Sun Aug 14 06:14:26 2005
New Revision: 8959
Modified:
branches/gmc/classes/default.pmc
branches/gmc/include/parrot/pobj.h
branches/gmc/include/parrot/smallobject.h
branches/gmc/lib/Parrot/Pmc2c.pm
branches/gmc/src/gc_gmc.c
branches/gmc/src/headers.c
branches/gmc/src/jit_debug.c
branches/gmc/src/memory.c
branches/gmc/src/pmc.c
branches/gmc/src/pmc_freeze.c
Log:
Various bugfixes
Modified: branches/gmc/classes/default.pmc
==============================================================================
--- branches/gmc/classes/default.pmc (original)
+++ branches/gmc/classes/default.pmc Sun Aug 14 06:14:26 2005
@@ -188,11 +188,10 @@ C<initializer> if it is supplied, otherw
void init_pmc_props (PMC* initializer, PMC* properties) {
#if PARROT_GC_GMC
if (!Gmc_has_PMC_EXT_TEST(SELF))
- Gmc_PMC_flag_SET(has_ext,SELF);
#else
if (!SELF->pmc_ext)
- add_pmc_ext(INTERP, SELF);
#endif
+ add_pmc_ext(INTERP, SELF);
DOD_WRITE_BARRIER(INTERP, SELF, NULL, properties);
PMC_metadata(SELF) = properties;
if (initializer)
@@ -283,11 +282,10 @@ Sets the property for C<*key> to C<*valu
PMC *prop;
#if PARROT_GC_GMC
if (!Gmc_has_PMC_EXT_TEST(SELF))
- Gmc_PMC_flag_SET(has_ext,SELF);
#else
if (!SELF->pmc_ext)
- add_pmc_ext(INTERP, SELF);
#endif
+ add_pmc_ext(INTERP, SELF);
/* first make new hash */
PMC_metadata(SELF) = prop =
pmc_new_noinit(INTERP, enum_class_PerlHash);
@@ -337,11 +335,10 @@ Returns the PMC's properties.
PMC* getprops() {
#if PARROT_GC_GMC
if (!Gmc_has_PMC_EXT_TEST(SELF))
- Gmc_PMC_flag_SET(has_ext,SELF);
#else
if (!SELF->pmc_ext)
- add_pmc_ext(INTERP, SELF);
#endif
+ add_pmc_ext(INTERP, SELF);
if (!PMC_metadata(SELF)) {
PMC *prop;
PMC_metadata(SELF) = prop =
@@ -955,11 +952,10 @@ Initializes the PMC during unarchiving.
if (info->extra_flags == EXTRA_IS_PROP_HASH) {
#if PARROT_GC_GMC
if (!Gmc_has_PMC_EXT_TEST(SELF))
- Gmc_PMC_flag_SET(has_ext,SELF);
#else
if (!SELF->pmc_ext)
- add_pmc_ext(INTERP, SELF);
#endif
+ add_pmc_ext(INTERP, SELF);
info->thaw_ptr = &PMC_metadata(SELF);
info->container = SELF;
(info->visit_pmc_now)(INTERP, PMC_metadata(SELF), info);
Modified: branches/gmc/include/parrot/pobj.h
==============================================================================
--- branches/gmc/include/parrot/pobj.h (original)
+++ branches/gmc/include/parrot/pobj.h Sun Aug 14 06:14:26 2005
@@ -93,6 +93,10 @@ typedef struct pobj_t {
/* TODO: Change to a real pmc_body type. */
typedef struct default_body {
UnionVal u;
+ Parrot_UInt flags;
+#if ! DISABLE_GC_DEBUG
+ UINTVAL _pobj_version;
+#endif
PMC *_metadata;
struct _Sync *_synchronize;
PMC *_next_for_GC;
@@ -101,19 +105,17 @@ typedef struct default_body {
#define PMC_BODY default_body
-
-/* Hack for the get_FLAGS macro to be happy. */
-typedef struct flags_holder {
+typedef struct pobj_body {
+ UnionVal u;
Parrot_UInt flags;
#if ! DISABLE_GC_DEBUG
UINTVAL _pobj_version;
#endif
-} flags_holder;
+} pobj_body;
typedef struct Buffer {
- PMC_BODY *body;
- flags_holder obj;
+ pobj_body *body;
} Buffer;
#else
@@ -158,6 +160,17 @@ typedef Buffer PObj;
* END DEPRECATED BUFFER ACCESSORS
*/
+#if PARROT_GC_GMC
+
+#if ! DISABLE_GC_DEBUG
+/* BEGIN DEPRECATED POBJ ACCESSOR */
+# define pobj_version body->_pobj_version
+/* END DEPRECATED POBJ ACCESSOR */
+# define PObj_version(pobj) (pobj)->body->_pobj_version
+#endif /* ! DISABLE_GC_DEBUG */
+
+#else
+
#if ! DISABLE_GC_DEBUG
/* BEGIN DEPRECATED POBJ ACCESSOR */
# define pobj_version obj._pobj_version
@@ -165,6 +178,8 @@ typedef Buffer PObj;
# define PObj_version(pobj) (pobj)->obj._pobj_version
#endif /* ! DISABLE_GC_DEBUG */
+#endif /* PARROT_GC_GMC */
+
typedef enum {
enum_stringrep_unknown = 0,
enum_stringrep_one = 1,
@@ -175,7 +190,6 @@ typedef enum {
struct parrot_string_t {
#if PARROT_GC_GMC
PMC_BODY *body;
- flags_holder obj;
#else
pobj_t obj;
#endif
@@ -201,7 +215,6 @@ struct parrot_string_t {
struct PMC {
#if PARROT_GC_GMC
PMC_BODY *body;
- flags_holder obj;
#else
pobj_t obj;
#endif
@@ -477,7 +490,11 @@ typedef enum PObj_enum {
#endif /* ARENA_DOD_FLAGS */
+#if PARROT_GC_GMC
+#define PObj_get_FLAGS(o) ((o)->body->flags)
+#else
#define PObj_get_FLAGS(o) ((o)->obj.flags)
+#endif
#define PObj_flag_TEST(flag, o) (PObj_get_FLAGS(o) & PObj_ ## flag ## _FLAG)
Modified: branches/gmc/include/parrot/smallobject.h
==============================================================================
--- branches/gmc/include/parrot/smallobject.h (original)
+++ branches/gmc/include/parrot/smallobject.h Sun Aug 14 06:14:26 2005
@@ -42,6 +42,8 @@ typedef void (*add_free_object_fn_type)(
#if PARROT_GC_GMC
typedef void * (*get_free_typed_object_fn_type)(Interp *,
struct Small_Object_Pool *, INTVAL);
+typedef void * (*get_free_sized_object_fn_type)(Interp *,
+ struct Small_Object_Pool *, size_t);
#endif
typedef void * (*get_free_object_fn_type)(Interp *,
struct Small_Object_Pool *);
@@ -239,6 +241,7 @@ struct Small_Object_Pool {
add_free_object_fn_type add_free_object;
#if PARROT_GC_GMC
get_free_typed_object_fn_type get_free_typed_object;
+ get_free_sized_object_fn_type get_free_sized_object;
#endif
get_free_object_fn_type get_free_object;
alloc_objects_fn_type alloc_objects;
Modified: branches/gmc/lib/Parrot/Pmc2c.pm
==============================================================================
--- branches/gmc/lib/Parrot/Pmc2c.pm (original)
+++ branches/gmc/lib/Parrot/Pmc2c.pm Sun Aug 14 06:14:26 2005
@@ -845,7 +845,7 @@ Parrot_${classname}_class_init(Parrot_In
$enum_name, /* base_type */
NULL, /* whoami */
$vtbl_flag, /* flags */
- 24, /* size of pmc_body */
+ 32, /* size of pmc_body */
NULL, /* does_str */
NULL, /* isa_str */
NULL, /* class */
Modified: branches/gmc/src/gc_gmc.c
==============================================================================
--- branches/gmc/src/gc_gmc.c (original)
+++ branches/gmc/src/gc_gmc.c Sun Aug 14 06:14:26 2005
@@ -5,6 +5,7 @@
static void gc_gmc_add_free_object(Interp*, struct Small_Object_Pool*, void*);
static void *gc_gmc_get_free_typed_object(Interp*, struct Small_Object_Pool*,
INTVAL);
+static void *gc_gmc_get_free_sized_object(Interp*, struct Small_Object_Pool*,
size_t);
static void *gc_gmc_get_free_object(Interp*, struct Small_Object_Pool*);
static void gc_gmc_alloc_objects(Interp*, struct Small_Object_Pool*);
static void gc_gmc_more_objects(Interp*, struct Small_Object_Pool*);
@@ -102,6 +103,7 @@ gc_gmc_pool_init(Interp *interpreter, st
pool->add_free_object = gc_gmc_add_free_object;
pool->get_free_object = gc_gmc_get_free_object;
pool->get_free_typed_object = gc_gmc_get_free_typed_object;
+ pool->get_free_sized_object = gc_gmc_get_free_sized_object;
pool->alloc_objects = gc_gmc_alloc_objects;
pool->more_objects = gc_gmc_more_objects;
@@ -127,8 +129,8 @@ gc_gmc_pool_init(Interp *interpreter, st
/* Separate the generations in two halves : one is young (= aggregate
* objects), the other is old (non-aggregate objects). */
for (i = 0, gen = gc->yng_fst; i < (GMC_GEN_INIT_NUMBER/2); i++, gen =
gen->next);
- gc->old_fst = gen->next;
- gc->old_lst = gen->next;
+ gc->old_fst = gen;
+ gc->old_lst = gen;
/* Now cut the bridges between these two parts. */
gen->prev->next = NULL;
gen->prev = NULL;
@@ -247,15 +249,20 @@ gc_gmc_get_free_object_of_size(Interp *i
void *pmc_body;
void *pmc;
Gc_gmc *gc = pool->gc;
- Gc_gmc_gen *gen;
-
+ Gc_gmc_gen *gen, *gen_ref;
/* Allocate the pmc_body */
gen = (aggreg) ? gc->yng_lst : gc->old_lst;
/* Should we use the next generation ? */
if (size > gen->remaining)
+ {
+ if (aggreg)
+ gc->yng_lst = gen->next;
+ else
+ gc->old_lst = gen->next;
gen = gen->next;
+ }
/* Do we need more generations ? */
if (!gen)
@@ -265,12 +272,18 @@ gc_gmc_get_free_object_of_size(Interp *i
/* Should we use the next generation ? */
if (size > gen->remaining)
+ {
+ if (aggreg)
+ gc->yng_lst = gen->next;
+ else
+ gc->old_lst = gen->next;
gen = gen->next;
+ }
gc->old_lst = gen;
pmc_body = gen->fst_free;
- gen->fst_free = (void*)((INTVAL)pmc_body + size);
+ gen->fst_free = (void*)((char*)pmc_body + size);
gen->remaining -= size;
#ifdef GMC_DEBUG
@@ -283,12 +296,17 @@ gc_gmc_get_free_object_of_size(Interp *i
if (!pool->free_list)
(*pool->more_objects) (interpreter, pool);
- pmc = pool->free_list;
+ pmc = (PMC*)pool->free_list;
#ifdef GMC_DEBUG
fprintf (stderr, "===============\n");
fprintf (stderr, "PMC found at %p\n", pmc);
- fprintf (stderr, "Next PMC at %p\n", *(void**)pmc);
- fprintf (stderr, "Next Next PMC at %p\n", **(void***)pmc);
+ if (pmc)
+ {
+ fprintf (stderr, "Next PMC at %p\n", *(void**)pmc);
+ if (*(void**)pmc)
+ fprintf (stderr, "Next Next PMC at %p\n", **(void***)pmc);
+ }
+ fprintf (stderr, "pool->free_list = %p\n", pool->free_list);
fprintf (stderr, "---------------\n");
#endif
pool->free_list = *(void **)pmc;
@@ -296,20 +314,20 @@ gc_gmc_get_free_object_of_size(Interp *i
PMC_body((PMC*)pmc) = Gmc_PMC_hdr_get_BODY(pmc_body);
Gmc_PMC_hdr_get_PMC((Gc_gmc_hdr*)pmc_body) = pmc;
-
+ PObj_get_FLAGS((PObj*)pmc) = 0;
return pmc;
}
-/* Here we allocate a PObj, as it is non-typed. */
+/* Here we allocate a default PMC, as it is non-typed. */
/* This function should not be called anywhere if possible. */
void *
gc_gmc_get_free_object(Interp *interpreter,
struct Small_Object_Pool *pool)
{
- size_t size = sizeof(Gc_gmc_hdr) + sizeof(PObj);
+ size_t size = sizeof(Gc_gmc_hdr) + sizeof(default_body);
return gc_gmc_get_free_object_of_size(interpreter, pool, size, 0);
}
@@ -334,6 +352,14 @@ gc_gmc_get_free_typed_object(Interp *int
return gc_gmc_get_free_object_of_size (interpreter, pool, size, aggreg);
}
+static void *
+gc_gmc_get_free_sized_object(Interp *interpreter,
+ struct Small_Object_Pool *pool, size_t size)
+{
+ return gc_gmc_get_free_object_of_size (interpreter, pool, size, 0);
+}
+
+
static void
gc_gmc_copy_gen (Gc_gmc_gen *from, Gc_gmc_gen *dest)
{
@@ -347,7 +373,9 @@ gc_gmc_copy_gen (Gc_gmc_gen *from, Gc_gm
static void
gc_gmc_gen_free(Gc_gmc_gen *gen)
{
+ fprintf(stderr, "Freeing gen->first %p\n", gen->first);
mem_sys_free(gen->first);
+ fprintf(stderr, "Freeing gen %p\n", gen);
mem_sys_free(gen);
}
@@ -380,19 +408,21 @@ gc_gmc_more_pmc_bodies (Interp *interpre
gc_gmc_insert_gen (interpreter, dummy_gc, gen);
}
- for (gen = dummy_gc->yng_fst, ogen = gc->yng_fst; ogen->next; gen =
gen->next)
+ for (gen = dummy_gc->yng_fst, ogen = gc->yng_fst; ogen; gen = gen->next)
{
+ fprintf (stderr, "Old_gen: %p, old_gen->next: %p\n", ogen, ogen->next);
ogen_nxt = ogen->next;
gc_gmc_copy_gen(ogen,gen);
gc_gmc_gen_free(ogen);
ogen = ogen_nxt;
}
dummy_gc->yng_lst = gen;
+ fprintf(stderr, "First half\n");
for (gen = dummy_gc->yng_fst, i = 0; i < (nb_gen/2); i++, gen = gen->next);
- dummy_gc->old_fst = gen->next;
- gen->next->prev = NULL;
- gen->next = NULL;
+ dummy_gc->old_fst = gen;
+ gen->prev->next = NULL;
+ gen->prev = NULL;
for (gen = dummy_gc->old_fst, ogen = gc->old_fst; ogen; gen = gen->next)
{
@@ -411,7 +441,7 @@ gc_gmc_more_pmc_bodies (Interp *interpre
mem_sys_free(dummy_gc);
-#ifdef GMC_DEBUG
+#ifndef GMC_DEBUG
fprintf(stderr, "Done with allocation\n");
#endif
}
@@ -429,7 +459,7 @@ gc_gmc_more_objects(Interp *interpreter,
char *obj;
for (i = 0, obj = (char*)fst; i < NUM_NEW_OBJ; i++, obj +=
pool->object_size)
*(void**)obj = obj + pool->object_size;
- *(void**)obj = NULL;
+ *(void**)(obj - pool->object_size) = NULL;
pool->free_list = fst;
pool->num_free_objects += NUM_NEW_OBJ;
#ifndef GMC_DEBUG
Modified: branches/gmc/src/headers.c
==============================================================================
--- branches/gmc/src/headers.c (original)
+++ branches/gmc/src/headers.c Sun Aug 14 06:14:26 2005
@@ -53,7 +53,11 @@ static void *
get_free_buffer(Interp *interpreter,
struct Small_Object_Pool *pool)
{
+#if PARROT_GC_GMC
+ PObj *buffer = pool->get_free_sized_object(interpreter, pool,
sizeof(pobj_body));
+#else
PObj *buffer = pool->get_free_object(interpreter, pool);
+#endif
/* don't mess around with flags */
PObj_bufstart(buffer) = NULL;
@@ -247,8 +251,8 @@ static PMC_EXT * new_pmc_ext(Parrot_Inte
void gc_gmc_tmp_ext_init(Parrot_Interp *, PMC *);
#endif
-PMC *
-new_pmc_header(Interp *interpreter, UINTVAL flags)
+static PMC *
+new_pmc_alloc_header(Interp *interpreter, UINTVAL flags, INTVAL is_typed,
INTVAL base_type)
{
struct Small_Object_Pool *pool;
PMC *pmc;
@@ -259,7 +263,10 @@ new_pmc_header(Interp *interpreter, UINT
#if ARENA_DOD_FLAGS
assert(sizeof(Dead_PObj) <= sizeof(PMC));
#endif
- pmc = pool->get_free_object(interpreter, pool);
+ if (is_typed)
+ pmc = pool->get_free_typed_object(interpreter, pool, base_type);
+ else
+ pmc = pool->get_free_object(interpreter, pool);
/* clear flags, set is_PMC_FLAG */
if (flags & PObj_is_PMC_EXT_FLAG) {
#if ARENA_DOD_FLAGS
@@ -269,8 +276,7 @@ new_pmc_header(Interp *interpreter, UINT
flags |= PObj_is_special_PMC_FLAG;
#endif
#if PARROT_GC_GMC
- Gmc_PMC_flag_SET(has_ext,pmc);
- PObj_is_PMC_EXT_SET(pmc);
+ add_pmc_ext(interpreter, pmc);
#else
pmc->pmc_ext = new_pmc_ext(interpreter);
#endif /* PARROT_GC_GMC */
@@ -288,6 +294,7 @@ new_pmc_header(Interp *interpreter, UINT
#endif
#if PARROT_GC_GMC
+ PObj_get_FLAGS(pmc) = 0;
PMC_next_for_GC(pmc) = NULL;
PMC_metadata(pmc) = NULL;
PMC_sync(pmc) = NULL;
@@ -301,6 +308,12 @@ new_pmc_header(Interp *interpreter, UINT
return pmc;
}
+PMC *
+new_pmc_header(Interp *interpreter, UINTVAL flags)
+{
+ return new_pmc_alloc_header(interpreter, flags, 0, 0);
+}
+
#if PARROT_GC_GMC
@@ -319,57 +332,10 @@ Get a header for a pmc of type base_type
PMC *
new_pmc_typed_header(Interp *interpreter, UINTVAL flags, INTVAL base_type)
{
- struct Small_Object_Pool *pool;
- PMC *pmc;
-
- pool = flags & PObj_constant_FLAG ?
- interpreter->arena_base->constant_pmc_pool :
- interpreter->arena_base->pmc_pool;
-#if ARENA_DOD_FLAGS
- assert(sizeof(Dead_PObj) <= sizeof(PMC));
-#endif
- pmc = pool->get_free_typed_object(interpreter, pool, base_type);
- /* clear flags, set is_PMC_FLAG */
- if (flags & PObj_is_PMC_EXT_FLAG) {
-#if ARENA_DOD_FLAGS
- *((Dead_PObj*)pmc)->arena_dod_flag_ptr |=
- (PObj_is_special_PMC_FLAG << ((Dead_PObj*)pmc)->flag_shift);
-#else
- flags |= PObj_is_special_PMC_FLAG;
-#endif
-#if PARROT_GC_GMC
- Gmc_PMC_flag_SET(has_ext,pmc);
- PObj_is_PMC_EXT_SET(pmc);
-#else
- pmc->pmc_ext = new_pmc_ext(interpreter);
-#endif
- if (flags & PObj_is_PMC_shared_FLAG) {
- PMC_sync(pmc) = mem_internal_allocate(sizeof(*PMC_sync(pmc)));
- PMC_sync(pmc)->owner = interpreter;
- MUTEX_INIT(PMC_sync(pmc)->pmc_lock);
- }
- }
- else
-#if PARROT_GC_GMC
- Gmc_PMC_flag_CLEAR(has_ext,pmc);
-#else
- pmc->pmc_ext = NULL;
-#endif
-
-#if PARROT_GC_GMC
- PMC_next_for_GC(pmc) = NULL;
- PMC_metadata(pmc) = NULL;
- PMC_sync(pmc) = NULL;
- PMC_data(pmc) = NULL;
-#endif
- PObj_get_FLAGS(pmc) |= PObj_is_PMC_FLAG|flags;
- pmc->vtable = NULL;
-#if ! PMC_DATA_IN_EXT
- PMC_data(pmc) = NULL;
-#endif
- return pmc;
+ return new_pmc_alloc_header(interpreter, flags, 1, base_type);
}
+
#endif /* PARROT_GC_GMC */
@@ -402,8 +368,6 @@ new_pmc_ext(Interp *interpreter)
return ptr;
}
-# if ! PARROT_GC_GMC
-
/*
=item C<void
@@ -415,6 +379,17 @@ Adds a new C<PMC_EXT> to C<pmc>.
*/
+#if PARROT_GC_GMC
+
+void
+add_pmc_ext(Interp *interpreter, PMC *pmc)
+{
+ Gmc_PMC_flag_SET(has_ext,pmc);
+ PObj_is_PMC_EXT_SET(pmc);
+}
+
+#else
+
void
add_pmc_ext(Interp *interpreter, PMC *pmc)
{
Modified: branches/gmc/src/jit_debug.c
==============================================================================
--- branches/gmc/src/jit_debug.c (original)
+++ branches/gmc/src/jit_debug.c Sun Aug 14 06:14:26 2005
@@ -162,7 +162,11 @@ write_types(FILE *stabs)
BIT_OFFSET(STRING, obj.u._b._bufstart), BIT_SIZE(void*),
BIT_OFFSET(STRING, obj.u._b._buflen), BIT_SIZE(size_t),
#endif
+#if PARROT_GC_GMC
+ BIT_OFFSET(STRING, body->flags), BIT_SIZE(UINTVAL),
+#else
BIT_OFFSET(STRING, obj.flags), BIT_SIZE(UINTVAL),
+#endif
BIT_OFFSET(STRING, bufused), BIT_SIZE(UINTVAL),
BIT_OFFSET(STRING, strstart), BIT_SIZE(void*)
);
@@ -180,7 +184,11 @@ write_types(FILE *stabs)
/* PMC type */
fprintf(stabs, ".stabs \"PMC:T(0,%d)=s%d", i, BYTE_SIZE(PMC));
fprintf(stabs, "obj:(0,%d),%d,%d;",
+#if PARROT_GC_GMC
+ i + 1, BIT_OFFSET(PMC, body), BIT_SIZE(pobj_t));
+#else
i + 1, BIT_OFFSET(PMC, obj), BIT_SIZE(pobj_t));
+#endif
fprintf(stabs, "vtable:*(0,%d),%d,%d;",
i + 3, BIT_OFFSET(PMC, vtable), BIT_SIZE(void*));
#if ! PMC_DATA_IN_EXT
Modified: branches/gmc/src/memory.c
==============================================================================
--- branches/gmc/src/memory.c (original)
+++ branches/gmc/src/memory.c Sun Aug 14 06:14:26 2005
@@ -154,6 +154,11 @@ mem_sys_free(void *from)
#ifdef DETAIL_MEMORY_DEBUG
printf("Freed %p\n", from);
#endif
+ if (from == 0x082a91d0)
+ {
+ from = NULL;
+ *(int*)NULL = 54;
+ }
free(from);
}
Modified: branches/gmc/src/pmc.c
==============================================================================
--- branches/gmc/src/pmc.c (original)
+++ branches/gmc/src/pmc.c Sun Aug 14 06:14:26 2005
@@ -117,11 +117,7 @@ pmc_reuse(Interp *interpreter, PMC *pmc,
if (!has_ext) {
/* If we need an ext area, go allocate one */
-#if PARROT_GC_GMC
- Gmc_PMC_flag_SET(has_ext,pmc);
-#else
add_pmc_ext(interpreter, pmc);
-#endif
}
new_flags = PObj_is_PMC_EXT_FLAG;
}
Modified: branches/gmc/src/pmc_freeze.c
==============================================================================
--- branches/gmc/src/pmc_freeze.c (original)
+++ branches/gmc/src/pmc_freeze.c Sun Aug 14 06:14:26 2005
@@ -570,11 +570,7 @@ static void
pmc_add_ext(Parrot_Interp interpreter, PMC *pmc)
{
if (pmc->vtable->flags & VTABLE_PMC_NEEDS_EXT)
-#if PARROT_GC_GMC
- Gmc_PMC_flag_SET(has_ext,pmc);
-#else
add_pmc_ext(interpreter, pmc);
-#endif
}
/*