Reinstate space optimisations to SV body structures.
authorNicholas Clark <nick@ccl4.org>
Mon, 25 Jan 2010 13:30:16 +0000 (13:30 +0000)
committerNicholas Clark <nick@ccl4.org>
Fri, 21 May 2010 06:03:51 +0000 (07:03 +0100)
sv.c

diff --git a/sv.c b/sv.c
index 016a142..3b332f2 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -921,21 +921,39 @@ static const struct body_details bodies_by_type[] = {
 
     /* 8 bytes on most ILP32 with IEEE doubles */
     { sizeof(XPV),
-      copy_length(XPV, xpv_len),
-      0,
+      copy_length(XPV, xpv_len) - STRUCT_OFFSET(XPV, xpv_cur),
+      + STRUCT_OFFSET(XPV, xpv_cur),
       SVt_PV, FALSE, NONV, HASARENA,
-      FIT_ARENA(0, sizeof(XPV)) },
+      FIT_ARENA(0, sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur)) },
 
+#if 2 *PTRSIZE <= IVSIZE
     /* 12 */
     { sizeof(XPVIV),
+      copy_length(XPVIV, xiv_u) - STRUCT_OFFSET(XPV, xpv_cur),
+      + STRUCT_OFFSET(XPV, xpv_cur),
+      SVt_PVIV, FALSE, NONV, HASARENA,
+      FIT_ARENA(0, sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur)) },
+    /* 12 */
+#else
+    { sizeof(XPVIV),
       copy_length(XPVIV, xiv_u),
       0,
       SVt_PVIV, FALSE, NONV, HASARENA,
-      FIT_ARENA(0, sizeof(XPV)) },
+      FIT_ARENA(0, sizeof(XPVIV)) },
+#endif
 
+#if (2 *PTRSIZE <= IVSIZE) && (2 *PTRSIZE <= NVSIZE)
+    /* 20 */
+    { sizeof(XPVNV),
+      copy_length(XPVNV, xnv_u) - STRUCT_OFFSET(XPV, xpv_cur),
+      + STRUCT_OFFSET(XPV, xpv_cur),
+      SVt_PVNV, FALSE, HADNV, HASARENA,
+      FIT_ARENA(0, sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur)) },
+#else
     /* 20 */
     { sizeof(XPVNV), copy_length(XPVNV, xnv_u), 0, SVt_PVNV, FALSE, HADNV,
       HASARENA, FIT_ARENA(0, sizeof(XPVNV)) },
+#endif
 
     /* 28 */
     { sizeof(XPVMG), copy_length(XPVMG, xnv_u), 0, SVt_PVMG, FALSE, HADNV,