Here's another proposed patch for testing on various platforms. I'm trying to
get rid of some dodgy casts (which likely don't help C++ and processors with
stricter alignment than 32-bit x86). I'd also like to remove unnecessary
members from a few structs. This is the next step.
Are there any weird errors or unexpected crashes on anything more exotic than
32-bit x86 GNU/Linux?
-- c
=== include/parrot/pobj.h
==================================================================
--- include/parrot/pobj.h (revision 27223)
+++ include/parrot/pobj.h (local)
@@ -41,14 +41,14 @@
/* Parrot Object - base class for all others */
typedef struct pobj_t {
+ Parrot_UInt flags;
UnionVal u;
- Parrot_UInt flags;
} pobj_t;
/* plain Buffer is the smallest Parrot Obj */
typedef struct Buffer {
+ Parrot_UInt flags;
UnionVal cache;
- Parrot_UInt flags;
} Buffer;
typedef Buffer PObj;
@@ -118,8 +118,8 @@
} parrot_string_representation_t;
struct parrot_string_t {
+ Parrot_UInt flags;
UnionVal cache;
- Parrot_UInt flags;
char *strstart;
UINTVAL bufused;
UINTVAL strlen;
@@ -136,8 +136,8 @@
/* note that cache and flags are isomorphic with Buffer and PObj */
struct PMC {
+ Parrot_UInt flags;
UnionVal cache;
- Parrot_UInt flags;
VTABLE *vtable;
DPOINTER *data;
struct PMC_EXT *pmc_ext;
=== include/parrot/stacks.h
==================================================================
--- include/parrot/stacks.h (revision 27223)
+++ include/parrot/stacks.h (local)
@@ -25,8 +25,8 @@
} Stack_Entry_t;
typedef struct Stack_Chunk {
+ Parrot_UInt flags;
UnionVal cache;
- Parrot_UInt flags;
int size;
const char *name;
struct Stack_Chunk *prev;
=== src/gc/smallobject.c
==================================================================
--- src/gc/smallobject.c (revision 27223)
+++ src/gc/smallobject.c (local)
@@ -415,9 +415,6 @@
Small_Object_Pool * const pool =
mem_internal_allocate_zeroed_typed(Small_Object_Pool);
- pool->last_Arena = NULL;
- pool->free_list = NULL;
- pool->mem_pool = NULL;
pool->object_size = object_size;
pool->objects_per_alloc = objects_per_alloc;
@@ -505,16 +502,13 @@
/* XXX num_free_objects doesn't seem to be accounted correctly in, e.g.,
* the PMC_EXT pool.
*/
-#if 0
- if (source->num_free_objects == source->total_objects) {
+ if (source->num_free_objects == source->total_objects)
return;
- }
-#endif
/* PARROT_ASSERT(source->total_objects); */
PARROT_ASSERT(dest->object_size == source->object_size);
- PARROT_ASSERT((dest->name == NULL && source->name == NULL) ||
- STREQ(dest->name, source->name));
+ PARROT_ASSERT((!dest->name && !source->name)
+ || STREQ(dest->name, source->name));
dest->total_objects += source->total_objects;
@@ -523,9 +517,9 @@
free_list_end = &dest->free_list;
while (*free_list_end)
- free_list_end = (void **)*free_list_end;
+ free_list_end = &PMC_struct_val((PObj *)free_list_end);
- *free_list_end = source->free_list;
+ PMC_struct_val((PObj *)free_list_end) = source->free_list;
/* now append source arenas */
cur_arena = source->last_Arena;
=== src/headers.c
==================================================================
--- src/headers.c (revision 27223)
+++ src/headers.c (local)
@@ -258,12 +258,11 @@
memset(sized_pools + num_old, 0, sizeof (void *) * (num_new - num_old));
interp->arena_base->sized_header_pools = sized_pools;
- interp->arena_base->num_sized = num_new;
+ interp->arena_base->num_sized = num_new;
}
- if (sized_pools[idx] == NULL) {
+ if (sized_pools[idx] == NULL)
sized_pools[idx] = new_bufferlike_pool(interp, buffer_size);
- }
return sized_pools[idx];
}
@@ -935,12 +934,11 @@
source_arena->pmc_ext_pool);
for (i = 0; i < source_arena->num_sized; ++i) {
- if (!source_arena->sized_header_pools[i]) {
+ if (!source_arena->sized_header_pools[i])
continue;
- }
- if (i >= dest_arena->num_sized ||
- !dest_arena->sized_header_pools[i]) {
+ if (i >= dest_arena->num_sized
+ || !dest_arena->sized_header_pools[i]) {
Small_Object_Pool *ignored = make_bufferlike_pool(dest_interp,
i * sizeof (void *) + sizeof (Buffer));
UNUSED(ignored);