Author: heimdall
Date: Thu Aug 11 16:59:15 2005
New Revision: 8923
Modified:
branches/gmc/src/gc_gmc.c
Log:
No more 'previous prototypes undefined' warnings, get_free_object almost
complete
Modified: branches/gmc/src/gc_gmc.c
==============================================================================
--- branches/gmc/src/gc_gmc.c (original)
+++ branches/gmc/src/gc_gmc.c Thu Aug 11 16:59:15 2005
@@ -11,7 +11,7 @@ static void gc_gmc_more_objects(Interp*,
/* Determines the size of a PMC according to its base_type. */
-size_t
+static size_t
gc_gmc_get_PMC_size(Interp *interpreter, INTVAL base_type)
{
VTABLE *vtable = Parrot_base_vtables[base_type];
@@ -21,6 +21,15 @@ gc_gmc_get_PMC_size(Interp *interpreter,
}
+/* Determines if a PMC is an aggregate or not. */
+static INTVAL
+gc_gmc_is_aggreg_PMC(Interp *interpreter, INTVAL base_type)
+{
+ /* TODO: find it with the base_type. */
+ return 0;
+}
+
+
/* Allocates and initializes a generation, but does not plug it to the pool
yet. */
static Gc_gmc_gen *
gc_gmc_gen_init(Interp *interpreter)
@@ -162,7 +171,7 @@ gc_gmc_pool_deinit(Interp *interpreter,
}
-void gc_gmc_deinit(Interp *interpreter)
+static void gc_gmc_deinit(Interp *interpreter)
{
struct Arenas *arena_base = interpreter->arena_base;
@@ -170,7 +179,7 @@ void gc_gmc_deinit(Interp *interpreter)
}
-void gc_gmc_run(Interp *interpreter, int flags)
+static void gc_gmc_run(Interp *interpreter, int flags)
{
#ifdef GMC_DEBUG
fprintf (stderr, "GMC: Trying to run dod_run\n");
@@ -191,7 +200,7 @@ void Parrot_gc_gmc_init(Interp *interpre
/******************************* FAKE THINGS ********************************/
-void *
+static void *
gc_gmc_fake_get_free_object(Interp *interpreter,
struct Small_Object_Pool *pool)
{
@@ -199,14 +208,14 @@ gc_gmc_fake_get_free_object(Interp *inte
}
-void *
-gc_gmc_get_free_typed_object(Interp *interpreter,
+static void *
+gc_gmc_fake_get_free_typed_object(Interp *interpreter,
struct Small_Object_Pool *pool, INTVAL base_type)
{
return NULL;
}
-void
+static void
gc_gmc_add_free_object(Interp *interpreter,
struct Small_Object_Pool *pool, void *to_add)
{
@@ -239,20 +248,15 @@ gc_gmc_more_objects(Interp *interpreter,
/******************************* REAL THINGS ********************************/
-
-/* The real thing, but not plugged yet */
-/* Here we allocate a PMC with NULL pmc_body, 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)
+static void *
+gc_gmc_get_free_object_of_size(Interp *interpreter,
+ struct Small_Object_Pool *pool, size_t size, INTVAL aggreg)
{
void *ptr;
Gc_gmc *gc = pool->gc;
+ Gc_gmc_gen *gen;
- /* This is a non-aggregate object. */
- Gc_gmc_gen *gen = gc->old_lst;
- size_t size = sizeof(Gc_gmc_hdr);
+ gen = (aggreg) ? gc->yng_lst : gc->old_lst;
/* Should we use the next generation ? */
if (size > gen->remaining)
@@ -265,13 +269,29 @@ gc_gmc_get_free_object(Interp *interpret
gc->old_lst = gen;
ptr = gen->fst_free;
- gen->fst_free = (INTVAL)ptr + size;
+ gen->fst_free = (void*)((INTVAL)ptr + size);
gen->remaining -= size;
+#ifdef GMC_DEBUG
+ fprintf (stderr, "Allocating %s PMC of size %d\n", (aggreg) ? "aggregate" :
"non-aggregate", size);
+#endif
+
return ptr;
}
-void
+
+/* Here we allocate a PObj, 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);
+ return gc_gmc_get_free_object_of_size(interpreter, pool, size, 0);
+}
+
+
+static void
gc_gmc_real_add_free_object(Interp *interpreter,
struct Small_Object_Pool *pool, void *to_add)
{
@@ -279,11 +299,15 @@ gc_gmc_real_add_free_object(Interp *inte
}
-void *
-gc_gmc_real_get_free_typed_object(Interp *interpreter,
+static void *
+gc_gmc_get_free_typed_object(Interp *interpreter,
struct Small_Object_Pool *pool, INTVAL base_type)
{
- return NULL;
+ Gc_gmc *gc = pool->gc;
+ size_t size = sizeof(Gc_gmc_hdr) + gc_gmc_get_PMC_size(interpreter,
base_type);
+ INTVAL aggreg = gc_gmc_is_aggreg_PMC(interpreter, base_type);
+
+ return gc_gmc_get_free_object_of_size (interpreter, pool, size, aggreg);
}