7e86df
From bafffe7f2ca587960177ed03216e2d5692fe6143 Mon Sep 17 00:00:00 2001
7e86df
From: Karl Williamson <khw@cpan.org>
7e86df
Date: Wed, 19 Aug 2020 11:57:17 -0600
7e86df
Subject: [PATCH] Add av_count()
7e86df
MIME-Version: 1.0
7e86df
Content-Type: text/plain; charset=UTF-8
7e86df
Content-Transfer-Encoding: 8bit
7e86df
7e86df
This returns the number of elements in an array in a clearly named
7e86df
function.
7e86df
7e86df
av_top_index(), av_tindex() are clearly named, but are less than ideal,
7e86df
and came about because no one back then thought of this one, until now
7e86df
Paul Evans did.
7e86df
7e86df
Petr Písař: Port 87306e0674dfe3af29804b4641347cd5ac9b0521 to 5.32.0.
7e86df
7e86df
Signed-off-by: Petr Písař <ppisar@redhat.com>
7e86df
---
7e86df
 av.c      | 17 ++++++++++++++---
7e86df
 av.h      |  3 ++-
7e86df
 embed.fnc |  3 ++-
7e86df
 embed.h   |  2 +-
7e86df
 inline.h  | 16 ++++++++++++----
7e86df
 proto.h   | 11 ++++++++---
7e86df
 6 files changed, 39 insertions(+), 13 deletions(-)
7e86df
7e86df
diff --git a/av.c b/av.c
7e86df
index 27b2f12..b5ddaca 100644
7e86df
--- a/av.c
7e86df
+++ b/av.c
7e86df
@@ -814,9 +814,10 @@ The Perl equivalent for this is C<$#myarray>.
7e86df
 =for apidoc av_len
7e86df
 
7e86df
 Same as L</av_top_index>.  Note that, unlike what the name implies, it returns
7e86df
-the highest index in the array, so to get the size of the array you need to use
7e86df
-S<C<av_len(av) + 1>>.  This is unlike L</sv_len>, which returns what you would
7e86df
-expect.
7e86df
+the highest index in the array.  This is unlike L</sv_len>, which returns what
7e86df
+you would expect.
7e86df
+
7e86df
+B<To get the true number of elements in the array, instead use C<L</av_count>>>.
7e86df
 
7e86df
 =cut
7e86df
 */
7e86df
@@ -1089,6 +1090,16 @@ Perl_av_nonelem(pTHX_ AV *av, SSize_t ix) {
7e86df
     return sv;
7e86df
 }
7e86df
 
7e86df
+SSize_t
7e86df
+Perl_av_top_index(pTHX_ AV *av)
7e86df
+{
7e86df
+    PERL_ARGS_ASSERT_AV_TOP_INDEX;
7e86df
+    assert(SvTYPE(av) == SVt_PVAV);
7e86df
+
7e86df
+    return AvFILL(av);
7e86df
+}
7e86df
+
7e86df
+
7e86df
 /*
7e86df
  * ex: set ts=8 sts=4 sw=4 et:
7e86df
  */
7e86df
diff --git a/av.h b/av.h
7e86df
index 5e39c42..90ebfff 100644
7e86df
--- a/av.h
7e86df
+++ b/av.h
7e86df
@@ -81,7 +81,8 @@ Same as C<av_top_index()>.
7e86df
                                           
7e86df
 #define AvFILL(av)	((SvRMAGICAL((const SV *) (av))) \
7e86df
 			 ? mg_size(MUTABLE_SV(av)) : AvFILLp(av))
7e86df
-#define av_tindex(av)   av_top_index(av)
7e86df
+#define av_top_index(av) AvFILL(av)
7e86df
+#define av_tindex(av)    av_top_index(av)
7e86df
 
7e86df
 /* Note that it doesn't make sense to do this:
7e86df
  *      SvGETMAGIC(av); IV x = av_tindex_nomg(av);
7e86df
diff --git a/embed.fnc b/embed.fnc
7e86df
index 589ab1a..789cd3c 100644
7e86df
--- a/embed.fnc
7e86df
+++ b/embed.fnc
7e86df
@@ -541,7 +541,8 @@ Apd	|void	|av_push	|NN AV *av|NN SV *val
7e86df
 EXp	|void	|av_reify	|NN AV *av
7e86df
 ApdR	|SV*	|av_shift	|NN AV *av
7e86df
 Apd	|SV**	|av_store	|NN AV *av|SSize_t key|NULLOK SV *val
7e86df
-AidRp	|SSize_t|av_top_index	|NN AV *av
7e86df
+AMdRp	|SSize_t|av_top_index	|NN AV *av
7e86df
+AidRp	|Size_t	|av_count	|NN AV *av
7e86df
 AmdR	|SSize_t|av_tindex	|NN AV *av
7e86df
 Apd	|void	|av_undef	|NN AV *av
7e86df
 Apdoex	|SV**	|av_create_and_unshift_one|NN AV **const avp|NN SV *const val
7e86df
diff --git a/embed.h b/embed.h
7e86df
index 182b12a..329ac40 100644
7e86df
--- a/embed.h
7e86df
+++ b/embed.h
7e86df
@@ -48,6 +48,7 @@
7e86df
 #define atfork_lock		Perl_atfork_lock
7e86df
 #define atfork_unlock		Perl_atfork_unlock
7e86df
 #define av_clear(a)		Perl_av_clear(aTHX_ a)
7e86df
+#define av_count(a)		Perl_av_count(aTHX_ a)
7e86df
 #define av_delete(a,b,c)	Perl_av_delete(aTHX_ a,b,c)
7e86df
 #define av_exists(a,b)		Perl_av_exists(aTHX_ a,b)
7e86df
 #define av_extend(a,b)		Perl_av_extend(aTHX_ a,b)
7e86df
@@ -59,7 +60,6 @@
7e86df
 #define av_push(a,b)		Perl_av_push(aTHX_ a,b)
7e86df
 #define av_shift(a)		Perl_av_shift(aTHX_ a)
7e86df
 #define av_store(a,b,c)		Perl_av_store(aTHX_ a,b,c)
7e86df
-#define av_top_index(a)		Perl_av_top_index(aTHX_ a)
7e86df
 #define av_undef(a)		Perl_av_undef(aTHX_ a)
7e86df
 #define av_unshift(a,b)		Perl_av_unshift(aTHX_ a,b)
7e86df
 #define block_end(a,b)		Perl_block_end(aTHX_ a,b)
7e86df
diff --git a/inline.h b/inline.h
7e86df
index 27005d2..35af18a 100644
7e86df
--- a/inline.h
7e86df
+++ b/inline.h
7e86df
@@ -39,13 +39,21 @@ SOFTWARE.
7e86df
 
7e86df
 /* ------------------------------- av.h ------------------------------- */
7e86df
 
7e86df
-PERL_STATIC_INLINE SSize_t
7e86df
-Perl_av_top_index(pTHX_ AV *av)
7e86df
+/*
7e86df
+=for apidoc av_count
7e86df
+Returns the number of elements in the array C<av>.  This is the true length of
7e86df
+the array, including any undefined elements.  It is always the same as
7e86df
+S<C<av_top_index(av) + 1>>.
7e86df
+
7e86df
+=cut
7e86df
+*/
7e86df
+PERL_STATIC_INLINE Size_t
7e86df
+Perl_av_count(pTHX_ AV *av)
7e86df
 {
7e86df
-    PERL_ARGS_ASSERT_AV_TOP_INDEX;
7e86df
+    PERL_ARGS_ASSERT_AV_COUNT;
7e86df
     assert(SvTYPE(av) == SVt_PVAV);
7e86df
 
7e86df
-    return AvFILL(av);
7e86df
+    return AvFILL(av) + 1;
7e86df
 }
7e86df
 
7e86df
 /* ------------------------------- cv.h ------------------------------- */
7e86df
diff --git a/proto.h b/proto.h
7e86df
index 02ef4ed..83ba098 100644
7e86df
--- a/proto.h
7e86df
+++ b/proto.h
7e86df
@@ -219,6 +219,13 @@ PERL_CALLCONV SV**	Perl_av_arylen_p(pTHX_ AV *av);
7e86df
 PERL_CALLCONV void	Perl_av_clear(pTHX_ AV *av);
7e86df
 #define PERL_ARGS_ASSERT_AV_CLEAR	\
7e86df
 	assert(av)
7e86df
+#ifndef PERL_NO_INLINE_FUNCTIONS
7e86df
+PERL_STATIC_INLINE Size_t	Perl_av_count(pTHX_ AV *av)
7e86df
+			__attribute__warn_unused_result__;
7e86df
+#define PERL_ARGS_ASSERT_AV_COUNT	\
7e86df
+	assert(av)
7e86df
+#endif
7e86df
+
7e86df
 PERL_CALLCONV void	Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val);
7e86df
 #define PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH	\
7e86df
 	assert(avp); assert(val)
7e86df
@@ -284,12 +291,10 @@ PERL_CALLCONV SV**	Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val);
7e86df
 			__attribute__warn_unused_result__; */
7e86df
 #define PERL_ARGS_ASSERT_AV_TINDEX
7e86df
 
7e86df
-#ifndef PERL_NO_INLINE_FUNCTIONS
7e86df
-PERL_STATIC_INLINE SSize_t	Perl_av_top_index(pTHX_ AV *av)
7e86df
+PERL_CALLCONV SSize_t	Perl_av_top_index(pTHX_ AV *av)
7e86df
 			__attribute__warn_unused_result__;
7e86df
 #define PERL_ARGS_ASSERT_AV_TOP_INDEX	\
7e86df
 	assert(av)
7e86df
-#endif
7e86df
 
7e86df
 PERL_CALLCONV void	Perl_av_undef(pTHX_ AV *av);
7e86df
 #define PERL_ARGS_ASSERT_AV_UNDEF	\
7e86df
-- 
7e86df
2.25.4
7e86df