This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcomp.c: Move 2 hdr inversion fields to SV hdr
[perl5.git] / inline.h
index 608f6c4..7aeb93d 100644 (file)
--- a/inline.h
+++ b/inline.h
  *
  * Each section names the header file that the functions "belong" to.
  */
+
+/* ------------------------------- av.h ------------------------------- */
+
+PERL_STATIC_INLINE I32
+S_av_top_index(pTHX_ AV *av)
+{
+    PERL_ARGS_ASSERT_AV_TOP_INDEX;
+    assert(SvTYPE(av) == SVt_PVAV);
+
+    return AvFILL(av);
+}
+
+/* ------------------------------- cv.h ------------------------------- */
+
+PERL_STATIC_INLINE I32 *
+S_CvDEPTHp(const CV * const sv)
+{
+    assert(SvTYPE(sv) == SVt_PVCV || SvTYPE(sv) == SVt_PVFM);
+    return &((XPVCV*)SvANY(sv))->xcv_depth;
+}
+
+/*
+ CvPROTO returns the prototype as stored, which is not necessarily what
+ the interpreter should be using. Specifically, the interpreter assumes
+ that spaces have been stripped, which has been the case if the prototype
+ was added by toke.c, but is generally not the case if it was added elsewhere.
+ Since we can't enforce the spacelessness at assignment time, this routine
+ provides a temporary copy at parse time with spaces removed.
+ I<orig> is the start of the original buffer, I<len> is the length of the
+ prototype and will be updated when this returns.
+ */
+
+#ifdef PERL_CORE
+PERL_STATIC_INLINE char *
+S_strip_spaces(pTHX_ const char * orig, STRLEN * const len)
+{
+    SV * tmpsv;
+    char * tmps;
+    tmpsv = newSVpvn_flags(orig, *len, SVs_TEMP);
+    tmps = SvPVX(tmpsv);
+    while ((*len)--) {
+       if (!isSPACE(*orig))
+           *tmps++ = *orig;
+       orig++;
+    }
+    *tmps = '\0';
+    *len = tmps - SvPVX(tmpsv);
+               return SvPVX(tmpsv);
+}
+#endif
+
+/* ----------------------------- regexp.h ----------------------------- */
+
+PERL_STATIC_INLINE struct regexp *
+S_ReANY(const REGEXP * const re)
+{
+    assert(isREGEXP(re));
+    return re->sv_u.svu_rx;
+}
+
+/* ------------------------------- sv.h ------------------------------- */
+
+PERL_STATIC_INLINE SV *
+S_SvREFCNT_inc(SV *sv)
+{
+    if (LIKELY(sv != NULL))
+       SvREFCNT(sv)++;
+    return sv;
+}
+PERL_STATIC_INLINE SV *
+S_SvREFCNT_inc_NN(SV *sv)
+{
+    SvREFCNT(sv)++;
+    return sv;
+}
+PERL_STATIC_INLINE void
+S_SvREFCNT_inc_void(SV *sv)
+{
+    if (LIKELY(sv != NULL))
+       SvREFCNT(sv)++;
+}
+PERL_STATIC_INLINE void
+S_SvREFCNT_dec(pTHX_ SV *sv)
+{
+    if (LIKELY(sv != NULL)) {
+       U32 rc = SvREFCNT(sv);
+       if (LIKELY(rc > 1))
+           SvREFCNT(sv) = rc - 1;
+       else
+           Perl_sv_free2(aTHX_ sv, rc);
+    }
+}
+
+PERL_STATIC_INLINE void
+S_SvREFCNT_dec_NN(pTHX_ SV *sv)
+{
+    U32 rc = SvREFCNT(sv);
+    if (LIKELY(rc > 1))
+       SvREFCNT(sv) = rc - 1;
+    else
+       Perl_sv_free2(aTHX_ sv, rc);
+}
+
+PERL_STATIC_INLINE void
+SvAMAGIC_on(SV *sv)
+{
+    assert(SvROK(sv));
+    if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
+}
+PERL_STATIC_INLINE void
+SvAMAGIC_off(SV *sv)
+{
+    if (SvROK(sv) && SvOBJECT(SvRV(sv)))
+       HvAMAGIC_off(SvSTASH(SvRV(sv)));
+}
+
+PERL_STATIC_INLINE U32
+S_SvPADTMP_on(SV *sv)
+{
+    assert(!(SvFLAGS(sv) & SVs_PADMY));
+    return SvFLAGS(sv) |= SVs_PADTMP;
+}
+PERL_STATIC_INLINE U32
+S_SvPADTMP_off(SV *sv)
+{
+    assert(!(SvFLAGS(sv) & SVs_PADMY));
+    return SvFLAGS(sv) &= ~SVs_PADTMP;
+}
+PERL_STATIC_INLINE U32
+S_SvPADSTALE_on(SV *sv)
+{
+    assert(SvFLAGS(sv) & SVs_PADMY);
+    return SvFLAGS(sv) |= SVs_PADSTALE;
+}
+PERL_STATIC_INLINE U32
+S_SvPADSTALE_off(SV *sv)
+{
+    assert(SvFLAGS(sv) & SVs_PADMY);
+    return SvFLAGS(sv) &= ~SVs_PADSTALE;
+}
+#ifdef PERL_CORE
+PERL_STATIC_INLINE STRLEN
+S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
+{
+    if (SvGAMAGIC(sv)) {
+       U8 *hopped = utf8_hop((U8 *)pv, pos);
+       if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped);
+       return (STRLEN)(hopped - (U8 *)pv);
+    }
+    return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN);
+}
+#endif
+
+/* ------------------------------- utf8.h ------------------------------- */
+
+/* These exist only to replace the macros they formerly were so that their use
+ * can be deprecated */
+
+PERL_STATIC_INLINE bool
+S_isIDFIRST_lazy(pTHX_ const char* p)
+{
+    PERL_ARGS_ASSERT_ISIDFIRST_LAZY;
+
+    return isIDFIRST_lazy_if(p,1);
+}
+
+PERL_STATIC_INLINE bool
+S_isALNUM_lazy(pTHX_ const char* p)
+{
+    PERL_ARGS_ASSERT_ISALNUM_LAZY;
+
+    return isALNUM_lazy_if(p,1);
+}