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_ const COP *const cop)
296 const STRLEN *const warnings = cop->cop_warnings;
297 const char *type = 0;
299 IV iv = sizeof(specialsv_list)/sizeof(SV*);
301 /* Counting down is deliberate. Before the split between make_sv_object
302 and make_warnings_obj there appeared to be a bug - Nullsv and pWARN_STD
303 were both 0, so you could never get a B::SPECIAL for pWARN_STD */
306 if ((SV*)warnings == specialsv_list[iv]) {
312 SV *arg = sv_newmortal();
313 sv_setiv(newSVrv(arg, type), iv);
316 /* B assumes that warnings are a regular SV. Seems easier to keep it
317 happy by making them into a regular SV. */
318 return make_temp_object(aTHX_ newSVpvn((char *)(warnings + 1), *warnings));
323 make_cop_io_object(pTHX_ COP *cop)
325 SV *const value = newSV(0);
327 Perl_emulate_cop_io(aTHX_ cop, value);
330 return make_sv_object(aTHX_ NULL, value);
333 return make_sv_object(aTHX_ NULL, NULL);
339 make_mg_object(pTHX_ MAGIC *mg)
341 SV *arg = sv_newmortal();
342 sv_setiv(newSVrv(arg, "B::MAGIC"), PTR2IV(mg));
347 cstring(pTHX_ SV *sv, bool perlstyle)
352 return newSVpvs_flags("0", SVs_TEMP);
354 sstr = newSVpvs_flags("\"", SVs_TEMP);
356 if (perlstyle && SvUTF8(sv)) {
357 SV *tmpsv = sv_newmortal(); /* Temporary SV to feed sv_uni_display */
358 const STRLEN len = SvCUR(sv);
359 const char *s = sv_uni_display(tmpsv, sv, 8*len, UNI_DISPLAY_QQ);
363 sv_catpvs(sstr, "\\\"");
365 sv_catpvs(sstr, "\\$");
367 sv_catpvs(sstr, "\\@");
370 if (strchr("nrftax\\",*(s+1)))
371 sv_catpvn(sstr, s++, 2);
373 sv_catpvs(sstr, "\\\\");
375 else /* should always be printable */
376 sv_catpvn(sstr, s, 1);
384 const char *s = SvPV(sv, len);
385 for (; len; len--, s++)
387 /* At least try a little for readability */
389 sv_catpvs(sstr, "\\\"");
391 sv_catpvs(sstr, "\\\\");
392 /* trigraphs - bleagh */
393 else if (!perlstyle && *s == '?' && len>=3 && s[1] == '?') {
394 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", '?');
396 else if (perlstyle && *s == '$')
397 sv_catpvs(sstr, "\\$");
398 else if (perlstyle && *s == '@')
399 sv_catpvs(sstr, "\\@");
401 else if (isPRINT(*s))
403 else if (*s >= ' ' && *s < 127)
405 sv_catpvn(sstr, s, 1);
407 sv_catpvs(sstr, "\\n");
409 sv_catpvs(sstr, "\\r");
411 sv_catpvs(sstr, "\\t");
413 sv_catpvs(sstr, "\\a");
415 sv_catpvs(sstr, "\\b");
417 sv_catpvs(sstr, "\\f");
418 else if (!perlstyle && *s == '\v')
419 sv_catpvs(sstr, "\\v");
422 /* Don't want promotion of a signed -1 char in sprintf args */
423 const unsigned char c = (unsigned char) *s;
424 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", c);
426 /* XXX Add line breaks if string is long */
429 sv_catpvs(sstr, "\"");
436 SV *sstr = newSVpvs_flags("'", SVs_TEMP);
437 const char *s = SvPV_nolen(sv);
438 /* Don't want promotion of a signed -1 char in sprintf args */
439 const unsigned char c = (unsigned char) *s;
442 sv_catpvs(sstr, "\\'");
444 sv_catpvs(sstr, "\\\\");
448 else if (c >= ' ' && c < 127)
450 sv_catpvn(sstr, s, 1);
452 sv_catpvs(sstr, "\\n");
454 sv_catpvs(sstr, "\\r");
456 sv_catpvs(sstr, "\\t");
458 sv_catpvs(sstr, "\\a");
460 sv_catpvs(sstr, "\\b");
462 sv_catpvs(sstr, "\\f");
464 sv_catpvs(sstr, "\\v");
466 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", c);
467 sv_catpvs(sstr, "'");
471 #if PERL_VERSION >= 9
472 # define PMOP_pmreplstart(o) o->op_pmstashstartu.op_pmreplstart
473 # define PMOP_pmreplroot(o) o->op_pmreplrootu.op_pmreplroot
475 # define PMOP_pmreplstart(o) o->op_pmreplstart
476 # define PMOP_pmreplroot(o) o->op_pmreplroot
477 # define PMOP_pmpermflags(o) o->op_pmpermflags
478 # define PMOP_pmdynflags(o) o->op_pmdynflags
482 walkoptree(pTHX_ OP *o, const char *method, SV *ref)
487 const char *const classname = cc_opclassname(aTHX_ o);
490 /* Check that no-one has changed our reference, or is holding a reference
492 if (SvREFCNT(ref) == 1 && SvROK(ref) && SvTYPE(ref) == SVt_RV
493 && (object = SvRV(ref)) && SvREFCNT(object) == 1
494 && SvTYPE(object) == SVt_PVMG && SvIOK_only(object)
495 && !SvMAGICAL(object) && !SvMAGIC(object) && SvSTASH(object)) {
496 /* Looks good, so rebless it for the class we need: */
497 sv_bless(ref, gv_stashpv(classname, GV_ADD));
499 /* Need to make a new one. */
500 ref = sv_newmortal();
501 object = newSVrv(ref, classname);
503 sv_setiv(object, PTR2IV(o));
505 if (walkoptree_debug) {
509 perl_call_method("walkoptree_debug", G_DISCARD);
514 perl_call_method(method, G_DISCARD);
515 if (o && (o->op_flags & OPf_KIDS)) {
516 for (kid = ((UNOP*)o)->op_first; kid; kid = kid->op_sibling) {
517 ref = walkoptree(aTHX_ kid, method, ref);
520 if (o && (cc_opclass(aTHX_ o) == OPc_PMOP) && o->op_type != OP_PUSHRE
521 && (kid = PMOP_pmreplroot(cPMOPo)))
523 ref = walkoptree(aTHX_ kid, method, ref);
529 oplist(pTHX_ OP *o, SV **SP)
531 for(; o; o = o->op_next) {
533 #if PERL_VERSION >= 9
542 opsv = sv_newmortal();
543 sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ (OP*)o)), PTR2IV(o));
545 switch (o->op_type) {
547 SP = oplist(aTHX_ PMOP_pmreplstart(cPMOPo), SP);
550 if (o->op_flags & OPf_STACKED && o->op_flags & OPf_SPECIAL) {
551 OP *kid = cLISTOPo->op_first->op_sibling; /* pass pushmark */
552 kid = kUNOP->op_first; /* pass rv2gv */
553 kid = kUNOP->op_first; /* pass leave */
554 SP = oplist(aTHX_ kid->op_next, SP);
558 switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
560 SP = oplist(aTHX_ cLOGOPo->op_other, SP);
563 SP = oplist(aTHX_ cLOOPo->op_lastop, SP);
564 SP = oplist(aTHX_ cLOOPo->op_nextop, SP);
565 SP = oplist(aTHX_ cLOOPo->op_redoop, SP);
573 typedef UNOP *B__UNOP;
574 typedef BINOP *B__BINOP;
575 typedef LOGOP *B__LOGOP;
576 typedef LISTOP *B__LISTOP;
577 typedef PMOP *B__PMOP;
578 typedef SVOP *B__SVOP;
579 typedef PADOP *B__PADOP;
580 typedef PVOP *B__PVOP;
581 typedef LOOP *B__LOOP;
589 #if PERL_VERSION >= 11
590 typedef SV *B__REGEXP;
602 typedef MAGIC *B__MAGIC;
604 #if PERL_VERSION >= 9
605 typedef struct refcounted_he *B__RHE;
609 # define ASSIGN_COMMON_ALIAS(var) \
610 STMT_START { XSANY.any_i32 = offsetof(struct interpreter, var); } STMT_END
612 # define ASSIGN_COMMON_ALIAS(var) \
613 STMT_START { XSANY.any_ptr = (void *)&PL_##var; } STMT_END
616 /* This needs to be ALIASed in a custom way, hence can't easily be defined as
618 static XSPROTO(intrpvar_sv_common); /* prototype to pass -Wmissing-prototypes */
619 static XSPROTO(intrpvar_sv_common)
625 croak_xs_usage(cv, "");
627 ret = *(SV **)(XSANY.any_i32 + (char *)my_perl);
629 ret = *(SV **)(XSANY.any_ptr);
631 ST(0) = make_sv_object(aTHX_ NULL, ret);
635 #include "const-c.inc"
637 MODULE = B PACKAGE = B
639 INCLUDE: const-xs.inc
646 const char *file = __FILE__;
648 specialsv_list[0] = Nullsv;
649 specialsv_list[1] = &PL_sv_undef;
650 specialsv_list[2] = &PL_sv_yes;
651 specialsv_list[3] = &PL_sv_no;
652 specialsv_list[4] = (SV *) pWARN_ALL;
653 specialsv_list[5] = (SV *) pWARN_NONE;
654 specialsv_list[6] = (SV *) pWARN_STD;
656 cv = newXS("B::init_av", intrpvar_sv_common, file);
657 ASSIGN_COMMON_ALIAS(Iinitav);
658 cv = newXS("B::check_av", intrpvar_sv_common, file);
659 ASSIGN_COMMON_ALIAS(Icheckav_save);
660 #if PERL_VERSION >= 9
661 cv = newXS("B::unitcheck_av", intrpvar_sv_common, file);
662 ASSIGN_COMMON_ALIAS(Iunitcheckav_save);
664 cv = newXS("B::begin_av", intrpvar_sv_common, file);
665 ASSIGN_COMMON_ALIAS(Ibeginav_save);
666 cv = newXS("B::end_av", intrpvar_sv_common, file);
667 ASSIGN_COMMON_ALIAS(Iendav);
668 cv = newXS("B::main_cv", intrpvar_sv_common, file);
669 ASSIGN_COMMON_ALIAS(Imain_cv);
670 cv = newXS("B::inc_gv", intrpvar_sv_common, file);
671 ASSIGN_COMMON_ALIAS(Iincgv);
672 cv = newXS("B::defstash", intrpvar_sv_common, file);
673 ASSIGN_COMMON_ALIAS(Idefstash);
674 cv = newXS("B::curstash", intrpvar_sv_common, file);
675 ASSIGN_COMMON_ALIAS(Icurstash);
676 cv = newXS("B::formfeed", intrpvar_sv_common, file);
677 ASSIGN_COMMON_ALIAS(Iformfeed);
679 cv = newXS("B::regex_padav", intrpvar_sv_common, file);
680 ASSIGN_COMMON_ALIAS(Iregex_padav);
682 cv = newXS("B::warnhook", intrpvar_sv_common, file);
683 ASSIGN_COMMON_ALIAS(Iwarnhook);
684 cv = newXS("B::diehook", intrpvar_sv_common, file);
685 ASSIGN_COMMON_ALIAS(Idiehook);
691 RETVAL = PL_amagic_generation;
698 RETVAL = PL_main_cv ? CvPADLIST(PL_main_cv) : CvPADLIST(PL_compcv);
708 RETVAL = ix > 1 ? &PL_sv_yes : ix < 1 ? &PL_sv_undef : &PL_sv_no;
717 RETVAL = ix ? PL_main_start : PL_main_root;
726 RETVAL = ix ? PL_dowarn : PL_sub_generation;
731 walkoptree(op, method)
735 (void) walkoptree(aTHX_ op, method, &PL_sv_undef);
738 walkoptree_debug(...)
741 RETVAL = walkoptree_debug;
742 if (items > 0 && SvTRUE(ST(1)))
743 walkoptree_debug = 1;
747 #define address(sv) PTR2IV(sv)
758 croak("argument is not a reference");
759 RETVAL = (SV*)SvRV(sv);
770 ST(0) = sv_newmortal();
771 if (strncmp(name,"pp_",3) == 0)
773 for (i = 0; i < PL_maxo; i++)
775 if (strcmp(name, PL_op_name[i]) == 0)
781 sv_setiv(ST(0),result);
788 ST(0) = sv_newmortal();
789 if (opnum >= 0 && opnum < PL_maxo) {
790 sv_setpvs(ST(0), "pp_");
791 sv_catpv(ST(0), PL_op_name[opnum]);
800 const char *s = SvPVbyte(sv, len);
801 PERL_HASH(hash, s, len);
802 ST(0) = sv_2mortal(Perl_newSVpvf(aTHX_ "0x%"UVxf, (UV)hash));
804 #define cast_I32(foo) (I32)foo
826 PUSHs(ix == 2 ? cchar(aTHX_ sv) : cstring(aTHX_ sv, ix));
831 #if PERL_VERSION <= 8
832 # ifdef USE_5005THREADS
834 const STRLEN len = strlen(PL_threadsv_names);
837 for (i = 0; i < len; i++)
838 PUSHs(newSVpvn_flags(&PL_threadsv_names[i], 1, SVs_TEMP));
844 #define line_tp 0x20000
846 #define PADOFFSETp 0x40000
849 #define char_pp 0x70000
851 #define OP_next_ix OPp | offsetof(struct op, op_next)
852 #define OP_sibling_ix OPp | offsetof(struct op, op_sibling)
853 #define UNOP_first_ix OPp | offsetof(struct unop, op_first)
854 #define BINOP_last_ix OPp | offsetof(struct binop, op_last)
855 #define LOGOP_other_ix OPp | offsetof(struct logop, op_other)
856 #if PERL_VERSION >= 9
857 # define PMOP_pmreplstart_ix \
858 OPp | offsetof(struct pmop, op_pmstashstartu.op_pmreplstart)
860 # define PMOP_pmreplstart_ix OPp | offsetof(struct pmop, op_pmreplstart)
862 #define LOOP_redoop_ix OPp | offsetof(struct loop, op_redoop)
863 #define LOOP_nextop_ix OPp | offsetof(struct loop, op_nextop)
864 #define LOOP_lastop_ix OPp | offsetof(struct loop, op_lastop)
866 #define OP_targ_ix PADOFFSETp | offsetof(struct op, op_targ)
867 #define OP_flags_ix U8p | offsetof(struct op, op_flags)
868 #define OP_private_ix U8p | offsetof(struct op, op_private)
870 #define PMOP_pmflags_ix U32p | offsetof(struct pmop, op_pmflags)
873 #define PMOP_pmoffset_ix IVp | offsetof(struct pmop, op_pmoffset)
876 # Yes, B::SV::sv and B::SV::gv really do end up generating identical code.
877 #define SVOP_sv_ix SVp | offsetof(struct svop, op_sv)
878 #define SVOP_gv_ix SVp | offsetof(struct svop, op_sv)
880 #define PADOP_padix_ix PADOFFSETp | offsetof(struct padop, op_padix)
882 #define COP_seq_ix U32p | offsetof(struct cop, cop_seq)
883 #define COP_line_ix line_tp | offsetof(struct cop, cop_line)
884 #if PERL_VERSION >= 9
885 #define COP_hints_ix U32p | offsetof(struct cop, cop_hints)
887 #define COP_hints_ix U8p | offsetof(struct cop, op_private)
891 #define COP_stashpv_ix char_pp | offsetof(struct cop, cop_stashpv)
892 #define COP_file_ix char_pp | offsetof(struct cop, cop_file)
894 #define COP_stash_ix SVp | offsetof(struct cop, cop_stash)
895 #define COP_filegv_ix SVp | offsetof(struct cop, cop_filegv)
898 MODULE = B PACKAGE = B::OP
904 RETVAL = opsizes[cc_opclass(aTHX_ o)];
908 # The type checking code in B has always been identical for all OP types,
909 # irrespective of whether the action is actually defined on that OP.
915 B::OP::next = OP_next_ix
916 B::OP::sibling = OP_sibling_ix
917 B::OP::targ = OP_targ_ix
918 B::OP::flags = OP_flags_ix
919 B::OP::private = OP_private_ix
920 B::UNOP::first = UNOP_first_ix
921 B::BINOP::last = BINOP_last_ix
922 B::LOGOP::other = LOGOP_other_ix
923 B::PMOP::pmreplstart = PMOP_pmreplstart_ix
924 B::LOOP::redoop = LOOP_redoop_ix
925 B::LOOP::nextop = LOOP_nextop_ix
926 B::LOOP::lastop = LOOP_lastop_ix
927 B::PMOP::pmflags = PMOP_pmflags_ix
928 B::SVOP::sv = SVOP_sv_ix
929 B::SVOP::gv = SVOP_gv_ix
930 B::PADOP::padix = PADOP_padix_ix
931 B::COP::cop_seq = COP_seq_ix
932 B::COP::line = COP_line_ix
933 B::COP::hints = COP_hints_ix
938 ptr = (ix & 0xFFFF) + (char *)o;
939 switch ((U8)(ix >> 16)) {
940 case (U8)(OPp >> 16):
942 OP *const o2 = *((OP **)ptr);
943 ret = sv_newmortal();
944 sv_setiv(newSVrv(ret, cc_opclassname(aTHX_ o2)), PTR2IV(o2));
947 case (U8)(PADOFFSETp >> 16):
948 ret = sv_2mortal(newSVuv(*((PADOFFSET*)ptr)));
950 case (U8)(U8p >> 16):
951 ret = sv_2mortal(newSVuv(*((U8*)ptr)));
953 case (U8)(U32p >> 16):
954 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
956 case (U8)(SVp >> 16):
957 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
959 case (U8)(line_tp >> 16):
960 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
963 case (U8)(IVp >> 16):
964 ret = sv_2mortal(newSViv(*((IV*)ptr)));
966 case (U8)(char_pp >> 16):
967 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
980 RETVAL = (char *)(ix ? PL_op_desc : PL_op_name)[o->op_type];
989 SV *sv = newSVpvs_flags("PL_ppaddr[OP_", SVs_TEMP);
991 sv_catpv(sv, PL_op_name[o->op_type]);
992 for (i=13; (STRLEN)i < SvCUR(sv); ++i)
993 SvPVX(sv)[i] = toUPPER(SvPVX(sv)[i]);
997 #if PERL_VERSION >= 9
998 # These 3 are all bitfields, so we can't take their addresses.
1011 RETVAL = o->op_spare;
1014 RETVAL = o->op_type;
1032 RETVAL = o->op_type;
1043 SP = oplist(aTHX_ o, SP);
1045 MODULE = B PACKAGE = B::LISTOP
1054 for (kid = o->op_first; kid; kid = kid->op_sibling)
1060 MODULE = B PACKAGE = B::PMOP PREFIX = PMOP_
1062 #if PERL_VERSION <= 8
1069 ST(0) = sv_newmortal();
1070 root = o->op_pmreplroot;
1071 /* OP_PUSHRE stores an SV* instead of an OP* in op_pmreplroot */
1072 if (o->op_type == OP_PUSHRE) {
1073 # ifdef USE_ITHREADS
1074 sv_setiv(ST(0), INT2PTR(PADOFFSET,root) );
1076 sv_setiv(newSVrv(ST(0), root ?
1077 svclassnames[SvTYPE((SV*)root)] : "B::SV"),
1082 sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), PTR2IV(root));
1091 ST(0) = sv_newmortal();
1092 if (o->op_type == OP_PUSHRE) {
1093 # ifdef USE_ITHREADS
1094 sv_setiv(ST(0), o->op_pmreplrootu.op_pmtargetoff);
1096 GV *const target = o->op_pmreplrootu.op_pmtargetgv;
1097 sv_setiv(newSVrv(ST(0), target ?
1098 svclassnames[SvTYPE((SV*)target)] : "B::SV"),
1103 OP *const root = o->op_pmreplrootu.op_pmreplroot;
1104 sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)),
1111 #define PMOP_pmstashpv(o) PmopSTASHPV(o);
1118 #define PMOP_pmstash(o) PmopSTASH(o);
1126 #if PERL_VERSION < 9
1127 #define PMOP_pmnext(o) o->op_pmnext
1151 ST(0) = sv_newmortal();
1153 #if PERL_VERSION >= 9
1155 sv_setuv(ST(0), RX_EXTFLAGS(rx));
1159 sv_setpvn(ST(0), RX_PRECOMP(rx), RX_PRELEN(rx));
1167 cv = newXS("B::PMOP::pmoffset", XS_B__OP_next, __FILE__);
1168 XSANY.any_i32 = PMOP_pmoffset_ix;
1169 cv = newXS("B::COP::stashpv", XS_B__OP_next, __FILE__);
1170 XSANY.any_i32 = COP_stashpv_ix;
1171 cv = newXS("B::COP::file", XS_B__OP_next, __FILE__);
1172 XSANY.any_i32 = COP_file_ix;
1174 cv = newXS("B::COP::stash", XS_B__OP_next, __FILE__);
1175 XSANY.any_i32 = COP_stash_ix;
1176 cv = newXS("B::COP::filegv", XS_B__OP_next, __FILE__);
1177 XSANY.any_i32 = COP_filegv_ix;
1179 #if PERL_VERSION >= 9
1180 cv = newXS("B::PMOP::reflags", XS_B__PMOP_precomp, __FILE__);
1185 MODULE = B PACKAGE = B::PADOP
1193 /* It happens that the output typemaps for B::SV and B::GV are
1194 identical. The "smarts" are in make_sv_object(), which determines
1195 which class to use based on SvTYPE(), rather than anything baked in
1198 RETVAL = PAD_SVl(o->op_padix);
1199 if (ix && SvTYPE(RETVAL) != SVt_PVGV)
1207 MODULE = B PACKAGE = B::PVOP
1214 * OP_TRANS uses op_pv to point to a table of 256 or >=258 shorts
1215 * whereas other PVOPs point to a null terminated string.
1217 if ((o->op_type == OP_TRANS || o->op_type == OP_TRANSR) &&
1218 (o->op_private & OPpTRANS_COMPLEMENT) &&
1219 !(o->op_private & OPpTRANS_DELETE))
1221 const short* const tbl = (short*)o->op_pv;
1222 const short entries = 257 + tbl[256];
1223 ST(0) = newSVpvn_flags(o->op_pv, entries * sizeof(short), SVs_TEMP);
1225 else if (o->op_type == OP_TRANS || o->op_type == OP_TRANSR) {
1226 ST(0) = newSVpvn_flags(o->op_pv, 256 * sizeof(short), SVs_TEMP);
1229 ST(0) = newSVpvn_flags(o->op_pv, strlen(o->op_pv), SVs_TEMP);
1231 #define COP_label(o) CopLABEL(o)
1232 #define COP_arybase(o) CopARYBASE_get(o)
1234 MODULE = B PACKAGE = B::COP PREFIX = COP_
1240 # Both pairs of accessors are provided for both ithreads and not, but for each,
1241 # one pair is direct structure access, and 1 pair "faked up" with a more complex
1242 # macro. We implement the direct structure access pair using the common code
1243 # above (B::OP::next)
1253 RETVAL = ix ? (SV *)CopFILEGV(o) : (SV *)CopSTASH(o);
1265 RETVAL = ix ? CopFILE(o) : CopSTASHPV(o);
1281 #if PERL_VERSION >= 9
1282 ST(0) = ix ? make_cop_io_object(aTHX_ o) : make_warnings_object(aTHX_ o);
1284 ST(0) = make_sv_object(aTHX_ NULL, ix ? o->cop_io : o->cop_warnings);
1288 #if PERL_VERSION >= 9
1294 RETVAL = CopHINTHASH_get(o);
1300 MODULE = B PACKAGE = B::SV
1302 #define MAGICAL_FLAG_BITS (SVs_GMG|SVs_SMG|SVs_RMG)
1312 MAGICAL = MAGICAL_FLAG_BITS
1314 RETVAL = ix ? (SvFLAGS(sv) & (U32)ix) : SvREFCNT(sv);
1322 ST(0) = sv_2mortal(newRV(sv));
1325 MODULE = B PACKAGE = B::IV PREFIX = Sv
1331 MODULE = B PACKAGE = B::IV
1333 #define sv_SVp 0x00000
1334 #define sv_IVp 0x10000
1335 #define sv_UVp 0x20000
1336 #define sv_STRLENp 0x30000
1337 #define sv_U32p 0x40000
1338 #define sv_U8p 0x50000
1339 #define sv_char_pp 0x60000
1340 #define sv_NVp 0x70000
1341 #define sv_char_p 0x80000
1342 #define sv_SSize_tp 0x90000
1343 #define sv_I32p 0xA0000
1344 #define sv_U16p 0xB0000
1346 #define IV_ivx_ix sv_IVp | offsetof(struct xpviv, xiv_iv)
1347 #define IV_uvx_ix sv_UVp | offsetof(struct xpvuv, xuv_uv)
1348 #define NV_nvx_ix sv_NVp | offsetof(struct xpvnv, xnv_u.xnv_nv)
1350 #if PERL_VERSION >= 10
1351 #define NV_cop_seq_range_low_ix \
1352 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1353 #define NV_cop_seq_range_high_ix \
1354 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1355 #define NV_parent_pad_index_ix \
1356 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1357 #define NV_parent_fakelex_flags_ix \
1358 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1360 #define NV_cop_seq_range_low_ix \
1361 sv_NVp | offsetof(struct xpvnv, xnv_nv)
1362 #define NV_cop_seq_range_high_ix \
1363 sv_UVp | offsetof(struct xpvnv, xuv_uv)
1364 #define NV_parent_pad_index_ix \
1365 sv_NVp | offsetof(struct xpvnv, xnv_nv)
1366 #define NV_parent_fakelex_flags_ix \
1367 sv_UVp | offsetof(struct xpvnv, xuv_uv)
1370 #define PV_cur_ix sv_STRLENp | offsetof(struct xpv, xpv_cur)
1371 #define PV_len_ix sv_STRLENp | offsetof(struct xpv, xpv_len)
1373 #define PVMG_stash_ix sv_SVp | offsetof(struct xpvmg, xmg_stash)
1375 #if PERL_VERSION >= 10
1376 #define PVBM_useful_ix sv_I32p | offsetof(struct xpvgv, xiv_u.xivu_i32)
1377 #define PVBM_previous_ix sv_U32p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_previous)
1378 #define PVBM_rare_ix sv_U8p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_rare)
1380 #define PVBM_useful_ix sv_I32p | offsetof(struct xpvbm, xbm_useful)
1381 #define PVBM_previous_ix sv_U16p | offsetof(struct xpvbm, xbm_previous)
1382 #define PVBM_rare_ix sv_U8p | offsetof(struct xpvbm, xbm_rare)
1385 #define PVLV_targoff_ix sv_U32p | offsetof(struct xpvlv, xlv_targoff)
1386 #define PVLV_targlen_ix sv_U32p | offsetof(struct xpvlv, xlv_targlen)
1387 #define PVLV_targ_ix sv_SVp | offsetof(struct xpvlv, xlv_targ)
1388 #define PVLV_type_ix sv_char_p | offsetof(struct xpvlv, xlv_type)
1390 #if PERL_VERSION >= 10
1391 #define PVGV_stash_ix sv_SVp | offsetof(struct xpvgv, xnv_u.xgv_stash)
1392 #define PVGV_flags_ix sv_STRLENp | offsetof(struct xpvgv, xpv_cur)
1393 #define PVIO_lines_ix sv_IVp | offsetof(struct xpvio, xiv_iv)
1395 #define PVGV_stash_ix sv_SVp | offsetof(struct xpvgv, xgv_stash)
1396 #define PVGV_flags_ix sv_U8p | offsetof(struct xpvgv, xgv_flags)
1397 #define PVIO_lines_ix sv_IVp | offsetof(struct xpvio, xio_lines)
1400 #define PVIO_page_ix sv_IVp | offsetof(struct xpvio, xio_page)
1401 #define PVIO_page_len_ix sv_IVp | offsetof(struct xpvio, xio_page_len)
1402 #define PVIO_lines_left_ix sv_IVp | offsetof(struct xpvio, xio_lines_left)
1403 #define PVIO_top_name_ix sv_char_pp | offsetof(struct xpvio, xio_top_name)
1404 #define PVIO_top_gv_ix sv_SVp | offsetof(struct xpvio, xio_top_gv)
1405 #define PVIO_fmt_name_ix sv_char_pp | offsetof(struct xpvio, xio_fmt_name)
1406 #define PVIO_fmt_gv_ix sv_SVp | offsetof(struct xpvio, xio_fmt_gv)
1407 #define PVIO_bottom_name_ix sv_char_pp | offsetof(struct xpvio, xio_bottom_name)
1408 #define PVIO_bottom_gv_ix sv_SVp | offsetof(struct xpvio, xio_bottom_gv)
1409 #define PVIO_type_ix sv_char_p | offsetof(struct xpvio, xio_type)
1410 #define PVIO_flags_ix sv_U8p | offsetof(struct xpvio, xio_flags)
1412 #define PVAV_max_ix sv_SSize_tp | offsetof(struct xpvav, xav_max)
1414 #define PVFM_lines_ix sv_IVp | offsetof(struct xpvfm, xfm_lines)
1416 #define PVCV_stash_ix sv_SVp | offsetof(struct xpvcv, xcv_stash)
1417 #define PVCV_gv_ix sv_SVp | offsetof(struct xpvcv, xcv_gv)
1418 #define PVCV_file_ix sv_char_pp | offsetof(struct xpvcv, xcv_file)
1419 #define PVCV_depth_ix sv_I32p | offsetof(struct xpvcv, xcv_depth)
1420 #define PVCV_padlist_ix sv_SVp | offsetof(struct xpvcv, xcv_padlist)
1421 #define PVCV_outside_ix sv_SVp | offsetof(struct xpvcv, xcv_outside)
1422 #define PVCV_outside_seq_ix sv_U32p | offsetof(struct xpvcv, xcv_outside_seq)
1423 #define PVCV_flags_ix sv_U16p | offsetof(struct xpvcv, xcv_flags)
1425 #define PVHV_max_ix sv_STRLENp | offsetof(struct xpvhv, xhv_max)
1427 #if PERL_VERSION > 12
1428 #define PVHV_keys_ix sv_STRLENp | offsetof(struct xpvhv, xhv_keys)
1430 #define PVHV_keys_ix sv_IVp | offsetof(struct xpvhv, xhv_keys)
1433 # The type checking code in B has always been identical for all SV types,
1434 # irrespective of whether the action is actually defined on that SV.
1435 # We should fix this
1440 B::IV::IVX = IV_ivx_ix
1441 B::IV::UVX = IV_uvx_ix
1442 B::NV::NVX = NV_nvx_ix
1443 B::NV::COP_SEQ_RANGE_LOW = NV_cop_seq_range_low_ix
1444 B::NV::COP_SEQ_RANGE_HIGH = NV_cop_seq_range_high_ix
1445 B::NV::PARENT_PAD_INDEX = NV_parent_pad_index_ix
1446 B::NV::PARENT_FAKELEX_FLAGS = NV_parent_fakelex_flags_ix
1447 B::PV::CUR = PV_cur_ix
1448 B::PV::LEN = PV_len_ix
1449 B::PVMG::SvSTASH = PVMG_stash_ix
1450 B::PVLV::TARGOFF = PVLV_targoff_ix
1451 B::PVLV::TARGLEN = PVLV_targlen_ix
1452 B::PVLV::TARG = PVLV_targ_ix
1453 B::PVLV::TYPE = PVLV_type_ix
1454 B::GV::STASH = PVGV_stash_ix
1455 B::GV::GvFLAGS = PVGV_flags_ix
1456 B::BM::USEFUL = PVBM_useful_ix
1457 B::BM::PREVIOUS = PVBM_previous_ix
1458 B::BM::RARE = PVBM_rare_ix
1459 B::IO::LINES = PVIO_lines_ix
1460 B::IO::PAGE = PVIO_page_ix
1461 B::IO::PAGE_LEN = PVIO_page_len_ix
1462 B::IO::LINES_LEFT = PVIO_lines_left_ix
1463 B::IO::TOP_NAME = PVIO_top_name_ix
1464 B::IO::TOP_GV = PVIO_top_gv_ix
1465 B::IO::FMT_NAME = PVIO_fmt_name_ix
1466 B::IO::FMT_GV = PVIO_fmt_gv_ix
1467 B::IO::BOTTOM_NAME = PVIO_bottom_name_ix
1468 B::IO::BOTTOM_GV = PVIO_bottom_gv_ix
1469 B::IO::IoTYPE = PVIO_type_ix
1470 B::IO::IoFLAGS = PVIO_flags_ix
1471 B::AV::MAX = PVAV_max_ix
1472 B::FM::LINES = PVFM_lines_ix
1473 B::CV::STASH = PVCV_stash_ix
1474 B::CV::GV = PVCV_gv_ix
1475 B::CV::FILE = PVCV_file_ix
1476 B::CV::DEPTH = PVCV_depth_ix
1477 B::CV::PADLIST = PVCV_padlist_ix
1478 B::CV::OUTSIDE = PVCV_outside_ix
1479 B::CV::OUTSIDE_SEQ = PVCV_outside_seq_ix
1480 B::CV::CvFLAGS = PVCV_flags_ix
1481 B::HV::MAX = PVHV_max_ix
1482 B::HV::KEYS = PVHV_keys_ix
1487 ptr = (ix & 0xFFFF) + (char *)SvANY(sv);
1488 switch ((U8)(ix >> 16)) {
1489 case (U8)(sv_SVp >> 16):
1490 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
1492 case (U8)(sv_IVp >> 16):
1493 ret = sv_2mortal(newSViv(*((IV *)ptr)));
1495 case (U8)(sv_UVp >> 16):
1496 ret = sv_2mortal(newSVuv(*((UV *)ptr)));
1498 case (U8)(sv_STRLENp >> 16):
1499 ret = sv_2mortal(newSVuv(*((STRLEN *)ptr)));
1501 case (U8)(sv_U32p >> 16):
1502 ret = sv_2mortal(newSVuv(*((U32 *)ptr)));
1504 case (U8)(sv_U8p >> 16):
1505 ret = sv_2mortal(newSVuv(*((U8 *)ptr)));
1507 case (U8)(sv_char_pp >> 16):
1508 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
1510 case (U8)(sv_NVp >> 16):
1511 ret = sv_2mortal(newSVnv(*((NV *)ptr)));
1513 case (U8)(sv_char_p >> 16):
1514 ret = newSVpvn_flags((char *)ptr, 1, SVs_TEMP);
1516 case (U8)(sv_SSize_tp >> 16):
1517 ret = sv_2mortal(newSViv(*((SSize_t *)ptr)));
1519 case (U8)(sv_I32p >> 16):
1520 ret = sv_2mortal(newSVuv(*((I32 *)ptr)));
1522 case (U8)(sv_U16p >> 16):
1523 ret = sv_2mortal(newSVuv(*((U16 *)ptr)));
1536 ST(0) = boolSV((I32)SvIVX(sv) != SvIVX(sv));
1537 } else if (sizeof(IV) == 8) {
1539 const IV iv = SvIVX(sv);
1541 * The following way of spelling 32 is to stop compilers on
1542 * 32-bit architectures from moaning about the shift count
1543 * being >= the width of the type. Such architectures don't
1544 * reach this code anyway (unless sizeof(IV) > 8 but then
1545 * everything else breaks too so I'm not fussed at the moment).
1548 wp[0] = htonl(((UV)iv) >> (sizeof(UV)*4));
1550 wp[0] = htonl(((U32)iv) >> (sizeof(UV)*4));
1552 wp[1] = htonl(iv & 0xffffffff);
1553 ST(0) = newSVpvn_flags((char *)wp, 8, SVs_TEMP);
1555 U32 w = htonl((U32)SvIVX(sv));
1556 ST(0) = newSVpvn_flags((char *)&w, 4, SVs_TEMP);
1559 MODULE = B PACKAGE = B::NV PREFIX = Sv
1565 #if PERL_VERSION < 11
1567 MODULE = B PACKAGE = B::RV PREFIX = Sv
1575 MODULE = B PACKAGE = B::REGEXP
1584 PUSHs(newSVpvn_flags(RX_PRECOMP(sv), RX_PRELEN(sv), SVs_TEMP));
1587 /* FIXME - can we code this method more efficiently? */
1593 MODULE = B PACKAGE = B::PV
1603 croak( "argument is not SvROK" );
1622 /* Boyer-Moore table is just after string and its safety-margin \0 */
1623 p += len + PERL_FBM_TABLE_OFFSET;
1625 } else if (ix == 2) {
1626 /* This used to read 257. I think that that was buggy - should have
1627 been 258. (The "\0", the flags byte, and 256 for the table. Not
1628 that anything anywhere calls this method. NWC. */
1629 /* Also, the start pointer has always been SvPVX(sv). Surely it
1630 should be SvPVX(sv) + SvCUR(sv)? The code has faithfully been
1631 refactored with this behaviour, since PVBM was added in
1632 651aa52ea1faa806. */
1633 p = SvPVX_const(sv);
1634 len = SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0);
1638 } else if (SvPOK(sv)) {
1640 p = SvPVX_const(sv);
1642 #if PERL_VERSION < 10
1643 /* Before 5.10 (well 931b58fb28fa5ca7), PAD_COMPNAME_GEN was stored
1644 in SvCUR(), which meant we had to attempt this special casing
1645 to avoid tripping up over variable names in the pads. */
1646 if((SvLEN(sv) && len >= SvLEN(sv))) {
1647 /* It claims to be longer than the space allocated for it -
1648 presuambly it's a variable name in the pad */
1654 /* XXX for backward compatibility, but should fail */
1655 /* croak( "argument is not SvPOK" ); */
1658 ST(0) = newSVpvn_flags(p, len, SVs_TEMP | utf8);
1660 MODULE = B PACKAGE = B::PVMG
1665 MAGIC * mg = NO_INIT
1667 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
1668 XPUSHs(make_mg_object(aTHX_ mg));
1670 MODULE = B PACKAGE = B::MAGIC
1687 XPUSHs(mg->mg_moremagic ? make_mg_object(aTHX_ mg->mg_moremagic)
1691 mPUSHu(mg->mg_private);
1694 PUSHs(newSVpvn_flags(&(mg->mg_type), 1, SVs_TEMP));
1697 mPUSHu(mg->mg_flags);
1703 PUSHs(make_sv_object(aTHX_ NULL, mg->mg_obj));
1707 if (mg->mg_len >= 0) {
1708 PUSHs(newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP));
1709 } else if (mg->mg_len == HEf_SVKEY) {
1710 PUSHs(make_sv_object(aTHX_ NULL, (SV*)mg->mg_ptr));
1712 PUSHs(sv_newmortal());
1714 PUSHs(sv_newmortal());
1717 if(mg->mg_type == PERL_MAGIC_qr) {
1718 mPUSHi(PTR2IV(mg->mg_obj));
1720 croak("REGEX is only meaningful on r-magic");
1724 if (mg->mg_type == PERL_MAGIC_qr) {
1725 REGEXP *rx = (REGEXP *)mg->mg_obj;
1726 PUSHs(newSVpvn_flags(rx ? RX_PRECOMP(rx) : NULL,
1727 rx ? RX_PRELEN(rx) : 0, SVs_TEMP));
1729 croak( "precomp is only meaningful on r-magic" );
1734 MODULE = B PACKAGE = B::GV PREFIX = Gv
1743 #if PERL_VERSION >= 10
1744 ST(0) = sv_2mortal(newSVhek(!ix ? GvNAME_HEK(gv)
1745 : (ix == 1 ? GvFILE_HEK(gv)
1746 : HvNAME_HEK((HV *)gv))));
1748 ST(0) = !ix ? newSVpvn_flags(GvNAME(gv), GvNAMELEN(gv), SVs_TEMP)
1749 : sv_2mortal(newSVpv(ix == 1 ? GvFILE(gv) : HvNAME((HV *)gv), 0))
1759 #if PERL_VERSION >= 9
1760 RETVAL = isGV_with_GP(gv) ? TRUE : FALSE;
1762 RETVAL = TRUE; /* In 5.8 and earlier they all are. */
1765 RETVAL = GvGP(gv) == Null(GP*);
1774 #define GP_sv_ix SVp | offsetof(struct gp, gp_sv)
1775 #define GP_io_ix SVp | offsetof(struct gp, gp_io)
1776 #define GP_cv_ix SVp | offsetof(struct gp, gp_cv)
1777 #define GP_cvgen_ix U32p | offsetof(struct gp, gp_cvgen)
1778 #define GP_refcnt_ix U32p | offsetof(struct gp, gp_refcnt)
1779 #define GP_hv_ix SVp | offsetof(struct gp, gp_hv)
1780 #define GP_av_ix SVp | offsetof(struct gp, gp_av)
1781 #define GP_form_ix SVp | offsetof(struct gp, gp_form)
1782 #define GP_egv_ix SVp | offsetof(struct gp, gp_egv)
1783 #define GP_line_ix line_tp | offsetof(struct gp, gp_line)
1793 GvREFCNT = GP_refcnt_ix
1806 const GV *const gv = CvGV(cv);
1807 Perl_croak(aTHX_ "NULL gp in B::GV::%s", gv ? GvNAME(gv) : "???");
1809 ptr = (ix & 0xFFFF) + (char *)gp;
1810 switch ((U8)(ix >> 16)) {
1811 case (U8)(SVp >> 16):
1812 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
1814 case (U8)(U32p >> 16):
1815 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
1817 case (U8)(line_tp >> 16):
1818 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
1828 MODULE = B PACKAGE = B::IO PREFIX = Io
1830 #if PERL_VERSION <= 8
1845 if( strEQ( name, "stdin" ) ) {
1846 handle = PerlIO_stdin();
1848 else if( strEQ( name, "stdout" ) ) {
1849 handle = PerlIO_stdout();
1851 else if( strEQ( name, "stderr" ) ) {
1852 handle = PerlIO_stderr();
1855 croak( "Invalid value '%s'", name );
1857 RETVAL = handle == IoIFP(io);
1861 MODULE = B PACKAGE = B::AV PREFIX = Av
1871 if (AvFILL(av) >= 0) {
1872 SV **svp = AvARRAY(av);
1874 for (i = 0; i <= AvFILL(av); i++)
1875 XPUSHs(make_sv_object(aTHX_ NULL, svp[i]));
1883 if (idx >= 0 && AvFILL(av) >= 0 && idx <= AvFILL(av))
1884 XPUSHs(make_sv_object(aTHX_ NULL, (AvARRAY(av)[idx])));
1886 XPUSHs(make_sv_object(aTHX_ NULL, NULL));
1888 #if PERL_VERSION < 9
1890 #define AvOFF(av) ((XPVAV*)SvANY(av))->xof_off
1896 MODULE = B PACKAGE = B::AV
1904 MODULE = B PACKAGE = B::CV PREFIX = Cv
1916 RETVAL = CvISXSUB(cv) ? NULL : ix ? CvROOT(cv) : CvSTART(cv);
1926 ST(0) = ix && CvCONST(cv)
1927 ? make_sv_object(aTHX_ NULL, (SV *)CvXSUBANY(cv).any_ptr)
1928 : sv_2mortal(newSViv(CvISXSUB(cv)
1929 ? (ix ? CvXSUBANY(cv).any_iv
1930 : PTR2IV(CvXSUB(cv)))
1933 MODULE = B PACKAGE = B::CV PREFIX = cv_
1939 MODULE = B PACKAGE = B::HV PREFIX = Hv
1949 #if PERL_VERSION < 9
1961 if (HvKEYS(hv) > 0) {
1965 (void)hv_iterinit(hv);
1966 EXTEND(sp, HvKEYS(hv) * 2);
1967 while ((sv = hv_iternextsv(hv, &key, &len))) {
1969 PUSHs(make_sv_object(aTHX_ NULL, sv));
1973 MODULE = B PACKAGE = B::HE PREFIX = He
1981 RETVAL = ix ? HeSVKEY_force(he) : HeVAL(he);
1989 MODULE = B PACKAGE = B::RHE
1991 #if PERL_VERSION >= 9
1997 RETVAL = newRV( (SV*)cophh_2hv(h, 0) );