Author: heimdall
Date: Mon Aug 15 14:42:38 2005
New Revision: 8970

Modified:
   branches/gmc/include/parrot/pobj.h
   branches/gmc/include/parrot/smallobject.h
   branches/gmc/src/gc_gmc.c
   branches/gmc/src/headers.c
Log:
Huge bug corrected in allocation. miniparrot does not segfault anymore but make 
test is *bad*

Modified: branches/gmc/include/parrot/pobj.h
==============================================================================
--- branches/gmc/include/parrot/pobj.h  (original)
+++ branches/gmc/include/parrot/pobj.h  Mon Aug 15 14:42:38 2005
@@ -290,13 +290,14 @@ typedef struct PMC_EXT PMC_EXT;
 #define PMC_sync(pmc)         PMC_ext_checked(pmc)->_synchronize
 #define PMC_union(pmc)       (pmc)->obj.u
 
-#endif /* PARROT_GC_GMC */
 
 /* macro for accessing union data */
 #define next_for_GC pmc_ext->_next_for_GC
 #define metadata pmc_ext->_metadata
 #define synchronize pmc_ext->_synchronize
 
+#endif /* PARROT_GC_GMC */
+
 /* PObj flags */
 typedef enum PObj_enum {
     /* This first 8 flags may be used privately by a Parrot Object.

Modified: branches/gmc/include/parrot/smallobject.h
==============================================================================
--- branches/gmc/include/parrot/smallobject.h   (original)
+++ branches/gmc/include/parrot/smallobject.h   Mon Aug 15 14:42:38 2005
@@ -136,18 +136,7 @@ typedef enum gmc_flags {
     Gmc_private_5_FLAG = 1 << 5,
     Gmc_private_6_FLAG = 1 << 6,
     Gmc_has_ext_FLAG = 1 << 7, /*  flag */
-
-    /* Type flags for most common PMCs */
-    Gmc_PMC_is_int_FLAG      = 1 << 8,
-    Gmc_PMC_is_float_FLAG    = 1 << 9,
-    Gmc_PMC_is_array_FLAG    = 1 << 10,
-    Gmc_PMC_is_hash_FLAG     = 1 << 11,
-    Gmc_PMC_is_object_FLAG   = 1 << 12,
-    Gmc_PMC_is_class_FLAG    = 1 << 13,
-    Gmc_PMC_is_function_FLAG = 1 << 14,
-
-    /* Type that is not in the previous values. Check for size in the vtable. 
*/
-    Gmc_PMC_is_anything_else = 1 << 15,
+    Gmc_is_pmc_FLAG = 1 << 8, /* True if the object is a PMC, is a PObj if 
not. */
 } Gmc_flags;
 
 

Modified: branches/gmc/src/gc_gmc.c
==============================================================================
--- branches/gmc/src/gc_gmc.c   (original)
+++ branches/gmc/src/gc_gmc.c   Mon Aug 15 14:42:38 2005
@@ -22,9 +22,6 @@ gc_gmc_get_PMC_size(Interp *interpreter,
     return vtable->size;
 }
 
-void gdb_dummy_func(void) {
-    fprintf(stderr, "Called dummy_gdb_func\n");
-}
 
 /* Allocates and initializes a generation, but does not plug it to the pool 
yet. */
 static Gc_gmc_gen *
@@ -115,8 +112,8 @@ gc_gmc_test_linked_list_gen(Interp *inte
     for (j = 0, gen = gc->old_lst; gen; j++, gen = gen->prev);
     if (i != gc->nb_gen || j != gc->nb_gen)
     {
-       fprintf(stderr, "Invalid linked list : %d elem instead of %d\n", i, 
gc->nb_gen);
-       fprintf(stderr, "Invalid linked list : %d elem instead of %d\n", j, 
gc->nb_gen);
+       fprintf(stderr, "Invalid linked list\n");
+       fprintf(stderr, "Invalid linked list\n");
        gen = NULL;
        *(int*)gen = 54;
     } else
@@ -283,6 +280,8 @@ gc_gmc_get_free_object_of_size(Interp *i
 {
   void *pmc_body;
   void *pmc;
+  void *ptr;
+  UINTVAL i;
   Gc_gmc *gc = pool->gc;
   Gc_gmc_gen *gen, *gen_ref;
 
@@ -315,12 +314,11 @@ gc_gmc_get_free_object_of_size(Interp *i
       gen = gen->next;
   }
 
-  gc->old_lst = gen;
-
   pmc_body = gen->fst_free;
   gen->fst_free = (void*)((char*)pmc_body + size);
   gen->remaining -= size;
   gen->alloc_obj++;
+  memset(pmc_body, 0, size);
 #ifdef GMC_DEBUG
   fprintf (stderr,"Allocated size %d in gen %p, first: %p, remaining %d, 
next_gen: %p, fst_free: %p, lim: %p\n", size, gen, gen->first, gen->remaining, 
gen->next, gen->fst_free, (char*)gen->fst_free + gen->remaining);
 #endif
@@ -336,18 +334,6 @@ gc_gmc_get_free_object_of_size(Interp *i
       (*pool->more_objects) (interpreter, pool);
   
   pmc = (PMC*)pool->free_list;
-#ifdef GMC_DEBUG
-  fprintf (stderr, "===============\n");
-  fprintf (stderr, "PMC found at %p\n", 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;
   --pool->num_free_objects;
   PMC_body((PMC*)pmc) = Gmc_PMC_hdr_get_BODY(pmc_body);
@@ -355,6 +341,7 @@ gc_gmc_get_free_object_of_size(Interp *i
   Gmc_PMC_hdr_get_PMC((Gc_gmc_hdr*)pmc_body) = pmc;
   PObj_get_FLAGS((PObj*)pmc) = 0;
 
+
   return pmc;
 }
 
@@ -366,8 +353,10 @@ void *
 gc_gmc_get_free_object(Interp *interpreter,
     struct Small_Object_Pool *pool)
 {
-    size_t size = sizeof(Gc_gmc_hdr) + sizeof(default_body);
-    return gc_gmc_get_free_object_of_size(interpreter, pool, size, 0);
+    size_t size = sizeof(Gc_gmc_hdr) + sizeof(pobj_body);
+    PMC *pmc = gc_gmc_get_free_object_of_size(interpreter, pool, size, 0);
+    Gmc_PMC_flag_CLEAR(is_pmc,pmc);
+    return pmc;
 }
 
 
@@ -387,15 +376,21 @@ gc_gmc_get_free_typed_object(Interp *int
     size_t size = sizeof(Gc_gmc_hdr) + gc_gmc_get_PMC_size(interpreter, 
base_type);
     VTABLE *vtable = Parrot_base_vtables[base_type];
     INTVAL aggreg = vtable->flags & VTABLE_PMC_NEEDS_EXT;
-    
-    return gc_gmc_get_free_object_of_size (interpreter, pool, size, aggreg);
+    PMC *pmc = gc_gmc_get_free_object_of_size (interpreter, pool, size, 
aggreg);
+    Gmc_PMC_flag_SET(is_pmc, pmc);
+    return pmc;
 }
 
 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, 
sizeof(Gc_gmc_hdr) + size, 0);
+    PMC *pmc = gc_gmc_get_free_object_of_size (interpreter, pool, 
sizeof(Gc_gmc_hdr) + size, 0);
+    if (size == sizeof(pobj_body))
+       Gmc_PMC_flag_CLEAR(is_pmc, pmc);
+    else
+       Gmc_PMC_flag_SET(is_pmc, pmc);
+    return pmc;
 }
     
 
@@ -403,6 +398,7 @@ static void
 gc_gmc_copy_gen (Gc_gmc_gen *from, Gc_gmc_gen *dest)
 {
     INTVAL offset = (char*)from->fst_free - (char*)from->first;
+    Gc_gmc_hdr *ptr;
     dest->fst_free = (void*)((char*)dest->first + offset);
     dest->remaining = from->remaining;
     dest->IGP = from->IGP;
@@ -411,6 +407,15 @@ gc_gmc_copy_gen (Gc_gmc_gen *from, Gc_gm
     fprintf (stderr, "Copying %p to %p\n", from->first, dest->first);
 #endif
     memcpy(dest->first, from->first, GMC_GEN_SIZE);
+    ptr = dest->first;
+    while ((UINTVAL)ptr < (UINTVAL)dest->fst_free)
+    {
+       PMC_body(Gmc_PMC_hdr_get_PMC(ptr)) = Gmc_PMC_hdr_get_BODY(ptr);
+       if (Gmc_PMC_hdr_flag_TEST(is_pmc,ptr))
+           ptr = (Gc_gmc_hdr*)((char*)ptr + 
Gmc_PMC_hdr_get_PMC(ptr)->vtable->size + sizeof(Gc_gmc_hdr));
+       else
+           ptr = (Gc_gmc_hdr*)((char*)ptr + sizeof(Gc_gmc_hdr) + 
sizeof(pobj_body));
+    }
 }
 
 static void
@@ -500,7 +505,7 @@ gc_gmc_more_objects(Interp *interpreter,
        struct Small_Object_Pool *pool)
 {
 #define NUM_NEW_OBJ 512
-        void *fst = mem_sys_allocate(NUM_NEW_OBJ * pool->object_size);
+        void *fst = mem_sys_allocate_zeroed(NUM_NEW_OBJ * pool->object_size);
        int i;
        char *obj;
        for (i = 0, obj = (char*)fst; i < NUM_NEW_OBJ; i++, obj += 
pool->object_size)

Modified: branches/gmc/src/headers.c
==============================================================================
--- branches/gmc/src/headers.c  (original)
+++ branches/gmc/src/headers.c  Mon Aug 15 14:42:38 2005
@@ -54,7 +54,7 @@ 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));
+    PObj *buffer = pool->get_free_object(interpreter, pool);
 #else
     PObj *buffer = pool->get_free_object(interpreter, pool);
 #endif

Reply via email to