Future changes will make the length no longer the same as SvCUR,
so create an element to hold the correct length
EiMR |UV* |invlist_array |NN SV* const invlist
EsM |void |invlist_extend |NN SV* const invlist|const UV len
EsM |void |invlist_intersection |NN SV* const a|NN SV* const b|NN SV** i
EiMR |UV* |invlist_array |NN SV* const invlist
EsM |void |invlist_extend |NN SV* const invlist|const UV len
EsM |void |invlist_intersection |NN SV* const a|NN SV* const b|NN SV** i
+EiMR |UV* |get_invlist_len_addr |NN SV* invlist
EiMR |UV |invlist_len |NN SV* const invlist
EiMR |UV |invlist_max |NN SV* const invlist
EiM |void |invlist_set_len |NN SV* const invlist|const UV len
EiMR |UV |invlist_len |NN SV* const invlist
EiMR |UV |invlist_max |NN SV* const invlist
EiM |void |invlist_set_len |NN SV* const invlist|const UV len
#define cl_is_anything S_cl_is_anything
#define cl_or S_cl_or
#define get_invlist_iter_addr(a) S_get_invlist_iter_addr(aTHX_ a)
#define cl_is_anything S_cl_is_anything
#define cl_or S_cl_or
#define get_invlist_iter_addr(a) S_get_invlist_iter_addr(aTHX_ a)
+#define get_invlist_len_addr(a) S_get_invlist_len_addr(aTHX_ a)
#define invlist_array(a) S_invlist_array(aTHX_ a)
#define invlist_extend(a,b) S_invlist_extend(aTHX_ a,b)
#define invlist_intersection(a,b,c) S_invlist_intersection(aTHX_ a,b,c)
#define invlist_array(a) S_invlist_array(aTHX_ a)
#define invlist_extend(a,b) S_invlist_extend(aTHX_ a,b)
#define invlist_intersection(a,b,c) S_invlist_intersection(aTHX_ a,b,c)
#define PERL_ARGS_ASSERT_GET_INVLIST_ITER_ADDR \
assert(invlist)
#define PERL_ARGS_ASSERT_GET_INVLIST_ITER_ADDR \
assert(invlist)
+PERL_STATIC_INLINE UV* S_get_invlist_len_addr(pTHX_ SV* invlist)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GET_INVLIST_LEN_ADDR \
+ assert(invlist)
+
PERL_STATIC_INLINE UV* S_invlist_array(pTHX_ SV* const invlist)
__attribute__warn_unused_result__
__attribute__nonnull__(pTHX_1);
PERL_STATIC_INLINE UV* S_invlist_array(pTHX_ SV* const invlist)
__attribute__warn_unused_result__
__attribute__nonnull__(pTHX_1);
* Some of the methods should always be private to the implementation, and some
* should eventually be made public */
* Some of the methods should always be private to the implementation, and some
* should eventually be made public */
-#define INVLIST_ITER_OFFSET 0
+#define INVLIST_LEN_OFFSET 0
+#define INVLIST_ITER_OFFSET 1
#define HEADER_LENGTH (INVLIST_ITER_OFFSET + 1)
/* Internally things are UVs */
#define HEADER_LENGTH (INVLIST_ITER_OFFSET + 1)
/* Internally things are UVs */
return (UV *) (SvPVX(invlist) + TO_INTERNAL_SIZE(0));
}
return (UV *) (SvPVX(invlist) + TO_INTERNAL_SIZE(0));
}
+PERL_STATIC_INLINE UV*
+S_get_invlist_len_addr(pTHX_ SV* invlist)
+{
+ /* Return the address of the UV that contains the current number
+ * of used elements in the inversion list */
+
+ PERL_ARGS_ASSERT_GET_INVLIST_LEN_ADDR;
+
+ return (UV *) (SvPVX(invlist) + (INVLIST_LEN_OFFSET * sizeof (UV)));
+}
+
PERL_STATIC_INLINE UV
S_invlist_len(pTHX_ SV* const invlist)
{
PERL_STATIC_INLINE UV
S_invlist_len(pTHX_ SV* const invlist)
{
PERL_ARGS_ASSERT_INVLIST_LEN;
PERL_ARGS_ASSERT_INVLIST_LEN;
- return FROM_INTERNAL_SIZE(SvCUR(invlist));
+ return *get_invlist_len_addr(invlist);
PERL_ARGS_ASSERT_INVLIST_SET_LEN;
SvCUR_set(invlist, TO_INTERNAL_SIZE(len));
PERL_ARGS_ASSERT_INVLIST_SET_LEN;
SvCUR_set(invlist, TO_INTERNAL_SIZE(len));
+ *get_invlist_len_addr(invlist) = len;
}
#ifndef PERL_IN_XSUB_RE
}
#ifndef PERL_IN_XSUB_RE