gv.h: Make gp_line and gp_flags into a bitfield
authorFather Chrysostomos <sprout@cpan.org>
Tue, 23 Sep 2014 04:45:26 +0000 (21:45 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 23 Sep 2014 04:56:36 +0000 (21:56 -0700)
This reduces the allocated size on Windows, where an
extra header is added to what gets allocated.  See
<https://rt.perl.org/Ticket/Display.html?id=15667#txn-1309657>.

ext/B/B.xs
gv.h

index 17614cb..15cadaf 100644 (file)
@@ -1757,7 +1757,6 @@ GvGP(gv)
 #define GP_av_ix       (SVp << 16) | STRUCT_OFFSET(struct gp, gp_av)
 #define GP_form_ix     (SVp << 16) | STRUCT_OFFSET(struct gp, gp_form)
 #define GP_egv_ix      (SVp << 16) | STRUCT_OFFSET(struct gp, gp_egv)
-#define GP_line_ix     (line_tp << 16) | STRUCT_OFFSET(struct gp, gp_line)
 
 void
 SV(gv)
@@ -1772,7 +1771,6 @@ SV(gv)
        AV = GP_av_ix
        FORM = GP_form_ix
        EGV = GP_egv_ix
-       LINE = GP_line_ix
     PREINIT:
        GP *gp;
        char *ptr;
@@ -1791,15 +1789,16 @@ SV(gv)
        case U32p:
            ret = sv_2mortal(newSVuv(*((U32*)ptr)));
            break;
-       case line_tp:
-           ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
-           break;
        default:
            croak("Illegal alias 0x%08x for B::*SV", (unsigned)ix);
        }
        ST(0) = ret;
        XSRETURN(1);
 
+U32
+GvLINE(gv)
+        B::GV   gv
+
 void
 FILEGV(gv)
        B::GV   gv
diff --git a/gv.h b/gv.h
index 2b29b6d..cf096c3 100644 (file)
--- a/gv.h
+++ b/gv.h
@@ -18,8 +18,8 @@ struct gp {
     AV *       gp_av;          /* array value */
     CV *       gp_form;        /* format value */
     GV *       gp_egv;         /* effective gv, if *glob */
-    line_t     gp_line;        /* line first declared at (for -w) */
-    U32                gp_flags;
+    U32                gp_line:31;     /* line first declared at (for -w) */
+    U32                gp_flags:1;
     HEK *      gp_file_hek;    /* file first declared in (for -w) */
 };