At 10:56 PM +0100 10/15/06, Nicholas Clark wrote:
>On Sun, Oct 15, 2006 at 04:02:43PM -0500, Craig A. Berry wrote:
>
>> Change 28770 by [EMAIL PROTECTED] on 2006/08/31 08:26:13
>>
>>     Save 4 bytes from struct context (on ILP32) by moving cx_type into
> >     struct block and struct subst.


>What type does U8 end up as on VMS? And what type is bool?

$ perl -"V:u8size"
u8size='1';
$ perl -"V:u8type"
u8type='unsigned char';
$ perl -"V:boolsize"
boolsize='UNKNOWN';
$ perl -"V:booltype"
booltype='UNKNOWN';

Hmm.  No bool type detected at configuration time, but this from
handy.h makes it an int, which is going to be 32 bits:

#ifndef HAS_BOOL
# if defined(UTS) || defined(VMS)
#  define bool int

I have no idea why we have that.  It seems a waste of about 31 bits,
but it's probably been that way forever.

>What's the offset of the I32 blku_oldsp in struct block? 3, or 4?

Since it's a longword (32 bits), it would be longword-aligned on
Alpha and Itanium (things are aligned to their "natural" boundaries).
But everything is byte aligned on VAX.  So the offset would be 3
bytes on VAX, 4 on non-VAX VMS systems.  These are the defaults and
there are ways to override that behavior with pragmas if necessary.

However, if a 32-bit bool is supposed to overly an 8-bit U8, that's
gonna be a problem.  I had thought in a quick glance that only the
first structure members needed to match (the _type fields), but if
things further down in the structure must match or if the overall
structure sizes must match, then we need to do what your patch does.

>Does the appended patch fix it?

And indeed that fixes it, thanks.

In summary, it really wasn't an alignment issue, but having a goofy
32-bit bool type.

>
>Nicholas Clark
>
>==== //depot/perl/cop.h#131 - /home/nick/p4perl/perl/cop.h ====
>--- /tmp/tmp.74363.0   Sun Oct 15 22:55:17 2006
>+++ /home/nick/p4perl/perl/cop.h       Sun Oct 15 22:39:23 2006
>@@ -497,6 +497,7 @@ struct block_givwhen {
> struct block {
>     U16               blku_type;      /* what kind of context this is */
>     U8                blku_gimme;     /* is this block running in list 
> context? */
>+    U8                blku_spare;     /* Padding to match with struct subst */
>     I32               blku_oldsp;     /* stack pointer to copy stuff down to 
> */
>     COP *     blku_oldcop;    /* old curcop pointer */
>     I32               blku_oldmarksp; /* mark stack index */
>@@ -556,8 +557,8 @@ struct block {
> /* substitution context */
> struct subst {
>     U16               sbu_type;       /* what kind of context this is */
>-    bool      sbu_once;
>-    bool      sbu_rxtainted;
>+    U8                sbu_once;       /* Actually both booleans, but U8 to 
>matches */
>+    U8                sbu_rxtainted;  /* struct block */
>     I32               sbu_iters;
>     I32               sbu_maxiters;
>     I32               sbu_rflags;


-- 
________________________________________
Craig A. Berry
mailto:[EMAIL PROTECTED]

"... getting out of a sonnet is much more
 difficult than getting in."
                 Brad Leithauser

Reply via email to