This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add length element to inversion lists
authorKarl Williamson <public@khwilliamson.com>
Sun, 29 May 2011 15:16:49 +0000 (09:16 -0600)
committerKarl Williamson <public@khwilliamson.com>
Sun, 3 Jul 2011 20:05:46 +0000 (14:05 -0600)
Future changes will make the length no longer the same as SvCUR,
so create an element to hold the correct length

embed.fnc
embed.h
proto.h
regcomp.c

index 4e9106a..c882c11 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -1310,6 +1310,7 @@ EsMR      |SV*    |add_range_to_invlist   |NULLOK SV* invlist|const UV start|const UV end
 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
diff --git a/embed.h b/embed.h
index 711a4bc..e9dbcb9 100644 (file)
--- a/embed.h
+++ b/embed.h
 #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)
diff --git a/proto.h b/proto.h
index 320edfd..78f5dcc 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -6047,6 +6047,12 @@ PERL_STATIC_INLINE UV*   S_get_invlist_iter_addr(pTHX_ SV* 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);
index 7644485..8635a10 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -5835,7 +5835,8 @@ S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags)
  * 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 */
@@ -5856,6 +5857,17 @@ S_invlist_array(pTHX_ SV* const invlist)
     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)
 {
@@ -5863,7 +5875,7 @@ S_invlist_len(pTHX_ SV* const invlist)
 
     PERL_ARGS_ASSERT_INVLIST_LEN;
 
-    return FROM_INTERNAL_SIZE(SvCUR(invlist));
+    return *get_invlist_len_addr(invlist);
 }
 
 PERL_STATIC_INLINE UV
@@ -5885,6 +5897,7 @@ S_invlist_set_len(pTHX_ SV* const invlist, const UV 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