summaryrefslogtreecommitdiff
path: root/sv.h
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2006-12-12 00:07:48 +0000
committerNicholas Clark <nick@ccl4.org>2006-12-12 00:07:48 +0000
commitb4f6c04b44f75623f37bec8de1842dd241cf229c (patch)
tree56e078798985d9cd458e47550b66c0111d0f6ce5 /sv.h
parentd0688fc44cc7f676588fd73d97f4e90684ce4f55 (diff)
downloadperl-b4f6c04b44f75623f37bec8de1842dd241cf229c.tar.gz
By moving xbm_previous into the SvPVX, we save a U16 from struct xpvbm,
which will likely equate to 4 bytes with padding. (But we add 2 bytes to the SvPVX buffer...). However, the real win is that xpvbm is now identical to xpvmg, and all active FBM compiled strings are SvVALID() true, so now we can eliminate xpvbm, freeing a type for 6 on 5 proxies. p4raw-id: //depot/perl@29527
Diffstat (limited to 'sv.h')
-rw-r--r--sv.h57
1 files changed, 38 insertions, 19 deletions
diff --git a/sv.h b/sv.h
index a80a0ac083..8849a3e045 100644
--- a/sv.h
+++ b/sv.h
@@ -544,8 +544,6 @@ struct xpvbm {
HV* xmg_ourstash; /* Stash for our (when SvPAD_OUR is true) */
} xmg_u;
HV* xmg_stash; /* class package */
-
- U16 xbm_previous; /* how many characters in string before rare? */
};
/* This structure must match XPVCV in cv.h */
@@ -1312,6 +1310,8 @@ the scalar's value cannot change unless written to.
#define PERL_FBM_TABLE_OFFSET 5 /* Number of bytes between EOS and table */
#define PERL_FBM_FLAGS_OFFSET_FROM_TABLE -1
+#define PERL_FBM_PREVIOUS_L_OFFSET_FROM_TABLE -2
+#define PERL_FBM_PREVIOUS_H_OFFSET_FROM_TABLE -3
#define PERL_FBM_RARE_OFFSET_FROM_TABLE -4
/* SvPOKp not SvPOK in the assertion because the string can be tainted! eg
@@ -1319,37 +1319,56 @@ the scalar's value cannot change unless written to.
*/
#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
# define BmRARE(sv) \
- (*({ SV *const _svi = (SV *) (sv); \
- assert(SvTYPE(_svi) == SVt_PVBM); \
- assert(SvVALID(_svi)); \
- assert(SvPOKp(_svi)); \
- (U8*)(SvEND(_svi) \
+ (*({ SV *const uggh = (SV *) (sv); \
+ assert(SvTYPE(uggh) == SVt_PVBM); \
+ assert(SvVALID(uggh)); \
+ assert(SvCUR(uggh) + PERL_FBM_TABLE_OFFSET \
+ + PERL_FBM_RARE_OFFSET_FROM_TABLE <= SvLEN(uggh)); \
+ assert(SvPOKp(uggh)); \
+ (U8*)(SvEND(uggh) \
+ PERL_FBM_TABLE_OFFSET + PERL_FBM_RARE_OFFSET_FROM_TABLE); \
}))
# define BmUSEFUL(sv) \
- (*({ SV *const _svi = (SV *) (sv); \
- assert(SvTYPE(_svi) == SVt_PVBM); \
- assert(SvVALID(_svi)); \
- assert(!SvIOK(_svi)); \
- &(((XPVBM*) SvANY(_svi))->xiv_u.xivu_i32); \
+ (*({ SV *const uggh = (SV *) (sv); \
+ assert(SvTYPE(uggh) == SVt_PVBM); \
+ assert(SvVALID(uggh)); \
+ assert(!SvIOK(uggh)); \
+ &(((XPVBM*) SvANY(uggh))->xiv_u.xivu_i32); \
}))
# define BmPREVIOUS(sv) \
- (*({ SV *const _svi = (SV *) (sv); \
- assert(SvTYPE(_svi) == SVt_PVBM); \
- assert(SvVALID(_svi)); \
- &(((XPVBM*) SvANY(_svi))->xbm_previous); \
- }))
+ ({ SV *const uggh = (SV *) (sv); \
+ assert(SvTYPE(uggh) == SVt_PVBM); \
+ assert(SvVALID(uggh)); \
+ assert(SvPOKp(uggh)); \
+ assert(SvCUR(uggh) + PERL_FBM_TABLE_OFFSET <= SvLEN(uggh)); \
+ (*(U8*)(SvEND(uggh) + PERL_FBM_TABLE_OFFSET \
+ + PERL_FBM_PREVIOUS_H_OFFSET_FROM_TABLE) << 8) \
+ | (*(U8*)(SvEND(uggh) + PERL_FBM_TABLE_OFFSET \
+ + PERL_FBM_PREVIOUS_L_OFFSET_FROM_TABLE)); \
+ })
#else
# define BmRARE(sv) \
(*(U8*)(SvEND(sv) \
+ PERL_FBM_TABLE_OFFSET + PERL_FBM_RARE_OFFSET_FROM_TABLE))
# define BmUSEFUL(sv) ((XPVBM*) SvANY(sv))->xiv_u.xivu_i32
-# define BmPREVIOUS(sv) ((XPVBM*) SvANY(sv))->xbm_previous
+# define BmPREVIOUS(sv) \
+ (*(U8*)(SvEND(sv) + PERL_FBM_TABLE_OFFSET \
+ + PERL_FBM_PREVIOUS_H_OFFSET_FROM_TABLE) << 8) \
+ | (*(U8*)(SvEND(sv) + PERL_FBM_TABLE_OFFSET \
+ + PERL_FBM_PREVIOUS_L_OFFSET_FROM_TABLE)) \
+
#endif
#define BmPREVIOUS_set(sv, val) \
STMT_START { assert(SvTYPE(sv) == SVt_PVBM); \
- (((XPVBM*)SvANY(sv))->xbm_previous = (U16)(val)); } STMT_END
+ assert(SvVALID(sv)); \
+ assert(SvPOKp(sv)); \
+ assert(SvCUR(sv) + PERL_FBM_TABLE_OFFSET <= SvLEN(sv)); \
+ *(U8*)(SvEND(sv) + PERL_FBM_TABLE_OFFSET \
+ + PERL_FBM_PREVIOUS_H_OFFSET_FROM_TABLE) = (U8)((U32)(val)>>8); \
+ *(U8*)(SvEND(sv) + PERL_FBM_TABLE_OFFSET \
+ + PERL_FBM_PREVIOUS_L_OFFSET_FROM_TABLE) = (U8)(val); \
+ } STMT_END
#define FmLINES(sv) ((XPVFM*) SvANY(sv))->xfm_lines