3 * Copyright (c) 1996 Malcolm Beattie
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
10 #define PERL_NO_GET_CONTEXT
16 typedef PerlIO * InputStream;
18 typedef FILE * InputStream;
22 static const char* const svclassnames[] = {
29 #if PERL_VERSION <= 10
39 #if PERL_VERSION >= 11
71 static const char* const opclassnames[] = {
86 static const size_t opsizes[] = {
101 #define MY_CXT_KEY "B::_guts" XS_VERSION
104 int x_walkoptree_debug; /* Flag for walkoptree debug hook */
105 SV * x_specialsv_list[7];
110 #define walkoptree_debug (MY_CXT.x_walkoptree_debug)
111 #define specialsv_list (MY_CXT.x_specialsv_list)
114 cc_opclass(pTHX_ const OP *o)
120 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
122 if (o->op_type == OP_SASSIGN)
123 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPc_UNOP : OPc_BINOP);
125 if (o->op_type == OP_AELEMFAST) {
126 if (o->op_flags & OPf_SPECIAL)
137 if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
138 o->op_type == OP_RCATLINE)
142 switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
167 case OA_PVOP_OR_SVOP:
169 * Character translations (tr///) are usually a PVOP, keeping a
170 * pointer to a table of shorts used to look up translations.
171 * Under utf8, however, a simple table isn't practical; instead,
172 * the OP is an SVOP (or, under threads, a PADOP),
173 * and the SV is a reference to a swash
174 * (i.e., an RV pointing to an HV).
176 return (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
177 #if defined(USE_ITHREADS) \
178 && (PERL_VERSION > 8 || (PERL_VERSION == 8 && PERL_SUBVERSION >= 9))
179 ? OPc_PADOP : OPc_PVOP;
181 ? OPc_SVOP : OPc_PVOP;
190 case OA_BASEOP_OR_UNOP:
192 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
193 * whether parens were seen. perly.y uses OPf_SPECIAL to
194 * signal whether a BASEOP had empty parens or none.
195 * Some other UNOPs are created later, though, so the best
196 * test is OPf_KIDS, which is set in newUNOP.
198 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
202 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
203 * the OPf_REF flag to distinguish between OP types instead of the
204 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
205 * return OPc_UNOP so that walkoptree can find our children. If
206 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
207 * (no argument to the operator) it's an OP; with OPf_REF set it's
208 * an SVOP (and op_sv is the GV for the filehandle argument).
210 return ((o->op_flags & OPf_KIDS) ? OPc_UNOP :
212 (o->op_flags & OPf_REF) ? OPc_PADOP : OPc_BASEOP);
214 (o->op_flags & OPf_REF) ? OPc_SVOP : OPc_BASEOP);
218 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
219 * label was omitted (in which case it's a BASEOP) or else a term was
220 * seen. In this last case, all except goto are definitely PVOP but
221 * goto is either a PVOP (with an ordinary constant label), an UNOP
222 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
223 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
226 if (o->op_flags & OPf_STACKED)
228 else if (o->op_flags & OPf_SPECIAL)
233 warn("can't determine class of operator %s, assuming BASEOP\n",
234 PL_op_name[o->op_type]);
239 cc_opclassname(pTHX_ const OP *o)
241 return (char *)opclassnames[cc_opclass(aTHX_ o)];
244 /* FIXME - figure out how to get the typemap to assign this to ST(0), rather
245 than creating a new mortal for ST(0) then passing it in as the first
248 make_sv_object(pTHX_ SV *arg, SV *sv)
250 const char *type = 0;
255 arg = sv_newmortal();
257 for (iv = 0; iv < sizeof(specialsv_list)/sizeof(SV*); iv++) {
258 if (sv == specialsv_list[iv]) {
264 type = svclassnames[SvTYPE(sv)];
267 sv_setiv(newSVrv(arg, type), iv);
271 #if PERL_VERSION >= 9
273 make_temp_object(pTHX_ SV *temp)
276 SV *arg = sv_newmortal();
277 const char *const type = svclassnames[SvTYPE(temp)];
278 const IV iv = PTR2IV(temp);
280 target = newSVrv(arg, type);
281 sv_setiv(target, iv);
283 /* Need to keep our "temp" around as long as the target exists.
284 Simplest way seems to be to hang it from magic, and let that clear
285 it up. No vtable, so won't actually get in the way of anything. */
286 sv_magicext(target, temp, PERL_MAGIC_sv, NULL, NULL, 0);
287 /* magic object has had its reference count increased, so we must drop
294 make_warnings_object(pTHX_ STRLEN *warnings)
296 const char *type = 0;
298 IV iv = sizeof(specialsv_list)/sizeof(SV*);
300 /* Counting down is deliberate. Before the split between make_sv_object
301 and make_warnings_obj there appeared to be a bug - Nullsv and pWARN_STD
302 were both 0, so you could never get a B::SPECIAL for pWARN_STD */
305 if ((SV*)warnings == specialsv_list[iv]) {
311 SV *arg = sv_newmortal();
312 sv_setiv(newSVrv(arg, type), iv);
315 /* B assumes that warnings are a regular SV. Seems easier to keep it
316 happy by making them into a regular SV. */
317 return make_temp_object(aTHX_ newSVpvn((char *)(warnings + 1), *warnings));
322 make_cop_io_object(pTHX_ COP *cop)
324 SV *const value = newSV(0);
326 Perl_emulate_cop_io(aTHX_ cop, value);
329 return make_sv_object(aTHX_ NULL, value);
332 return make_sv_object(aTHX_ NULL, NULL);
338 make_mg_object(pTHX_ MAGIC *mg)
340 SV *arg = sv_newmortal();
341 sv_setiv(newSVrv(arg, "B::MAGIC"), PTR2IV(mg));
346 cstring(pTHX_ SV *sv, bool perlstyle)
351 return newSVpvs_flags("0", SVs_TEMP);
353 sstr = newSVpvs_flags("\"", SVs_TEMP);
355 if (perlstyle && SvUTF8(sv)) {
356 SV *tmpsv = sv_newmortal(); /* Temporary SV to feed sv_uni_display */
357 const STRLEN len = SvCUR(sv);
358 const char *s = sv_uni_display(tmpsv, sv, 8*len, UNI_DISPLAY_QQ);
362 sv_catpvs(sstr, "\\\"");
364 sv_catpvs(sstr, "\\$");
366 sv_catpvs(sstr, "\\@");
369 if (strchr("nrftax\\",*(s+1)))
370 sv_catpvn(sstr, s++, 2);
372 sv_catpvs(sstr, "\\\\");
374 else /* should always be printable */
375 sv_catpvn(sstr, s, 1);
383 const char *s = SvPV(sv, len);
384 for (; len; len--, s++)
386 /* At least try a little for readability */
388 sv_catpvs(sstr, "\\\"");
390 sv_catpvs(sstr, "\\\\");
391 /* trigraphs - bleagh */
392 else if (!perlstyle && *s == '?' && len>=3 && s[1] == '?') {
393 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", '?');
395 else if (perlstyle && *s == '$')
396 sv_catpvs(sstr, "\\$");
397 else if (perlstyle && *s == '@')
398 sv_catpvs(sstr, "\\@");
400 else if (isPRINT(*s))
402 else if (*s >= ' ' && *s < 127)
404 sv_catpvn(sstr, s, 1);
406 sv_catpvs(sstr, "\\n");
408 sv_catpvs(sstr, "\\r");
410 sv_catpvs(sstr, "\\t");
412 sv_catpvs(sstr, "\\a");
414 sv_catpvs(sstr, "\\b");
416 sv_catpvs(sstr, "\\f");
417 else if (!perlstyle && *s == '\v')
418 sv_catpvs(sstr, "\\v");
421 /* Don't want promotion of a signed -1 char in sprintf args */
422 const unsigned char c = (unsigned char) *s;
423 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", c);
425 /* XXX Add line breaks if string is long */
428 sv_catpvs(sstr, "\"");
435 SV *sstr = newSVpvs_flags("'", SVs_TEMP);
436 const char *s = SvPV_nolen(sv);
437 /* Don't want promotion of a signed -1 char in sprintf args */
438 const unsigned char c = (unsigned char) *s;
441 sv_catpvs(sstr, "\\'");
443 sv_catpvs(sstr, "\\\\");
447 else if (c >= ' ' && c < 127)
449 sv_catpvn(sstr, s, 1);
451 sv_catpvs(sstr, "\\n");
453 sv_catpvs(sstr, "\\r");
455 sv_catpvs(sstr, "\\t");
457 sv_catpvs(sstr, "\\a");
459 sv_catpvs(sstr, "\\b");
461 sv_catpvs(sstr, "\\f");
463 sv_catpvs(sstr, "\\v");
465 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", c);
466 sv_catpvs(sstr, "'");
470 #if PERL_VERSION >= 9
471 # define PMOP_pmreplstart(o) o->op_pmstashstartu.op_pmreplstart
472 # define PMOP_pmreplroot(o) o->op_pmreplrootu.op_pmreplroot
474 # define PMOP_pmreplstart(o) o->op_pmreplstart
475 # define PMOP_pmreplroot(o) o->op_pmreplroot
476 # define PMOP_pmpermflags(o) o->op_pmpermflags
477 # define PMOP_pmdynflags(o) o->op_pmdynflags
481 walkoptree(pTHX_ OP *o, const char *method, SV *ref)
486 const char *const classname = cc_opclassname(aTHX_ o);
489 /* Check that no-one has changed our reference, or is holding a reference
491 if (SvREFCNT(ref) == 1 && SvROK(ref) && SvTYPE(ref) == SVt_RV
492 && (object = SvRV(ref)) && SvREFCNT(object) == 1
493 && SvTYPE(object) == SVt_PVMG && SvIOK_only(object)
494 && !SvMAGICAL(object) && !SvMAGIC(object) && SvSTASH(object)) {
495 /* Looks good, so rebless it for the class we need: */
496 sv_bless(ref, gv_stashpv(classname, GV_ADD));
498 /* Need to make a new one. */
499 ref = sv_newmortal();
500 object = newSVrv(ref, classname);
502 sv_setiv(object, PTR2IV(o));
504 if (walkoptree_debug) {
508 perl_call_method("walkoptree_debug", G_DISCARD);
513 perl_call_method(method, G_DISCARD);
514 if (o && (o->op_flags & OPf_KIDS)) {
515 for (kid = ((UNOP*)o)->op_first; kid; kid = kid->op_sibling) {
516 ref = walkoptree(aTHX_ kid, method, ref);
519 if (o && (cc_opclass(aTHX_ o) == OPc_PMOP) && o->op_type != OP_PUSHRE
520 && (kid = PMOP_pmreplroot(cPMOPo)))
522 ref = walkoptree(aTHX_ kid, method, ref);
528 oplist(pTHX_ OP *o, SV **SP)
530 for(; o; o = o->op_next) {
532 #if PERL_VERSION >= 9
541 opsv = sv_newmortal();
542 sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ (OP*)o)), PTR2IV(o));
544 switch (o->op_type) {
546 SP = oplist(aTHX_ PMOP_pmreplstart(cPMOPo), SP);
549 if (o->op_flags & OPf_STACKED && o->op_flags & OPf_SPECIAL) {
550 OP *kid = cLISTOPo->op_first->op_sibling; /* pass pushmark */
551 kid = kUNOP->op_first; /* pass rv2gv */
552 kid = kUNOP->op_first; /* pass leave */
553 SP = oplist(aTHX_ kid->op_next, SP);
557 switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
559 SP = oplist(aTHX_ cLOGOPo->op_other, SP);
562 SP = oplist(aTHX_ cLOOPo->op_lastop, SP);
563 SP = oplist(aTHX_ cLOOPo->op_nextop, SP);
564 SP = oplist(aTHX_ cLOOPo->op_redoop, SP);
572 typedef UNOP *B__UNOP;
573 typedef BINOP *B__BINOP;
574 typedef LOGOP *B__LOGOP;
575 typedef LISTOP *B__LISTOP;
576 typedef PMOP *B__PMOP;
577 typedef SVOP *B__SVOP;
578 typedef PADOP *B__PADOP;
579 typedef PVOP *B__PVOP;
580 typedef LOOP *B__LOOP;
588 #if PERL_VERSION >= 11
589 typedef SV *B__REGEXP;
601 typedef MAGIC *B__MAGIC;
603 #if PERL_VERSION >= 9
604 typedef struct refcounted_he *B__RHE;
608 # define ASSIGN_COMMON_ALIAS(var) \
609 STMT_START { XSANY.any_i32 = offsetof(struct interpreter, var); } STMT_END
611 # define ASSIGN_COMMON_ALIAS(var) \
612 STMT_START { XSANY.any_ptr = (void *)&PL_##var; } STMT_END
615 /* This needs to be ALIASed in a custom way, hence can't easily be defined as
617 static XSPROTO(intrpvar_sv_common); /* prototype to pass -Wmissing-prototypes */
618 static XSPROTO(intrpvar_sv_common)
624 croak_xs_usage(cv, "");
626 ret = *(SV **)(XSANY.any_i32 + (char *)my_perl);
628 ret = *(SV **)(XSANY.any_ptr);
630 ST(0) = make_sv_object(aTHX_ NULL, ret);
634 #include "const-c.inc"
636 MODULE = B PACKAGE = B
638 INCLUDE: const-xs.inc
645 const char *file = __FILE__;
647 specialsv_list[0] = Nullsv;
648 specialsv_list[1] = &PL_sv_undef;
649 specialsv_list[2] = &PL_sv_yes;
650 specialsv_list[3] = &PL_sv_no;
651 specialsv_list[4] = (SV *) pWARN_ALL;
652 specialsv_list[5] = (SV *) pWARN_NONE;
653 specialsv_list[6] = (SV *) pWARN_STD;
655 cv = newXS("B::init_av", intrpvar_sv_common, file);
656 ASSIGN_COMMON_ALIAS(Iinitav);
657 cv = newXS("B::check_av", intrpvar_sv_common, file);
658 ASSIGN_COMMON_ALIAS(Icheckav_save);
659 #if PERL_VERSION >= 9
660 cv = newXS("B::unitcheck_av", intrpvar_sv_common, file);
661 ASSIGN_COMMON_ALIAS(Iunitcheckav_save);
663 cv = newXS("B::begin_av", intrpvar_sv_common, file);
664 ASSIGN_COMMON_ALIAS(Ibeginav_save);
665 cv = newXS("B::end_av", intrpvar_sv_common, file);
666 ASSIGN_COMMON_ALIAS(Iendav);
667 cv = newXS("B::main_cv", intrpvar_sv_common, file);
668 ASSIGN_COMMON_ALIAS(Imain_cv);
669 cv = newXS("B::inc_gv", intrpvar_sv_common, file);
670 ASSIGN_COMMON_ALIAS(Iincgv);
671 cv = newXS("B::defstash", intrpvar_sv_common, file);
672 ASSIGN_COMMON_ALIAS(Idefstash);
673 cv = newXS("B::curstash", intrpvar_sv_common, file);
674 ASSIGN_COMMON_ALIAS(Icurstash);
675 cv = newXS("B::formfeed", intrpvar_sv_common, file);
676 ASSIGN_COMMON_ALIAS(Iformfeed);
678 cv = newXS("B::regex_padav", intrpvar_sv_common, file);
679 ASSIGN_COMMON_ALIAS(Iregex_padav);
681 cv = newXS("B::warnhook", intrpvar_sv_common, file);
682 ASSIGN_COMMON_ALIAS(Iwarnhook);
683 cv = newXS("B::diehook", intrpvar_sv_common, file);
684 ASSIGN_COMMON_ALIAS(Idiehook);
690 RETVAL = PL_amagic_generation;
697 RETVAL = PL_main_cv ? CvPADLIST(PL_main_cv) : CvPADLIST(PL_compcv);
707 RETVAL = ix > 1 ? &PL_sv_yes : ix < 1 ? &PL_sv_undef : &PL_sv_no;
716 RETVAL = ix ? PL_main_start : PL_main_root;
725 RETVAL = ix ? PL_dowarn : PL_sub_generation;
730 walkoptree(op, method)
734 (void) walkoptree(aTHX_ op, method, &PL_sv_undef);
737 walkoptree_debug(...)
740 RETVAL = walkoptree_debug;
741 if (items > 0 && SvTRUE(ST(1)))
742 walkoptree_debug = 1;
746 #define address(sv) PTR2IV(sv)
757 croak("argument is not a reference");
758 RETVAL = (SV*)SvRV(sv);
769 ST(0) = sv_newmortal();
770 if (strncmp(name,"pp_",3) == 0)
772 for (i = 0; i < PL_maxo; i++)
774 if (strcmp(name, PL_op_name[i]) == 0)
780 sv_setiv(ST(0),result);
787 ST(0) = sv_newmortal();
788 if (opnum >= 0 && opnum < PL_maxo) {
789 sv_setpvs(ST(0), "pp_");
790 sv_catpv(ST(0), PL_op_name[opnum]);
799 const char *s = SvPVbyte(sv, len);
800 PERL_HASH(hash, s, len);
801 ST(0) = sv_2mortal(Perl_newSVpvf(aTHX_ "0x%"UVxf, (UV)hash));
803 #define cast_I32(foo) (I32)foo
825 PUSHs(ix == 2 ? cchar(aTHX_ sv) : cstring(aTHX_ sv, ix));
830 #if PERL_VERSION <= 8
831 # ifdef USE_5005THREADS
833 const STRLEN len = strlen(PL_threadsv_names);
836 for (i = 0; i < len; i++)
837 PUSHs(newSVpvn_flags(&PL_threadsv_names[i], 1, SVs_TEMP));
843 #define line_tp 0x20000
845 #define PADOFFSETp 0x40000
848 #define char_pp 0x70000
850 #define OP_next_ix OPp | offsetof(struct op, op_next)
851 #define OP_sibling_ix OPp | offsetof(struct op, op_sibling)
852 #define UNOP_first_ix OPp | offsetof(struct unop, op_first)
853 #define BINOP_last_ix OPp | offsetof(struct binop, op_last)
854 #define LOGOP_other_ix OPp | offsetof(struct logop, op_other)
855 #if PERL_VERSION >= 9
856 # define PMOP_pmreplstart_ix \
857 OPp | offsetof(struct pmop, op_pmstashstartu.op_pmreplstart)
859 # define PMOP_pmreplstart_ix OPp | offsetof(struct pmop, op_pmreplstart)
861 #define LOOP_redoop_ix OPp | offsetof(struct loop, op_redoop)
862 #define LOOP_nextop_ix OPp | offsetof(struct loop, op_nextop)
863 #define LOOP_lastop_ix OPp | offsetof(struct loop, op_lastop)
865 #define OP_targ_ix PADOFFSETp | offsetof(struct op, op_targ)
866 #define OP_flags_ix U8p | offsetof(struct op, op_flags)
867 #define OP_private_ix U8p | offsetof(struct op, op_private)
869 #define PMOP_pmflags_ix U32p | offsetof(struct pmop, op_pmflags)
872 #define PMOP_pmoffset_ix IVp | offsetof(struct pmop, op_pmoffset)
875 # Yes, B::SV::sv and B::SV::gv really do end up generating identical code.
876 #define SVOP_sv_ix SVp | offsetof(struct svop, op_sv)
877 #define SVOP_gv_ix SVp | offsetof(struct svop, op_sv)
879 #define PADOP_padix_ix PADOFFSETp | offsetof(struct padop, op_padix)
881 #define COP_seq_ix U32p | offsetof(struct cop, cop_seq)
882 #define COP_line_ix line_tp | offsetof(struct cop, cop_line)
883 #if PERL_VERSION >= 9
884 #define COP_hints_ix U32p | offsetof(struct cop, cop_hints)
886 #define COP_hints_ix U8p | offsetof(struct cop, op_private)
890 #define COP_stashpv_ix char_pp | offsetof(struct cop, cop_stashpv)
891 #define COP_file_ix char_pp | offsetof(struct cop, cop_file)
893 #define COP_stash_ix SVp | offsetof(struct cop, cop_stash)
894 #define COP_filegv_ix SVp | offsetof(struct cop, cop_filegv)
897 MODULE = B PACKAGE = B::OP PREFIX = OP_
903 RETVAL = opsizes[cc_opclass(aTHX_ o)];
907 # The type checking code in B has always been identical for all OP types,
908 # irrespective of whether the action is actually defined on that OP.
914 B::OP::next = OP_next_ix
915 B::OP::sibling = OP_sibling_ix
916 B::OP::targ = OP_targ_ix
917 B::OP::flags = OP_flags_ix
918 B::OP::private = OP_private_ix
919 B::UNOP::first = UNOP_first_ix
920 B::BINOP::last = BINOP_last_ix
921 B::LOGOP::other = LOGOP_other_ix
922 B::PMOP::pmreplstart = PMOP_pmreplstart_ix
923 B::LOOP::redoop = LOOP_redoop_ix
924 B::LOOP::nextop = LOOP_nextop_ix
925 B::LOOP::lastop = LOOP_lastop_ix
926 B::PMOP::pmflags = PMOP_pmflags_ix
927 B::SVOP::sv = SVOP_sv_ix
928 B::SVOP::gv = SVOP_gv_ix
929 B::PADOP::padix = PADOP_padix_ix
930 B::COP::cop_seq = COP_seq_ix
931 B::COP::line = COP_line_ix
932 B::COP::hints = COP_hints_ix
937 ptr = (ix & 0xFFFF) + (char *)o;
938 switch ((U8)(ix >> 16)) {
939 case (U8)(OPp >> 16):
941 OP *const o2 = *((OP **)ptr);
942 ret = sv_newmortal();
943 sv_setiv(newSVrv(ret, cc_opclassname(aTHX_ o2)), PTR2IV(o2));
946 case (U8)(PADOFFSETp >> 16):
947 ret = sv_2mortal(newSVuv(*((PADOFFSET*)ptr)));
949 case (U8)(U8p >> 16):
950 ret = sv_2mortal(newSVuv(*((U8*)ptr)));
952 case (U8)(U32p >> 16):
953 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
955 case (U8)(SVp >> 16):
956 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
958 case (U8)(line_tp >> 16):
959 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
962 case (U8)(IVp >> 16):
963 ret = sv_2mortal(newSViv(*((IV*)ptr)));
965 case (U8)(char_pp >> 16):
966 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
979 RETVAL = (char *)(ix ? PL_op_desc : PL_op_name)[o->op_type];
988 SV *sv = newSVpvs_flags("PL_ppaddr[OP_", SVs_TEMP);
990 sv_catpv(sv, PL_op_name[o->op_type]);
991 for (i=13; (STRLEN)i < SvCUR(sv); ++i)
992 SvPVX(sv)[i] = toUPPER(SvPVX(sv)[i]);
996 #if PERL_VERSION >= 9
997 # These 3 are all bitfields, so we can't take their addresses.
1010 RETVAL = o->op_spare;
1013 RETVAL = o->op_type;
1031 RETVAL = o->op_type;
1042 SP = oplist(aTHX_ o, SP);
1044 MODULE = B PACKAGE = B::LISTOP PREFIX = LISTOP_
1053 for (kid = o->op_first; kid; kid = kid->op_sibling)
1059 MODULE = B PACKAGE = B::PMOP PREFIX = PMOP_
1061 #if PERL_VERSION <= 8
1068 ST(0) = sv_newmortal();
1069 root = o->op_pmreplroot;
1070 /* OP_PUSHRE stores an SV* instead of an OP* in op_pmreplroot */
1071 if (o->op_type == OP_PUSHRE) {
1072 # ifdef USE_ITHREADS
1073 sv_setiv(ST(0), INT2PTR(PADOFFSET,root) );
1075 sv_setiv(newSVrv(ST(0), root ?
1076 svclassnames[SvTYPE((SV*)root)] : "B::SV"),
1081 sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), PTR2IV(root));
1090 ST(0) = sv_newmortal();
1091 if (o->op_type == OP_PUSHRE) {
1092 # ifdef USE_ITHREADS
1093 sv_setiv(ST(0), o->op_pmreplrootu.op_pmtargetoff);
1095 GV *const target = o->op_pmreplrootu.op_pmtargetgv;
1096 sv_setiv(newSVrv(ST(0), target ?
1097 svclassnames[SvTYPE((SV*)target)] : "B::SV"),
1102 OP *const root = o->op_pmreplrootu.op_pmreplroot;
1103 sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)),
1110 #define PMOP_pmstashpv(o) PmopSTASHPV(o);
1117 #define PMOP_pmstash(o) PmopSTASH(o);
1125 #if PERL_VERSION < 9
1126 #define PMOP_pmnext(o) o->op_pmnext
1150 ST(0) = sv_newmortal();
1152 #if PERL_VERSION >= 9
1154 sv_setuv(ST(0), RX_EXTFLAGS(rx));
1158 sv_setpvn(ST(0), RX_PRECOMP(rx), RX_PRELEN(rx));
1166 cv = newXS("B::PMOP::pmoffset", XS_B__OP_next, __FILE__);
1167 XSANY.any_i32 = PMOP_pmoffset_ix;
1168 cv = newXS("B::COP::stashpv", XS_B__OP_next, __FILE__);
1169 XSANY.any_i32 = COP_stashpv_ix;
1170 cv = newXS("B::COP::file", XS_B__OP_next, __FILE__);
1171 XSANY.any_i32 = COP_file_ix;
1173 cv = newXS("B::COP::stash", XS_B__OP_next, __FILE__);
1174 XSANY.any_i32 = COP_stash_ix;
1175 cv = newXS("B::COP::filegv", XS_B__OP_next, __FILE__);
1176 XSANY.any_i32 = COP_filegv_ix;
1178 #if PERL_VERSION >= 9
1179 cv = newXS("B::PMOP::reflags", XS_B__PMOP_precomp, __FILE__);
1184 MODULE = B PACKAGE = B::PADOP
1192 /* It happens that the output typemaps for B::SV and B::GV are
1193 identical. The "smarts" are in make_sv_object(), which determines
1194 which class to use based on SvTYPE(), rather than anything baked in
1197 RETVAL = PAD_SVl(o->op_padix);
1198 if (ix && SvTYPE(RETVAL) != SVt_PVGV)
1206 MODULE = B PACKAGE = B::PVOP PREFIX = PVOP_
1213 * OP_TRANS uses op_pv to point to a table of 256 or >=258 shorts
1214 * whereas other PVOPs point to a null terminated string.
1216 if ((o->op_type == OP_TRANS || o->op_type == OP_TRANSR) &&
1217 (o->op_private & OPpTRANS_COMPLEMENT) &&
1218 !(o->op_private & OPpTRANS_DELETE))
1220 const short* const tbl = (short*)o->op_pv;
1221 const short entries = 257 + tbl[256];
1222 ST(0) = newSVpvn_flags(o->op_pv, entries * sizeof(short), SVs_TEMP);
1224 else if (o->op_type == OP_TRANS || o->op_type == OP_TRANSR) {
1225 ST(0) = newSVpvn_flags(o->op_pv, 256 * sizeof(short), SVs_TEMP);
1228 ST(0) = newSVpvn_flags(o->op_pv, strlen(o->op_pv), SVs_TEMP);
1230 #define COP_label(o) CopLABEL(o)
1231 #define COP_arybase(o) CopARYBASE_get(o)
1233 MODULE = B PACKAGE = B::COP PREFIX = COP_
1239 # Both pairs of accessors are provided for both ithreads and not, but for each,
1240 # one pair is direct structure access, and 1 pair "faked up" with a more complex
1241 # macro. We implement the direct structure access pair using the common code
1242 # above (B::OP::next)
1245 #define COP_stash(o) CopSTASH(o)
1246 #define COP_filegv(o) CopFILEGV(o)
1257 #define COP_stashpv(o) CopSTASHPV(o)
1258 #define COP_file(o) CopFILE(o)
1278 #if PERL_VERSION >= 9
1279 ST(0) = make_warnings_object(aTHX_ o->cop_warnings);
1281 ST(0) = make_sv_object(aTHX_ NULL, o->cop_warnings);
1289 #if PERL_VERSION >= 9
1290 ST(0) = make_cop_io_object(aTHX_ o);
1292 ST(0) = make_sv_object(aTHX_ NULL, o->cop_io);
1296 #if PERL_VERSION >= 9
1302 RETVAL = CopHINTHASH_get(o);
1308 MODULE = B PACKAGE = B::SV
1310 #define MAGICAL_FLAG_BITS (SVs_GMG|SVs_SMG|SVs_RMG)
1320 MAGICAL = MAGICAL_FLAG_BITS
1322 RETVAL = ix ? (SvFLAGS(sv) & (U32)ix) : SvREFCNT(sv);
1330 ST(0) = sv_2mortal(newRV(sv));
1333 MODULE = B PACKAGE = B::IV PREFIX = Sv
1339 MODULE = B PACKAGE = B::IV
1341 #define sv_SVp 0x00000
1342 #define sv_IVp 0x10000
1343 #define sv_UVp 0x20000
1344 #define sv_STRLENp 0x30000
1345 #define sv_U32p 0x40000
1346 #define sv_U8p 0x50000
1347 #define sv_char_pp 0x60000
1348 #define sv_NVp 0x70000
1349 #define sv_char_p 0x80000
1350 #define sv_SSize_tp 0x90000
1351 #define sv_I32p 0xA0000
1352 #define sv_U16p 0xB0000
1354 #define IV_ivx_ix sv_IVp | offsetof(struct xpviv, xiv_iv)
1355 #define IV_uvx_ix sv_UVp | offsetof(struct xpvuv, xuv_uv)
1356 #define NV_nvx_ix sv_NVp | offsetof(struct xpvnv, xnv_u.xnv_nv)
1358 #if PERL_VERSION >= 10
1359 #define NV_cop_seq_range_low_ix \
1360 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1361 #define NV_cop_seq_range_high_ix \
1362 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1363 #define NV_parent_pad_index_ix \
1364 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1365 #define NV_parent_fakelex_flags_ix \
1366 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1368 #define NV_cop_seq_range_low_ix \
1369 sv_NVp | offsetof(struct xpvnv, xnv_nv)
1370 #define NV_cop_seq_range_high_ix \
1371 sv_UVp | offsetof(struct xpvnv, xuv_uv)
1372 #define NV_parent_pad_index_ix \
1373 sv_NVp | offsetof(struct xpvnv, xnv_nv)
1374 #define NV_parent_fakelex_flags_ix \
1375 sv_UVp | offsetof(struct xpvnv, xuv_uv)
1378 #define PV_cur_ix sv_STRLENp | offsetof(struct xpv, xpv_cur)
1379 #define PV_len_ix sv_STRLENp | offsetof(struct xpv, xpv_len)
1381 #define PVMG_stash_ix sv_SVp | offsetof(struct xpvmg, xmg_stash)
1383 #if PERL_VERSION >= 10
1384 #define PVBM_useful_ix sv_I32p | offsetof(struct xpvgv, xiv_u.xivu_i32)
1385 #define PVBM_previous_ix sv_U32p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_previous)
1386 #define PVBM_rare_ix sv_U8p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_rare)
1388 #define PVBM_useful_ix sv_I32p | offsetof(struct xpvbm, xbm_useful)
1389 #define PVBM_previous_ix sv_U16p | offsetof(struct xpvbm, xbm_previous)
1390 #define PVBM_rare_ix sv_U8p | offsetof(struct xpvbm, xbm_rare)
1393 #define PVLV_targoff_ix sv_U32p | offsetof(struct xpvlv, xlv_targoff)
1394 #define PVLV_targlen_ix sv_U32p | offsetof(struct xpvlv, xlv_targlen)
1395 #define PVLV_targ_ix sv_SVp | offsetof(struct xpvlv, xlv_targ)
1396 #define PVLV_type_ix sv_char_p | offsetof(struct xpvlv, xlv_type)
1398 #if PERL_VERSION >= 10
1399 #define PVGV_stash_ix sv_SVp | offsetof(struct xpvgv, xnv_u.xgv_stash)
1400 #define PVGV_flags_ix sv_STRLENp | offsetof(struct xpvgv, xpv_cur)
1401 #define PVIO_lines_ix sv_IVp | offsetof(struct xpvio, xiv_iv)
1403 #define PVGV_stash_ix sv_SVp | offsetof(struct xpvgv, xgv_stash)
1404 #define PVGV_flags_ix sv_U8p | offsetof(struct xpvgv, xgv_flags)
1405 #define PVIO_lines_ix sv_IVp | offsetof(struct xpvio, xio_lines)
1408 #define PVIO_page_ix sv_IVp | offsetof(struct xpvio, xio_page)
1409 #define PVIO_page_len_ix sv_IVp | offsetof(struct xpvio, xio_page_len)
1410 #define PVIO_lines_left_ix sv_IVp | offsetof(struct xpvio, xio_lines_left)
1411 #define PVIO_top_name_ix sv_char_pp | offsetof(struct xpvio, xio_top_name)
1412 #define PVIO_top_gv_ix sv_SVp | offsetof(struct xpvio, xio_top_gv)
1413 #define PVIO_fmt_name_ix sv_char_pp | offsetof(struct xpvio, xio_fmt_name)
1414 #define PVIO_fmt_gv_ix sv_SVp | offsetof(struct xpvio, xio_fmt_gv)
1415 #define PVIO_bottom_name_ix sv_char_pp | offsetof(struct xpvio, xio_bottom_name)
1416 #define PVIO_bottom_gv_ix sv_SVp | offsetof(struct xpvio, xio_bottom_gv)
1417 #define PVIO_type_ix sv_char_p | offsetof(struct xpvio, xio_type)
1418 #define PVIO_flags_ix sv_U8p | offsetof(struct xpvio, xio_flags)
1420 #define PVAV_max_ix sv_SSize_tp | offsetof(struct xpvav, xav_max)
1422 #define PVFM_lines_ix sv_IVp | offsetof(struct xpvfm, xfm_lines)
1424 #define PVCV_stash_ix sv_SVp | offsetof(struct xpvcv, xcv_stash)
1425 #define PVCV_gv_ix sv_SVp | offsetof(struct xpvcv, xcv_gv)
1426 #define PVCV_file_ix sv_char_pp | offsetof(struct xpvcv, xcv_file)
1427 #define PVCV_depth_ix sv_I32p | offsetof(struct xpvcv, xcv_depth)
1428 #define PVCV_padlist_ix sv_SVp | offsetof(struct xpvcv, xcv_padlist)
1429 #define PVCV_outside_ix sv_SVp | offsetof(struct xpvcv, xcv_outside)
1430 #define PVCV_outside_seq_ix sv_U32p | offsetof(struct xpvcv, xcv_outside_seq)
1431 #define PVCV_flags_ix sv_U16p | offsetof(struct xpvcv, xcv_flags)
1433 #define PVHV_max_ix sv_STRLENp | offsetof(struct xpvhv, xhv_max)
1435 #if PERL_VERSION > 12
1436 #define PVHV_keys_ix sv_STRLENp | offsetof(struct xpvhv, xhv_keys)
1438 #define PVHV_keys_ix sv_IVp | offsetof(struct xpvhv, xhv_keys)
1441 # The type checking code in B has always been identical for all SV types,
1442 # irrespective of whether the action is actually defined on that SV.
1443 # We should fix this
1448 B::IV::IVX = IV_ivx_ix
1449 B::IV::UVX = IV_uvx_ix
1450 B::NV::NVX = NV_nvx_ix
1451 B::NV::COP_SEQ_RANGE_LOW = NV_cop_seq_range_low_ix
1452 B::NV::COP_SEQ_RANGE_HIGH = NV_cop_seq_range_high_ix
1453 B::NV::PARENT_PAD_INDEX = NV_parent_pad_index_ix
1454 B::NV::PARENT_FAKELEX_FLAGS = NV_parent_fakelex_flags_ix
1455 B::PV::CUR = PV_cur_ix
1456 B::PV::LEN = PV_len_ix
1457 B::PVMG::SvSTASH = PVMG_stash_ix
1458 B::PVLV::TARGOFF = PVLV_targoff_ix
1459 B::PVLV::TARGLEN = PVLV_targlen_ix
1460 B::PVLV::TARG = PVLV_targ_ix
1461 B::PVLV::TYPE = PVLV_type_ix
1462 B::GV::STASH = PVGV_stash_ix
1463 B::GV::GvFLAGS = PVGV_flags_ix
1464 B::BM::USEFUL = PVBM_useful_ix
1465 B::BM::PREVIOUS = PVBM_previous_ix
1466 B::BM::RARE = PVBM_rare_ix
1467 B::IO::LINES = PVIO_lines_ix
1468 B::IO::PAGE = PVIO_page_ix
1469 B::IO::PAGE_LEN = PVIO_page_len_ix
1470 B::IO::LINES_LEFT = PVIO_lines_left_ix
1471 B::IO::TOP_NAME = PVIO_top_name_ix
1472 B::IO::TOP_GV = PVIO_top_gv_ix
1473 B::IO::FMT_NAME = PVIO_fmt_name_ix
1474 B::IO::FMT_GV = PVIO_fmt_gv_ix
1475 B::IO::BOTTOM_NAME = PVIO_bottom_name_ix
1476 B::IO::BOTTOM_GV = PVIO_bottom_gv_ix
1477 B::IO::IoTYPE = PVIO_type_ix
1478 B::IO::IoFLAGS = PVIO_flags_ix
1479 B::AV::MAX = PVAV_max_ix
1480 B::FM::LINES = PVFM_lines_ix
1481 B::CV::STASH = PVCV_stash_ix
1482 B::CV::GV = PVCV_gv_ix
1483 B::CV::FILE = PVCV_file_ix
1484 B::CV::DEPTH = PVCV_depth_ix
1485 B::CV::PADLIST = PVCV_padlist_ix
1486 B::CV::OUTSIDE = PVCV_outside_ix
1487 B::CV::OUTSIDE_SEQ = PVCV_outside_seq_ix
1488 B::CV::CvFLAGS = PVCV_flags_ix
1489 B::HV::MAX = PVHV_max_ix
1490 B::HV::KEYS = PVHV_keys_ix
1495 ptr = (ix & 0xFFFF) + (char *)SvANY(sv);
1496 switch ((U8)(ix >> 16)) {
1497 case (U8)(sv_SVp >> 16):
1498 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
1500 case (U8)(sv_IVp >> 16):
1501 ret = sv_2mortal(newSViv(*((IV *)ptr)));
1503 case (U8)(sv_UVp >> 16):
1504 ret = sv_2mortal(newSVuv(*((UV *)ptr)));
1506 case (U8)(sv_STRLENp >> 16):
1507 ret = sv_2mortal(newSVuv(*((STRLEN *)ptr)));
1509 case (U8)(sv_U32p >> 16):
1510 ret = sv_2mortal(newSVuv(*((U32 *)ptr)));
1512 case (U8)(sv_U8p >> 16):
1513 ret = sv_2mortal(newSVuv(*((U8 *)ptr)));
1515 case (U8)(sv_char_pp >> 16):
1516 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
1518 case (U8)(sv_NVp >> 16):
1519 ret = sv_2mortal(newSVnv(*((NV *)ptr)));
1521 case (U8)(sv_char_p >> 16):
1522 ret = newSVpvn_flags((char *)ptr, 1, SVs_TEMP);
1524 case (U8)(sv_SSize_tp >> 16):
1525 ret = sv_2mortal(newSViv(*((SSize_t *)ptr)));
1527 case (U8)(sv_I32p >> 16):
1528 ret = sv_2mortal(newSVuv(*((I32 *)ptr)));
1530 case (U8)(sv_U16p >> 16):
1531 ret = sv_2mortal(newSVuv(*((U16 *)ptr)));
1544 ST(0) = boolSV((I32)SvIVX(sv) != SvIVX(sv));
1545 } else if (sizeof(IV) == 8) {
1547 const IV iv = SvIVX(sv);
1549 * The following way of spelling 32 is to stop compilers on
1550 * 32-bit architectures from moaning about the shift count
1551 * being >= the width of the type. Such architectures don't
1552 * reach this code anyway (unless sizeof(IV) > 8 but then
1553 * everything else breaks too so I'm not fussed at the moment).
1556 wp[0] = htonl(((UV)iv) >> (sizeof(UV)*4));
1558 wp[0] = htonl(((U32)iv) >> (sizeof(UV)*4));
1560 wp[1] = htonl(iv & 0xffffffff);
1561 ST(0) = newSVpvn_flags((char *)wp, 8, SVs_TEMP);
1563 U32 w = htonl((U32)SvIVX(sv));
1564 ST(0) = newSVpvn_flags((char *)&w, 4, SVs_TEMP);
1567 MODULE = B PACKAGE = B::NV PREFIX = Sv
1573 #if PERL_VERSION < 11
1575 MODULE = B PACKAGE = B::RV PREFIX = Sv
1583 MODULE = B PACKAGE = B::REGEXP
1592 PUSHs(newSVpvn_flags(RX_PRECOMP(sv), RX_PRELEN(sv), SVs_TEMP));
1595 /* FIXME - can we code this method more efficiently? */
1601 MODULE = B PACKAGE = B::PV PREFIX = Sv
1611 croak( "argument is not SvROK" );
1629 } else if (SvPOK(sv)) {
1631 p = SvPVX_const(sv);
1633 #if PERL_VERSION < 10
1634 /* Before 5.10 (well 931b58fb28fa5ca7), PAD_COMPNAME_GEN was stored
1635 in SvCUR(), which meant we had to attempt this special casing
1636 to avoid tripping up over variable names in the pads. */
1637 if((SvLEN(sv) && len >= SvLEN(sv))) {
1638 /* It claims to be longer than the space allocated for it -
1639 presuambly it's a variable name in the pad */
1645 /* XXX for backward compatibility, but should fail */
1646 /* croak( "argument is not SvPOK" ); */
1649 ST(0) = newSVpvn_flags(p, len, SVs_TEMP | utf8);
1651 # This used to read 257. I think that that was buggy - should have been 258.
1652 # (The "\0", the flags byte, and 256 for the table. Not that anything
1653 # anywhere calls this method. NWC.
1658 ST(0) = newSVpvn_flags(SvPVX_const(sv),
1659 SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0),
1662 MODULE = B PACKAGE = B::PVMG PREFIX = Sv
1667 MAGIC * mg = NO_INIT
1669 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
1670 XPUSHs(make_mg_object(aTHX_ mg));
1672 MODULE = B PACKAGE = B::MAGIC
1689 XPUSHs(mg->mg_moremagic ? make_mg_object(aTHX_ mg->mg_moremagic)
1693 mPUSHu(mg->mg_private);
1696 PUSHs(newSVpvn_flags(&(mg->mg_type), 1, SVs_TEMP));
1699 mPUSHu(mg->mg_flags);
1705 PUSHs(make_sv_object(aTHX_ NULL, mg->mg_obj));
1709 if (mg->mg_len >= 0) {
1710 PUSHs(newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP));
1711 } else if (mg->mg_len == HEf_SVKEY) {
1712 PUSHs(make_sv_object(aTHX_ NULL, (SV*)mg->mg_ptr));
1714 PUSHs(sv_newmortal());
1716 PUSHs(sv_newmortal());
1719 if(mg->mg_type == PERL_MAGIC_qr) {
1720 mPUSHi(PTR2IV(mg->mg_obj));
1722 croak("REGEX is only meaningful on r-magic");
1726 if (mg->mg_type == PERL_MAGIC_qr) {
1727 REGEXP *rx = (REGEXP *)mg->mg_obj;
1728 PUSHs(newSVpvn_flags(rx ? RX_PRECOMP(rx) : NULL,
1729 rx ? RX_PRELEN(rx) : 0, SVs_TEMP));
1731 croak( "precomp is only meaningful on r-magic" );
1736 MODULE = B PACKAGE = B::BM PREFIX = Bm
1741 STRLEN len = NO_INIT
1742 char * str = NO_INIT
1744 str = SvPV(sv, len);
1745 /* Boyer-Moore table is just after string and its safety-margin \0 */
1746 ST(0) = newSVpvn_flags(str + len + PERL_FBM_TABLE_OFFSET, 256, SVs_TEMP);
1748 MODULE = B PACKAGE = B::GV PREFIX = Gv
1757 #if PERL_VERSION >= 10
1758 ST(0) = sv_2mortal(newSVhek(!ix ? GvNAME_HEK(gv)
1759 : (ix == 1 ? GvFILE_HEK(gv)
1760 : HvNAME_HEK((HV *)gv))));
1762 ST(0) = !ix ? newSVpvn_flags(GvNAME(gv), GvNAMELEN(gv), SVs_TEMP)
1763 : sv_2mortal(newSVpv(ix == 1 ? GvFILE(gv) : HvNAME((HV *)gv), 0))
1773 #if PERL_VERSION >= 9
1774 RETVAL = isGV_with_GP(gv) ? TRUE : FALSE;
1776 RETVAL = TRUE; /* In 5.8 and earlier they all are. */
1779 RETVAL = GvGP(gv) == Null(GP*);
1788 #define GP_sv_ix SVp | offsetof(struct gp, gp_sv)
1789 #define GP_io_ix SVp | offsetof(struct gp, gp_io)
1790 #define GP_cv_ix SVp | offsetof(struct gp, gp_cv)
1791 #define GP_cvgen_ix U32p | offsetof(struct gp, gp_cvgen)
1792 #define GP_refcnt_ix U32p | offsetof(struct gp, gp_refcnt)
1793 #define GP_hv_ix SVp | offsetof(struct gp, gp_hv)
1794 #define GP_av_ix SVp | offsetof(struct gp, gp_av)
1795 #define GP_form_ix SVp | offsetof(struct gp, gp_form)
1796 #define GP_egv_ix SVp | offsetof(struct gp, gp_egv)
1797 #define GP_line_ix line_tp | offsetof(struct gp, gp_line)
1807 GvREFCNT = GP_refcnt_ix
1820 const GV *const gv = CvGV(cv);
1821 Perl_croak(aTHX_ "NULL gp in B::GV::%s", gv ? GvNAME(gv) : "???");
1823 ptr = (ix & 0xFFFF) + (char *)gp;
1824 switch ((U8)(ix >> 16)) {
1825 case (U8)(SVp >> 16):
1826 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
1828 case (U8)(U32p >> 16):
1829 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
1831 case (U8)(line_tp >> 16):
1832 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
1842 MODULE = B PACKAGE = B::IO PREFIX = Io
1844 #if PERL_VERSION <= 8
1859 if( strEQ( name, "stdin" ) ) {
1860 handle = PerlIO_stdin();
1862 else if( strEQ( name, "stdout" ) ) {
1863 handle = PerlIO_stdout();
1865 else if( strEQ( name, "stderr" ) ) {
1866 handle = PerlIO_stderr();
1869 croak( "Invalid value '%s'", name );
1871 RETVAL = handle == IoIFP(io);
1875 MODULE = B PACKAGE = B::AV PREFIX = Av
1885 if (AvFILL(av) >= 0) {
1886 SV **svp = AvARRAY(av);
1888 for (i = 0; i <= AvFILL(av); i++)
1889 XPUSHs(make_sv_object(aTHX_ NULL, svp[i]));
1897 if (idx >= 0 && AvFILL(av) >= 0 && idx <= AvFILL(av))
1898 XPUSHs(make_sv_object(aTHX_ NULL, (AvARRAY(av)[idx])));
1900 XPUSHs(make_sv_object(aTHX_ NULL, NULL));
1902 #if PERL_VERSION < 9
1904 #define AvOFF(av) ((XPVAV*)SvANY(av))->xof_off
1910 MODULE = B PACKAGE = B::AV
1918 MODULE = B PACKAGE = B::CV PREFIX = Cv
1930 RETVAL = CvISXSUB(cv) ? NULL : ix ? CvROOT(cv) : CvSTART(cv);
1940 ST(0) = ix && CvCONST(cv)
1941 ? make_sv_object(aTHX_ NULL, (SV *)CvXSUBANY(cv).any_ptr)
1942 : sv_2mortal(newSViv(CvISXSUB(cv)
1943 ? (ix ? CvXSUBANY(cv).any_iv
1944 : PTR2IV(CvXSUB(cv)))
1947 MODULE = B PACKAGE = B::CV PREFIX = cv_
1953 MODULE = B PACKAGE = B::HV PREFIX = Hv
1963 #if PERL_VERSION < 9
1975 if (HvKEYS(hv) > 0) {
1979 (void)hv_iterinit(hv);
1980 EXTEND(sp, HvKEYS(hv) * 2);
1981 while ((sv = hv_iternextsv(hv, &key, &len))) {
1983 PUSHs(make_sv_object(aTHX_ NULL, sv));
1987 MODULE = B PACKAGE = B::HE PREFIX = He
1995 RETVAL = ix ? HeSVKEY_force(he) : HeVAL(he);
2003 MODULE = B PACKAGE = B::RHE PREFIX = RHE_
2005 #if PERL_VERSION >= 9
2011 RETVAL = newRV( (SV*)cophh_2hv(h, 0) );