This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix various compiler warnings from XS code
[perl5.git] / ext / B / B.xs
index fb450ef..c5d971b 100644 (file)
@@ -113,6 +113,8 @@ START_MY_CXT
 static opclass
 cc_opclass(pTHX_ const OP *o)
 {
+    bool custom = 0;
+
     if (!o)
        return OPc_NULL;
 
@@ -139,7 +141,10 @@ cc_opclass(pTHX_ const OP *o)
        return OPc_PADOP;
 #endif
 
-    switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
+    if (o->op_type == OP_CUSTOM)
+        custom = 1;
+
+    switch (OP_CLASS(o)) {
     case OA_BASEOP:
        return OPc_BASEOP;
 
@@ -173,7 +178,9 @@ cc_opclass(pTHX_ const OP *o)
          * and the SV is a reference to a swash
          * (i.e., an RV pointing to an HV).
          */
-       return (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
+       return (!custom &&
+                  (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
+              )
 #if  defined(USE_ITHREADS) \
   && (PERL_VERSION > 8 || (PERL_VERSION == 8 && PERL_SUBVERSION >= 9))
                ? OPc_PADOP : OPc_PVOP;
@@ -231,30 +238,27 @@ cc_opclass(pTHX_ const OP *o)
            return OPc_PVOP;
     }
     warn("can't determine class of operator %s, assuming BASEOP\n",
-        PL_op_name[o->op_type]);
+        OP_NAME(o));
     return OPc_BASEOP;
 }
 
-static char *
-cc_opclassname(pTHX_ const OP *o)
+static SV *
+make_op_object(pTHX_ const OP *o)
 {
-    return (char *)opclassnames[cc_opclass(aTHX_ o)];
+    SV *opsv = sv_newmortal();
+    sv_setiv(newSVrv(opsv, opclassnames[cc_opclass(aTHX_ o)]), PTR2IV(o));
+    return opsv;
 }
 
-/* FIXME - figure out how to get the typemap to assign this to ST(0), rather
-   than creating a new mortal for ST(0) then passing it in as the first
-   argument.  */
 static SV *
-make_sv_object(pTHX_ SV *arg, SV *sv)
+make_sv_object(pTHX_ SV *sv)
 {
+    SV *const arg = sv_newmortal();
     const char *type = 0;
     IV iv;
     dMY_CXT;
 
-    if (!arg)
-       arg = sv_newmortal();
-
-    for (iv = 0; iv < sizeof(specialsv_list)/sizeof(SV*); iv++) {
+    for (iv = 0; iv < (IV)(sizeof(specialsv_list)/sizeof(SV*)); iv++) {
        if (sv == specialsv_list[iv]) {
            type = "B::SPECIAL";
            break;
@@ -291,8 +295,9 @@ make_temp_object(pTHX_ SV *temp)
 }
 
 static SV *
-make_warnings_object(pTHX_ STRLEN *warnings)
+make_warnings_object(pTHX_ const COP *const cop)
 {
+    const STRLEN *const warnings = cop->cop_warnings;
     const char *type = 0;
     dMY_CXT;
     IV iv = sizeof(specialsv_list)/sizeof(SV*);
@@ -326,10 +331,10 @@ make_cop_io_object(pTHX_ COP *cop)
     Perl_emulate_cop_io(aTHX_ cop, value);
 
     if(SvOK(value)) {
-       return make_sv_object(aTHX_ NULL, value);
+       return make_sv_object(aTHX_ value);
     } else {
        SvREFCNT_dec(value);
-       return make_sv_object(aTHX_ NULL, NULL);
+       return make_sv_object(aTHX_ NULL);
     }
 }
 #endif
@@ -483,7 +488,7 @@ walkoptree(pTHX_ OP *o, const char *method, SV *ref)
     dSP;
     OP *kid;
     SV *object;
-    const char *const classname = cc_opclassname(aTHX_ o);
+    const char *const classname = opclassnames[cc_opclass(aTHX_ o)];
     dMY_CXT;
 
     /* Check that no-one has changed our reference, or is holding a reference
@@ -528,7 +533,6 @@ static SV **
 oplist(pTHX_ OP *o, SV **SP)
 {
     for(; o; o = o->op_next) {
-       SV *opsv;
 #if PERL_VERSION >= 9
        if (o->op_opt == 0)
            break;
@@ -538,9 +542,7 @@ oplist(pTHX_ OP *o, SV **SP)
            break;
        o->op_seq = 0;
 #endif
-       opsv = sv_newmortal();
-       sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ (OP*)o)), PTR2IV(o));
-       XPUSHs(opsv);
+       XPUSHs(make_op_object(aTHX_ o));
         switch (o->op_type) {
        case OP_SUBST:
             SP = oplist(aTHX_ PMOP_pmreplstart(cPMOPo), SP);
@@ -604,7 +606,7 @@ typedef HE      *B__HE;
 typedef struct refcounted_he   *B__RHE;
 #endif
 
-#ifdef USE_ITHREADS
+#ifdef MULTIPLICITY
 #  define ASSIGN_COMMON_ALIAS(var) \
     STMT_START { XSANY.any_i32 = offsetof(struct interpreter, var); } STMT_END
 #else
@@ -622,12 +624,12 @@ static XSPROTO(intrpvar_sv_common)
     SV *ret;
     if (items != 0)
        croak_xs_usage(cv,  "");
-#ifdef USE_ITHREADS
+#ifdef MULTIPLICITY
     ret = *(SV **)(XSANY.any_i32 + (char *)my_perl);
 #else
     ret = *(SV **)(XSANY.any_ptr);
 #endif
-    ST(0) = make_sv_object(aTHX_ NULL, ret);
+    ST(0) = make_sv_object(aTHX_ ret);
     XSRETURN(1);
 }
 
@@ -691,31 +693,28 @@ amagic_generation()
     OUTPUT:
        RETVAL
 
-B::AV
+void
 comppadlist()
-    CODE:
-       RETVAL = PL_main_cv ? CvPADLIST(PL_main_cv) : CvPADLIST(PL_compcv);
-    OUTPUT:
-       RETVAL
+    PPCODE:
+       PUSHs(make_sv_object(aTHX_ (SV *)(PL_main_cv ? CvPADLIST(PL_main_cv)
+                                                    : CvPADLIST(PL_compcv))));
 
-B::SV
+void
 sv_undef()
     ALIAS:
        sv_no = 1
        sv_yes = 2
-    CODE:
-       RETVAL = ix > 1 ? &PL_sv_yes : ix < 1 ? &PL_sv_undef : &PL_sv_no;
-    OUTPUT:
-       RETVAL
+    PPCODE:
+       PUSHs(make_sv_object(aTHX_ ix > 1 ? &PL_sv_yes
+                                         : ix < 1 ? &PL_sv_undef
+                                                  : &PL_sv_no));
 
-B::OP
+void
 main_root()
     ALIAS:
        main_start = 1
-    CODE:
-       RETVAL = ix ? PL_main_start : PL_main_root;
-    OUTPUT:
-       RETVAL
+    PPCODE:
+       PUSHs(make_op_object(aTHX_ ix ? PL_main_start : PL_main_root));
 
 UV
 sub_generation()
@@ -749,15 +748,13 @@ IV
 address(sv)
        SV *    sv
 
-B::SV
+void
 svref_2object(sv)
        SV *    sv
-    CODE:
+    PPCODE:
        if (!SvROK(sv))
            croak("argument is not a reference");
-       RETVAL = (SV*)SvRV(sv);
-    OUTPUT:
-       RETVAL              
+       PUSHs(make_sv_object(aTHX_ SvRV(sv)));
 
 void
 opnumber(name)
@@ -815,14 +812,14 @@ minus_c()
        else
            PL_minus_c = TRUE;
 
-SV *
+void
 cstring(sv)
        SV *    sv
     ALIAS:
        perlstring = 1
        cchar = 2
     PPCODE:
-       PUSHs(ix == 2 ? cchar(aTHX_ sv) : cstring(aTHX_ sv, ix));
+       PUSHs(ix == 2 ? cchar(aTHX_ sv) : cstring(aTHX_ sv, (bool)ix));
 
 void
 threadsv_names()
@@ -894,10 +891,10 @@ threadsv_names()
 #define COP_filegv_ix          SVp | offsetof(struct cop, cop_filegv)
 #endif
 
-MODULE = B     PACKAGE = B::OP         PREFIX = OP_
+MODULE = B     PACKAGE = B::OP
 
 size_t
-OP_size(o)
+size(o)
        B::OP           o
     CODE:
        RETVAL = opsizes[cc_opclass(aTHX_ o)];
@@ -937,12 +934,8 @@ next(o)
        ptr = (ix & 0xFFFF) + (char *)o;
        switch ((U8)(ix >> 16)) {
        case (U8)(OPp >> 16):
-           {
-               OP *const o2 = *((OP **)ptr);
-               ret = sv_newmortal();
-               sv_setiv(newSVrv(ret, cc_opclassname(aTHX_ o2)), PTR2IV(o2));
-               break;
-           }
+           ret = make_op_object(aTHX_ *((OP **)ptr));
+           break;
        case (U8)(PADOFFSETp >> 16):
            ret = sv_2mortal(newSVuv(*((PADOFFSET*)ptr)));
            break;
@@ -953,7 +946,7 @@ next(o)
            ret = sv_2mortal(newSVuv(*((U32*)ptr)));
            break;
        case (U8)(SVp >> 16):
-           ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
+           ret = make_sv_object(aTHX_ *((SV **)ptr));
            break;
        case (U8)(line_tp >> 16):
            ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
@@ -966,22 +959,25 @@ next(o)
            ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
            break;
 #endif
+       default:
+           croak("Illegal alias 0x%08x for B::*next", (unsigned)ix);
+
        }
        ST(0) = ret;
        XSRETURN(1);
 
 char *
-OP_name(o)
+name(o)
        B::OP           o
     ALIAS:
        desc = 1
     CODE:
-       RETVAL = (char *)(ix ? PL_op_desc : PL_op_name)[o->op_type];
+       RETVAL = (char *)(ix ? OP_DESC(o) : OP_NAME(o));
     OUTPUT:
        RETVAL
 
 void
-OP_ppaddr(o)
+ppaddr(o)
        B::OP           o
     PREINIT:
        int i;
@@ -996,7 +992,7 @@ OP_ppaddr(o)
 #if PERL_VERSION >= 9
 #  These 3 are all bitfields, so we can't take their addresses.
 UV
-OP_type(o)
+type(o)
        B::OP           o
     ALIAS:
        opt = 1
@@ -1018,7 +1014,7 @@ OP_type(o)
 #else
 
 UV
-OP_type(o)
+type(o)
        B::OP           o
     ALIAS:
        seq = 1
@@ -1036,15 +1032,15 @@ OP_type(o)
 #endif
 
 void
-OP_oplist(o)
+oplist(o)
        B::OP           o
     PPCODE:
        SP = oplist(aTHX_ o, SP);
 
-MODULE = B     PACKAGE = B::LISTOP             PREFIX = LISTOP_
+MODULE = B     PACKAGE = B::LISTOP
 
 U32
-LISTOP_children(o)
+children(o)
        B::LISTOP       o
        OP *            kid = NO_INIT
        int             i = NO_INIT
@@ -1065,10 +1061,10 @@ PMOP_pmreplroot(o)
        B::PMOP         o
        OP *            root = NO_INIT
     CODE:
-       ST(0) = sv_newmortal();
        root = o->op_pmreplroot;
        /* OP_PUSHRE stores an SV* instead of an OP* in op_pmreplroot */
        if (o->op_type == OP_PUSHRE) {
+           ST(0) = sv_newmortal();
 #  ifdef USE_ITHREADS
             sv_setiv(ST(0), INT2PTR(PADOFFSET,root) );
 #  else
@@ -1078,7 +1074,7 @@ PMOP_pmreplroot(o)
 #  endif
        }
        else {
-           sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), PTR2IV(root));
+           ST(0) = make_op_object(aTHX_ root);
        }
 
 #else
@@ -1087,12 +1083,13 @@ void
 PMOP_pmreplroot(o)
        B::PMOP         o
     CODE:
-       ST(0) = sv_newmortal();
        if (o->op_type == OP_PUSHRE) {
 #  ifdef USE_ITHREADS
+           ST(0) = sv_newmortal();
             sv_setiv(ST(0), o->op_pmreplrootu.op_pmtargetoff);
 #  else
            GV *const target = o->op_pmreplrootu.op_pmtargetgv;
+           ST(0) = sv_newmortal();
            sv_setiv(newSVrv(ST(0), target ?
                             svclassnames[SvTYPE((SV*)target)] : "B::SV"),
                     PTR2IV(target));
@@ -1100,8 +1097,7 @@ PMOP_pmreplroot(o)
        }
        else {
            OP *const root = o->op_pmreplrootu.op_pmreplroot; 
-           sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)),
-                    PTR2IV(root));
+           ST(0) = make_op_object(aTHX_ root);
        }
 
 #endif
@@ -1114,20 +1110,22 @@ PMOP_pmstashpv(o)
        B::PMOP         o
 
 #else
-#define PMOP_pmstash(o)                PmopSTASH(o);
 
-B::HV
+void
 PMOP_pmstash(o)
        B::PMOP         o
+    PPCODE:
+       PUSHs(make_sv_object(aTHX_ (SV *) PmopSTASH(o)));
 
 #endif
 
 #if PERL_VERSION < 9
-#define PMOP_pmnext(o)         o->op_pmnext
 
-B::PMOP
+void
 PMOP_pmnext(o)
        B::PMOP         o
+    PPCODE:
+       PUSHs(make_op_object(aTHX_ o->op_pmnext));
 
 U32
 PMOP_pmpermflags(o)
@@ -1183,30 +1181,31 @@ BOOT:
 
 MODULE = B     PACKAGE = B::PADOP
 
-B::SV
+void
 sv(o)
        B::PADOP o
+    PREINIT:
+       SV *ret;
     ALIAS:
        gv = 1
-    CODE:
+    PPCODE:
        /* It happens that the output typemaps for B::SV and B::GV are
           identical. The "smarts" are in make_sv_object(), which determines
           which class to use based on SvTYPE(), rather than anything baked in
           at compile time.  */    
        if (o->op_padix) {
-           RETVAL = PAD_SVl(o->op_padix);
-           if (ix && SvTYPE(RETVAL) != SVt_PVGV)
-               RETVAL = NULL;
+           ret = PAD_SVl(o->op_padix);
+           if (ix && SvTYPE(ret) != SVt_PVGV)
+               ret = NULL;
        } else {
-           RETVAL = NULL;
+           ret = NULL;
        }
-    OUTPUT:
-       RETVAL
+       PUSHs(make_sv_object(aTHX_ ret));
 
-MODULE = B     PACKAGE = B::PVOP               PREFIX = PVOP_
+MODULE = B     PACKAGE = B::PVOP
 
 void
-PVOP_pv(o)
+pv(o)
        B::PVOP o
     CODE:
        /*
@@ -1242,28 +1241,27 @@ COP_label(o)
 # above (B::OP::next)
  
 #ifdef USE_ITHREADS
-#define COP_stash(o)   CopSTASH(o)
-#define COP_filegv(o)  CopFILEGV(o)
 
-B::HV
+void
 COP_stash(o)
        B::COP  o
-
-B::GV
-COP_filegv(o)
-       B::COP  o
+    ALIAS:
+       filegv = 1
+    PPCODE:
+       PUSHs(make_sv_object(aTHX_
+                            ix ? (SV *)CopFILEGV(o) : (SV *)CopSTASH(o)));
 
 #else
-#define COP_stashpv(o) CopSTASHPV(o)
-#define COP_file(o)    CopFILE(o)
 
 char *
 COP_stashpv(o)
        B::COP  o
-
-char *
-COP_file(o)
-       B::COP  o
+    ALIAS:
+       file = 1
+    CODE:
+       RETVAL = ix ? CopFILE(o) : CopSTASHPV(o);
+    OUTPUT:
+       RETVAL
 
 #endif
 
@@ -1274,22 +1272,13 @@ COP_arybase(o)
 void
 COP_warnings(o)
        B::COP  o
-       PPCODE:
-#if PERL_VERSION >= 9
-       ST(0) = make_warnings_object(aTHX_ o->cop_warnings);
-#else
-       ST(0) = make_sv_object(aTHX_ NULL, o->cop_warnings);
-#endif
-       XSRETURN(1);
-
-void
-COP_io(o)
-       B::COP  o
-       PPCODE:
+    ALIAS:
+       io = 1
+    PPCODE:
 #if PERL_VERSION >= 9
-       ST(0) = make_cop_io_object(aTHX_ o);
+       ST(0) = ix ? make_cop_io_object(aTHX_ o) : make_warnings_object(aTHX_ o);
 #else
-       ST(0) = make_sv_object(aTHX_ NULL, o->cop_io);
+       ST(0) = make_sv_object(aTHX_ ix ? o->cop_io : o->cop_warnings);
 #endif
        XSRETURN(1);
 
@@ -1495,7 +1484,7 @@ IVX(sv)
        ptr = (ix & 0xFFFF) + (char *)SvANY(sv);
        switch ((U8)(ix >> 16)) {
        case (U8)(sv_SVp >> 16):
-           ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
+           ret = make_sv_object(aTHX_ *((SV **)ptr));
            break;
        case (U8)(sv_IVp >> 16):
            ret = sv_2mortal(newSViv(*((IV *)ptr)));
@@ -1530,6 +1519,8 @@ IVX(sv)
        case (U8)(sv_U16p >> 16):
            ret = sv_2mortal(newSVuv(*((U16 *)ptr)));
            break;
+       default:
+           croak("Illegal alias 0x%08x for B::*IVX", (unsigned)ix);
        }
        ST(0) = ret;
        XSRETURN(1);
@@ -1574,38 +1565,76 @@ SvNV(sv)
 
 MODULE = B     PACKAGE = B::RV         PREFIX = Sv
 
-B::SV
+void
 SvRV(sv)
        B::RV   sv
+    PPCODE:
+       PUSHs(make_sv_object(aTHX_ SvRV(sv)));
 
-#endif
+#else
 
-MODULE = B     PACKAGE = B::PV         PREFIX = Sv
+MODULE = B     PACKAGE = B::REGEXP
 
-char*
-SvPVX(sv)
-       B::PV   sv
+void
+REGEX(sv)
+       B::REGEXP       sv
+    ALIAS:
+       precomp = 1
+    PPCODE:
+       if (ix) {
+           PUSHs(newSVpvn_flags(RX_PRECOMP(sv), RX_PRELEN(sv), SVs_TEMP));
+       } else {
+           dXSTARG;
+           /* FIXME - can we code this method more efficiently?  */
+           PUSHi(PTR2IV(sv));
+       }
 
-B::SV
-SvRV(sv)
+#endif
+
+MODULE = B     PACKAGE = B::PV
+
+void
+RV(sv)
         B::PV   sv
-    CODE:
-        if( SvROK(sv) ) {
-            RETVAL = SvRV(sv);
-        }
-        else {
+    PPCODE:
+        if (!SvROK(sv))
             croak( "argument is not SvROK" );
-        }
-    OUTPUT:
-        RETVAL
+       PUSHs(make_sv_object(aTHX_ SvRV(sv)));
 
 void
-SvPV(sv)
+PV(sv)
        B::PV   sv
+    ALIAS:
+       PVX = 1
+       PVBM = 2
+       B::BM::TABLE = 3
+    PREINIT:
+       const char *p;
+       STRLEN len = 0;
+       U32 utf8 = 0;
     CODE:
-        if( SvPOK(sv) ) {
-           STRLEN len = SvCUR(sv);
-           const char *p = SvPVX_const(sv);
+       if (ix == 3) {
+           p = SvPV(sv, len);
+           /* Boyer-Moore table is just after string and its safety-margin \0 */
+           p += len + PERL_FBM_TABLE_OFFSET;
+           len = 256;
+       } else if (ix == 2) {
+           /* This used to read 257. I think that that was buggy - should have
+              been 258. (The "\0", the flags byte, and 256 for the table.  Not
+              that anything anywhere calls this method.  NWC.  */
+           /* Also, the start pointer has always been SvPVX(sv). Surely it
+              should be SvPVX(sv) + SvCUR(sv)?  The code has faithfully been
+              refactored with this behaviour, since PVBM was added in
+              651aa52ea1faa806.  */
+           p = SvPVX_const(sv);
+           len = SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0);
+       } else if (ix) {
+           p = SvPVX(sv);
+           len = strlen(p);
+       } else if (SvPOK(sv)) {
+           len = SvCUR(sv);
+           p = SvPVX_const(sv);
+           utf8 = SvUTF8(sv);
 #if PERL_VERSION < 10
            /* Before 5.10 (well 931b58fb28fa5ca7), PAD_COMPNAME_GEN was stored
               in SvCUR(), which meant we had to attempt this special casing
@@ -1616,58 +1645,24 @@ SvPV(sv)
                len = strlen(p);
            }
 #endif
-           ST(0) = newSVpvn_flags(p, len, SVs_TEMP | SvUTF8(sv));
         }
         else {
             /* XXX for backward compatibility, but should fail */
             /* croak( "argument is not SvPOK" ); */
-            ST(0) = sv_newmortal();
+           p = NULL;
         }
+       ST(0) = newSVpvn_flags(p, len, SVs_TEMP | utf8);
 
-# This used to read 257. I think that that was buggy - should have been 258.
-# (The "\0", the flags byte, and 256 for the table.  Not that anything
-# anywhere calls this method.  NWC.
-void
-SvPVBM(sv)
-       B::PV   sv
-    CODE:
-        ST(0) = newSVpvn_flags(SvPVX_const(sv),
-           SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0),
-           SVs_TEMP);
-
-MODULE = B     PACKAGE = B::PVMG       PREFIX = Sv
+MODULE = B     PACKAGE = B::PVMG
 
 void
-SvMAGIC(sv)
+MAGIC(sv)
        B::PVMG sv
        MAGIC * mg = NO_INIT
     PPCODE:
        for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
            XPUSHs(make_mg_object(aTHX_ mg));
 
-MODULE = B     PACKAGE = B::REGEXP
-
-#if PERL_VERSION >= 11
-
-IV
-REGEX(sv)
-       B::REGEXP       sv
-    CODE:
-       /* FIXME - can we code this method more efficiently?  */
-       RETVAL = PTR2IV(sv);
-    OUTPUT:
-        RETVAL
-
-SV*
-precomp(sv)
-       B::REGEXP       sv
-    CODE:
-       RETVAL = newSVpvn( RX_PRECOMP(sv), RX_PRELEN(sv) );
-    OUTPUT:
-        RETVAL
-
-#endif
-
 MODULE = B     PACKAGE = B::MAGIC
 
 void
@@ -1677,7 +1672,7 @@ MOREMAGIC(mg)
        PRIVATE = 1
        TYPE = 2
        FLAGS = 3
-       LEN = 4
+       LENGTH = 4
        OBJ = 5
        PTR = 6
        REGEX = 7
@@ -1701,14 +1696,14 @@ MOREMAGIC(mg)
            mPUSHi(mg->mg_len);
            break;
        case 5:
-           PUSHs(make_sv_object(aTHX_ NULL, mg->mg_obj));
+           PUSHs(make_sv_object(aTHX_ mg->mg_obj));
            break;
        case 6:
            if (mg->mg_ptr) {
                if (mg->mg_len >= 0) {
                    PUSHs(newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP));
                } else if (mg->mg_len == HEf_SVKEY) {
-                   PUSHs(make_sv_object(aTHX_ NULL, (SV*)mg->mg_ptr));
+                   PUSHs(make_sv_object(aTHX_ (SV*)mg->mg_ptr));
                } else
                    PUSHs(sv_newmortal());
            } else
@@ -1732,18 +1727,6 @@ MOREMAGIC(mg)
            break;
        }
 
-MODULE = B     PACKAGE = B::BM         PREFIX = Bm
-
-void
-BmTABLE(sv)
-       B::BM   sv
-       STRLEN  len = NO_INIT
-       char *  str = NO_INIT
-    CODE:
-       str = SvPV(sv, len);
-       /* Boyer-Moore table is just after string and its safety-margin \0 */
-       ST(0) = newSVpvn_flags(str + len + PERL_FBM_TABLE_OFFSET, 256, SVs_TEMP);
-
 MODULE = B     PACKAGE = B::GV         PREFIX = Gv
 
 void
@@ -1822,7 +1805,7 @@ SV(gv)
        ptr = (ix & 0xFFFF) + (char *)gp;
        switch ((U8)(ix >> 16)) {
        case (U8)(SVp >> 16):
-           ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
+           ret = make_sv_object(aTHX_ *((SV **)ptr));
            break;
        case (U8)(U32p >> 16):
            ret = sv_2mortal(newSVuv(*((U32*)ptr)));
@@ -1830,13 +1813,17 @@ SV(gv)
        case (U8)(line_tp >> 16):
            ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
            break;
+       default:
+           croak("Illegal alias 0x%08x for B::*SV", (unsigned)ix);
        }
        ST(0) = ret;
        XSRETURN(1);
 
-B::GV
-GvFILEGV(gv)
+void
+FILEGV(gv)
        B::GV   gv
+    PPCODE:
+       PUSHs(make_sv_object(aTHX_ (SV *)GvFILEGV(gv)));
 
 MODULE = B     PACKAGE = B::IO         PREFIX = Io
 
@@ -1885,7 +1872,7 @@ AvARRAY(av)
            SV **svp = AvARRAY(av);
            I32 i;
            for (i = 0; i <= AvFILL(av); i++)
-               XPUSHs(make_sv_object(aTHX_ NULL, svp[i]));
+               XPUSHs(make_sv_object(aTHX_ svp[i]));
        }
 
 void
@@ -1894,9 +1881,9 @@ AvARRAYelt(av, idx)
        int     idx
     PPCODE:
        if (idx >= 0 && AvFILL(av) >= 0 && idx <= AvFILL(av))
-           XPUSHs(make_sv_object(aTHX_ NULL, (AvARRAY(av)[idx])));
+           XPUSHs(make_sv_object(aTHX_ (AvARRAY(av)[idx])));
        else
-           XPUSHs(make_sv_object(aTHX_ NULL, NULL));
+           XPUSHs(make_sv_object(aTHX_ NULL));
 
 #if PERL_VERSION < 9
                                   
@@ -1920,15 +1907,14 @@ U32
 CvCONST(cv)
        B::CV   cv
 
-B::OP
+void
 CvSTART(cv)
        B::CV   cv
     ALIAS:
        ROOT = 1
-    CODE:
-       RETVAL = CvISXSUB(cv) ? NULL : ix ? CvROOT(cv) : CvSTART(cv);
-    OUTPUT:
-       RETVAL
+    PPCODE:
+       PUSHs(make_op_object(aTHX_ CvISXSUB(cv) ? NULL
+                            : ix ? CvROOT(cv) : CvSTART(cv)));
 
 void
 CvXSUB(cv)
@@ -1937,17 +1923,17 @@ CvXSUB(cv)
        XSUBANY = 1
     CODE:
        ST(0) = ix && CvCONST(cv)
-           ? make_sv_object(aTHX_ NULL, (SV *)CvXSUBANY(cv).any_ptr)
+           ? make_sv_object(aTHX_ (SV *)CvXSUBANY(cv).any_ptr)
            : sv_2mortal(newSViv(CvISXSUB(cv)
                                 ? (ix ? CvXSUBANY(cv).any_iv
                                       : PTR2IV(CvXSUB(cv)))
                                 : 0));
 
-MODULE = B     PACKAGE = B::CV         PREFIX = cv_
-
-B::SV
-cv_const_sv(cv)
+void
+const_sv(cv)
        B::CV   cv
+    PPCODE:
+       PUSHs(make_sv_object(aTHX_ (SV *)cv_const_sv(cv)));
 
 MODULE = B     PACKAGE = B::HV         PREFIX = Hv
 
@@ -1964,6 +1950,8 @@ HvRITER(hv)
 B::PMOP
 HvPMROOT(hv)
        B::HV   hv
+    PPCODE:
+       PUSHs(make_op_object(aTHX_ HvPMROOT(hv)));
 
 #endif
 
@@ -1979,32 +1967,30 @@ HvARRAY(hv)
            EXTEND(sp, HvKEYS(hv) * 2);
            while ((sv = hv_iternextsv(hv, &key, &len))) {
                mPUSHp(key, len);
-               PUSHs(make_sv_object(aTHX_ NULL, sv));
+               PUSHs(make_sv_object(aTHX_ sv));
            }
        }
 
 MODULE = B     PACKAGE = B::HE         PREFIX = He
 
-B::SV
+void
 HeVAL(he)
        B::HE he
     ALIAS:
        SVKEY_force = 1
-    CODE:
-       RETVAL = ix ? HeSVKEY_force(he) : HeVAL(he);
-    OUTPUT:
-       RETVAL
+    PPCODE:
+       PUSHs(make_sv_object(aTHX_ ix ? HeSVKEY_force(he) : HeVAL(he)));
 
 U32
 HeHASH(he)
        B::HE he
 
-MODULE = B     PACKAGE = B::RHE        PREFIX = RHE_
+MODULE = B     PACKAGE = B::RHE
 
 #if PERL_VERSION >= 9
 
 SV*
-RHE_HASH(h)
+HASH(h)
        B::RHE h
     CODE:
        RETVAL = newRV( (SV*)cophh_2hv(h, 0) );