On Thu, 24 Apr 2008, Andy Dougherty wrote:

> On Wed, 23 Apr 2008, Andy Dougherty wrote:
> 
> > 2.  There are some casting and type-punning warnings that have, as their
> > ultimate cause, the STACK_DATAP() macro.  Getting rid of the
> > type-punning warning gives rise to a cast alignment warning.
> > 
> > Looking up a level, the only uses for that macro are to return
> > Stack_Entry_t pointers.  Why not be explicit about it in the definition
> > in include/parrot/stacks.h?  The attached patch tries to do just that.
> > I haven't tested this, but it looks like it ought to work.
> 
> Oops.  It won't work because I missed a level of indirection.

Ok.  Fixed.  This version avoids both type-punning and cast alignment 
warnings by declaring the 'data' element of a Stack_Chunk_t to be
of type Stack_Entry_t, since that's the only way it is ever used,
at least as far as I could tell.

> Oops.  I can only say I was fooled by the function signatures that these 
> functions returned 'void *', when they actually return 'void **'.

Now they return Stack_Entry_t *, since their return values always were
cast to that type anyway.

I have tested this on Solaris/SPARC with Sun's cc.  It introduces no
new warnings or failures that I can detect.  (The build actually doesn't
complete either with or without this patch, but it does get far enough
that I can run most of the core tests.)

diff -r -u parrot-x64-before/include/parrot/stacks.h 
parrot-x64/include/parrot/stacks.h
--- parrot-x64-before/include/parrot/stacks.h   2008-04-23 13:58:26.000000000 
-0400
+++ parrot-x64/include/parrot/stacks.h  2008-04-25 10:12:42.000000000 -0400
@@ -33,7 +33,7 @@
     Parrot_UInt         refcount;
     union { /* force appropriate alignment of 'data'.  If alignment
                is necessary, assume double is good enough.  27-04-2007. */
-        void *data;
+        Stack_Entry_t data;
 #if PARROT_PTR_ALIGNMENT > 1
         double d_dummy;
 #endif
@@ -158,7 +158,7 @@
 PARROT_API
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
-void* stack_prepare_pop(PARROT_INTERP, ARGMOD(Stack_Chunk_t **stack_p))
+Stack_Entry_t* stack_prepare_pop(PARROT_INTERP, ARGMOD(Stack_Chunk_t 
**stack_p))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
         FUNC_MODIFIES(*stack_p);
@@ -166,7 +166,7 @@
 PARROT_API
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
-void* stack_prepare_push(PARROT_INTERP, ARGMOD(Stack_Chunk_t **stack_p))
+Stack_Entry_t* stack_prepare_push(PARROT_INTERP, ARGMOD(Stack_Chunk_t 
**stack_p))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
         FUNC_MODIFIES(*stack_p);
diff -r -u parrot-x64-before/src/stack_common.c parrot-x64/src/stack_common.c
--- parrot-x64-before/src/stack_common.c        2008-04-25 07:55:48.000000000 
-0400
+++ parrot-x64/src/stack_common.c       2008-04-25 10:12:20.000000000 -0400
@@ -110,7 +110,7 @@
 
 /*
 
-=item C<void* stack_prepare_push>
+=item C<Stack_Entry_t* stack_prepare_push>
 
 Return a pointer, where new entries go for push.
 
@@ -121,7 +121,7 @@
 PARROT_API
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
-void*
+Stack_Entry_t*
 stack_prepare_push(PARROT_INTERP, ARGMOD(Stack_Chunk_t **stack_p))
 {
     Stack_Chunk_t * const chunk     = *stack_p;
@@ -138,7 +138,7 @@
 
 /*
 
-=item C<void* stack_prepare_pop>
+=item C<Stack_Entry_t* stack_prepare_pop>
 
 Return a pointer, where new entries are popped off.
 
@@ -149,7 +149,7 @@
 PARROT_API
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
-void*
+Stack_Entry_t*
 stack_prepare_pop(PARROT_INTERP, ARGMOD(Stack_Chunk_t **stack_p))
 {
     Stack_Chunk_t * const chunk = *stack_p;
diff -r -u parrot-x64-before/src/stacks.c parrot-x64/src/stacks.c
--- parrot-x64-before/src/stacks.c      2008-04-25 07:55:49.000000000 -0400
+++ parrot-x64/src/stacks.c     2008-04-25 10:14:06.000000000 -0400
@@ -60,7 +60,6 @@
 mark_stack(PARROT_INTERP, ARGMOD(Stack_Chunk_t *chunk))
 {
     for (; ; chunk = chunk->prev) {
-        void          **entry_data;
         Stack_Entry_t  *entry;
 
         pobject_lives(interp, (PObj *)chunk);
@@ -68,8 +67,7 @@
         if (chunk == chunk->prev)
             break;
 
-        entry_data = STACK_DATAP(chunk);
-        entry      = (Stack_Entry_t *)entry_data;
+        entry = STACK_DATAP(chunk);
 
         if (entry->entry_type == STACK_ENTRY_PMC && UVal_pmc(entry->entry))
             pobject_lives(interp, (PObj *)UVal_pmc(entry->entry));
@@ -140,7 +138,6 @@
 stack_entry(PARROT_INTERP, ARGIN(Stack_Chunk_t *stack), INTVAL depth)
 {
     Stack_Chunk_t *chunk;
-    void         **entry;
     size_t         offset = (size_t)depth;
 
     if (depth < 0)
@@ -159,9 +156,7 @@
     if (chunk == chunk->prev)
         return NULL;
 
-    /* this looks bad, but it avoids a type-punning warning */
-    entry = STACK_DATAP(chunk);
-    return (Stack_Entry_t *)entry;
+    return STACK_DATAP(chunk);
 }
 
 /*

-- 
    Andy Dougherty              [EMAIL PROTECTED]

Reply via email to