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);
1279 #if PERL_VERSION >= 9
1280 ST(0) = make_warnings_object(aTHX_ o);
1282 ST(0) = make_sv_object(aTHX_ NULL, o->cop_warnings);
1290 #if PERL_VERSION >= 9
1291 ST(0) = make_cop_io_object(aTHX_ o);
1293 ST(0) = make_sv_object(aTHX_ NULL, o->cop_io);
1297 #if PERL_VERSION >= 9
1303 RETVAL = CopHINTHASH_get(o);
1309 MODULE = B PACKAGE = B::SV
1311 #define MAGICAL_FLAG_BITS (SVs_GMG|SVs_SMG|SVs_RMG)
1321 MAGICAL = MAGICAL_FLAG_BITS
1323 RETVAL = ix ? (SvFLAGS(sv) & (U32)ix) : SvREFCNT(sv);
1331 ST(0) = sv_2mortal(newRV(sv));
1334 MODULE = B PACKAGE = B::IV PREFIX = Sv
1340 MODULE = B PACKAGE = B::IV
1342 #define sv_SVp 0x00000
1343 #define sv_IVp 0x10000
1344 #define sv_UVp 0x20000
1345 #define sv_STRLENp 0x30000
1346 #define sv_U32p 0x40000
1347 #define sv_U8p 0x50000
1348 #define sv_char_pp 0x60000
1349 #define sv_NVp 0x70000
1350 #define sv_char_p 0x80000
1351 #define sv_SSize_tp 0x90000
1352 #define sv_I32p 0xA0000
1353 #define sv_U16p 0xB0000
1355 #define IV_ivx_ix sv_IVp | offsetof(struct xpviv, xiv_iv)
1356 #define IV_uvx_ix sv_UVp | offsetof(struct xpvuv, xuv_uv)
1357 #define NV_nvx_ix sv_NVp | offsetof(struct xpvnv, xnv_u.xnv_nv)
1359 #if PERL_VERSION >= 10
1360 #define NV_cop_seq_range_low_ix \
1361 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1362 #define NV_cop_seq_range_high_ix \
1363 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1364 #define NV_parent_pad_index_ix \
1365 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1366 #define NV_parent_fakelex_flags_ix \
1367 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1369 #define NV_cop_seq_range_low_ix \
1370 sv_NVp | offsetof(struct xpvnv, xnv_nv)
1371 #define NV_cop_seq_range_high_ix \
1372 sv_UVp | offsetof(struct xpvnv, xuv_uv)
1373 #define NV_parent_pad_index_ix \
1374 sv_NVp | offsetof(struct xpvnv, xnv_nv)
1375 #define NV_parent_fakelex_flags_ix \
1376 sv_UVp | offsetof(struct xpvnv, xuv_uv)
1379 #define PV_cur_ix sv_STRLENp | offsetof(struct xpv, xpv_cur)
1380 #define PV_len_ix sv_STRLENp | offsetof(struct xpv, xpv_len)
1382 #define PVMG_stash_ix sv_SVp | offsetof(struct xpvmg, xmg_stash)
1384 #if PERL_VERSION >= 10
1385 #define PVBM_useful_ix sv_I32p | offsetof(struct xpvgv, xiv_u.xivu_i32)
1386 #define PVBM_previous_ix sv_U32p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_previous)
1387 #define PVBM_rare_ix sv_U8p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_rare)
1389 #define PVBM_useful_ix sv_I32p | offsetof(struct xpvbm, xbm_useful)
1390 #define PVBM_previous_ix sv_U16p | offsetof(struct xpvbm, xbm_previous)
1391 #define PVBM_rare_ix sv_U8p | offsetof(struct xpvbm, xbm_rare)
1394 #define PVLV_targoff_ix sv_U32p | offsetof(struct xpvlv, xlv_targoff)
1395 #define PVLV_targlen_ix sv_U32p | offsetof(struct xpvlv, xlv_targlen)
1396 #define PVLV_targ_ix sv_SVp | offsetof(struct xpvlv, xlv_targ)
1397 #define PVLV_type_ix sv_char_p | offsetof(struct xpvlv, xlv_type)
1399 #if PERL_VERSION >= 10
1400 #define PVGV_stash_ix sv_SVp | offsetof(struct xpvgv, xnv_u.xgv_stash)
1401 #define PVGV_flags_ix sv_STRLENp | offsetof(struct xpvgv, xpv_cur)
1402 #define PVIO_lines_ix sv_IVp | offsetof(struct xpvio, xiv_iv)
1404 #define PVGV_stash_ix sv_SVp | offsetof(struct xpvgv, xgv_stash)
1405 #define PVGV_flags_ix sv_U8p | offsetof(struct xpvgv, xgv_flags)
1406 #define PVIO_lines_ix sv_IVp | offsetof(struct xpvio, xio_lines)
1409 #define PVIO_page_ix sv_IVp | offsetof(struct xpvio, xio_page)
1410 #define PVIO_page_len_ix sv_IVp | offsetof(struct xpvio, xio_page_len)
1411 #define PVIO_lines_left_ix sv_IVp | offsetof(struct xpvio, xio_lines_left)
1412 #define PVIO_top_name_ix sv_char_pp | offsetof(struct xpvio, xio_top_name)
1413 #define PVIO_top_gv_ix sv_SVp | offsetof(struct xpvio, xio_top_gv)
1414 #define PVIO_fmt_name_ix sv_char_pp | offsetof(struct xpvio, xio_fmt_name)
1415 #define PVIO_fmt_gv_ix sv_SVp | offsetof(struct xpvio, xio_fmt_gv)
1416 #define PVIO_bottom_name_ix sv_char_pp | offsetof(struct xpvio, xio_bottom_name)
1417 #define PVIO_bottom_gv_ix sv_SVp | offsetof(struct xpvio, xio_bottom_gv)
1418 #define PVIO_type_ix sv_char_p | offsetof(struct xpvio, xio_type)
1419 #define PVIO_flags_ix sv_U8p | offsetof(struct xpvio, xio_flags)
1421 #define PVAV_max_ix sv_SSize_tp | offsetof(struct xpvav, xav_max)
1423 #define PVFM_lines_ix sv_IVp | offsetof(struct xpvfm, xfm_lines)
1425 #define PVCV_stash_ix sv_SVp | offsetof(struct xpvcv, xcv_stash)
1426 #define PVCV_gv_ix sv_SVp | offsetof(struct xpvcv, xcv_gv)
1427 #define PVCV_file_ix sv_char_pp | offsetof(struct xpvcv, xcv_file)
1428 #define PVCV_depth_ix sv_I32p | offsetof(struct xpvcv, xcv_depth)
1429 #define PVCV_padlist_ix sv_SVp | offsetof(struct xpvcv, xcv_padlist)
1430 #define PVCV_outside_ix sv_SVp | offsetof(struct xpvcv, xcv_outside)
1431 #define PVCV_outside_seq_ix sv_U32p | offsetof(struct xpvcv, xcv_outside_seq)
1432 #define PVCV_flags_ix sv_U16p | offsetof(struct xpvcv, xcv_flags)
1434 #define PVHV_max_ix sv_STRLENp | offsetof(struct xpvhv, xhv_max)
1436 #if PERL_VERSION > 12
1437 #define PVHV_keys_ix sv_STRLENp | offsetof(struct xpvhv, xhv_keys)
1439 #define PVHV_keys_ix sv_IVp | offsetof(struct xpvhv, xhv_keys)
1442 # The type checking code in B has always been identical for all SV types,
1443 # irrespective of whether the action is actually defined on that SV.
1444 # We should fix this
1449 B::IV::IVX = IV_ivx_ix
1450 B::IV::UVX = IV_uvx_ix
1451 B::NV::NVX = NV_nvx_ix
1452 B::NV::COP_SEQ_RANGE_LOW = NV_cop_seq_range_low_ix
1453 B::NV::COP_SEQ_RANGE_HIGH = NV_cop_seq_range_high_ix
1454 B::NV::PARENT_PAD_INDEX = NV_parent_pad_index_ix
1455 B::NV::PARENT_FAKELEX_FLAGS = NV_parent_fakelex_flags_ix
1456 B::PV::CUR = PV_cur_ix
1457 B::PV::LEN = PV_len_ix
1458 B::PVMG::SvSTASH = PVMG_stash_ix
1459 B::PVLV::TARGOFF = PVLV_targoff_ix
1460 B::PVLV::TARGLEN = PVLV_targlen_ix
1461 B::PVLV::TARG = PVLV_targ_ix
1462 B::PVLV::TYPE = PVLV_type_ix
1463 B::GV::STASH = PVGV_stash_ix
1464 B::GV::GvFLAGS = PVGV_flags_ix
1465 B::BM::USEFUL = PVBM_useful_ix
1466 B::BM::PREVIOUS = PVBM_previous_ix
1467 B::BM::RARE = PVBM_rare_ix
1468 B::IO::LINES = PVIO_lines_ix
1469 B::IO::PAGE = PVIO_page_ix
1470 B::IO::PAGE_LEN = PVIO_page_len_ix
1471 B::IO::LINES_LEFT = PVIO_lines_left_ix
1472 B::IO::TOP_NAME = PVIO_top_name_ix
1473 B::IO::TOP_GV = PVIO_top_gv_ix
1474 B::IO::FMT_NAME = PVIO_fmt_name_ix
1475 B::IO::FMT_GV = PVIO_fmt_gv_ix
1476 B::IO::BOTTOM_NAME = PVIO_bottom_name_ix
1477 B::IO::BOTTOM_GV = PVIO_bottom_gv_ix
1478 B::IO::IoTYPE = PVIO_type_ix
1479 B::IO::IoFLAGS = PVIO_flags_ix
1480 B::AV::MAX = PVAV_max_ix
1481 B::FM::LINES = PVFM_lines_ix
1482 B::CV::STASH = PVCV_stash_ix
1483 B::CV::GV = PVCV_gv_ix
1484 B::CV::FILE = PVCV_file_ix
1485 B::CV::DEPTH = PVCV_depth_ix
1486 B::CV::PADLIST = PVCV_padlist_ix
1487 B::CV::OUTSIDE = PVCV_outside_ix
1488 B::CV::OUTSIDE_SEQ = PVCV_outside_seq_ix
1489 B::CV::CvFLAGS = PVCV_flags_ix
1490 B::HV::MAX = PVHV_max_ix
1491 B::HV::KEYS = PVHV_keys_ix
1496 ptr = (ix & 0xFFFF) + (char *)SvANY(sv);
1497 switch ((U8)(ix >> 16)) {
1498 case (U8)(sv_SVp >> 16):
1499 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
1501 case (U8)(sv_IVp >> 16):
1502 ret = sv_2mortal(newSViv(*((IV *)ptr)));
1504 case (U8)(sv_UVp >> 16):
1505 ret = sv_2mortal(newSVuv(*((UV *)ptr)));
1507 case (U8)(sv_STRLENp >> 16):
1508 ret = sv_2mortal(newSVuv(*((STRLEN *)ptr)));
1510 case (U8)(sv_U32p >> 16):
1511 ret = sv_2mortal(newSVuv(*((U32 *)ptr)));
1513 case (U8)(sv_U8p >> 16):
1514 ret = sv_2mortal(newSVuv(*((U8 *)ptr)));
1516 case (U8)(sv_char_pp >> 16):
1517 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
1519 case (U8)(sv_NVp >> 16):
1520 ret = sv_2mortal(newSVnv(*((NV *)ptr)));
1522 case (U8)(sv_char_p >> 16):
1523 ret = newSVpvn_flags((char *)ptr, 1, SVs_TEMP);
1525 case (U8)(sv_SSize_tp >> 16):
1526 ret = sv_2mortal(newSViv(*((SSize_t *)ptr)));
1528 case (U8)(sv_I32p >> 16):
1529 ret = sv_2mortal(newSVuv(*((I32 *)ptr)));
1531 case (U8)(sv_U16p >> 16):
1532 ret = sv_2mortal(newSVuv(*((U16 *)ptr)));
1545 ST(0) = boolSV((I32)SvIVX(sv) != SvIVX(sv));
1546 } else if (sizeof(IV) == 8) {
1548 const IV iv = SvIVX(sv);
1550 * The following way of spelling 32 is to stop compilers on
1551 * 32-bit architectures from moaning about the shift count
1552 * being >= the width of the type. Such architectures don't
1553 * reach this code anyway (unless sizeof(IV) > 8 but then
1554 * everything else breaks too so I'm not fussed at the moment).
1557 wp[0] = htonl(((UV)iv) >> (sizeof(UV)*4));
1559 wp[0] = htonl(((U32)iv) >> (sizeof(UV)*4));
1561 wp[1] = htonl(iv & 0xffffffff);
1562 ST(0) = newSVpvn_flags((char *)wp, 8, SVs_TEMP);
1564 U32 w = htonl((U32)SvIVX(sv));
1565 ST(0) = newSVpvn_flags((char *)&w, 4, SVs_TEMP);
1568 MODULE = B PACKAGE = B::NV PREFIX = Sv
1574 #if PERL_VERSION < 11
1576 MODULE = B PACKAGE = B::RV PREFIX = Sv
1584 MODULE = B PACKAGE = B::REGEXP
1593 PUSHs(newSVpvn_flags(RX_PRECOMP(sv), RX_PRELEN(sv), SVs_TEMP));
1596 /* FIXME - can we code this method more efficiently? */
1602 MODULE = B PACKAGE = B::PV
1612 croak( "argument is not SvROK" );
1631 /* Boyer-Moore table is just after string and its safety-margin \0 */
1632 p += len + PERL_FBM_TABLE_OFFSET;
1634 } else if (ix == 2) {
1635 /* This used to read 257. I think that that was buggy - should have
1636 been 258. (The "\0", the flags byte, and 256 for the table. Not
1637 that anything anywhere calls this method. NWC. */
1638 /* Also, the start pointer has always been SvPVX(sv). Surely it
1639 should be SvPVX(sv) + SvCUR(sv)? The code has faithfully been
1640 refactored with this behaviour, since PVBM was added in
1641 651aa52ea1faa806. */
1642 p = SvPVX_const(sv);
1643 len = SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0);
1647 } else if (SvPOK(sv)) {
1649 p = SvPVX_const(sv);
1651 #if PERL_VERSION < 10
1652 /* Before 5.10 (well 931b58fb28fa5ca7), PAD_COMPNAME_GEN was stored
1653 in SvCUR(), which meant we had to attempt this special casing
1654 to avoid tripping up over variable names in the pads. */
1655 if((SvLEN(sv) && len >= SvLEN(sv))) {
1656 /* It claims to be longer than the space allocated for it -
1657 presuambly it's a variable name in the pad */
1663 /* XXX for backward compatibility, but should fail */
1664 /* croak( "argument is not SvPOK" ); */
1667 ST(0) = newSVpvn_flags(p, len, SVs_TEMP | utf8);
1669 MODULE = B PACKAGE = B::PVMG
1674 MAGIC * mg = NO_INIT
1676 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
1677 XPUSHs(make_mg_object(aTHX_ mg));
1679 MODULE = B PACKAGE = B::MAGIC
1696 XPUSHs(mg->mg_moremagic ? make_mg_object(aTHX_ mg->mg_moremagic)
1700 mPUSHu(mg->mg_private);
1703 PUSHs(newSVpvn_flags(&(mg->mg_type), 1, SVs_TEMP));
1706 mPUSHu(mg->mg_flags);
1712 PUSHs(make_sv_object(aTHX_ NULL, mg->mg_obj));
1716 if (mg->mg_len >= 0) {
1717 PUSHs(newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP));
1718 } else if (mg->mg_len == HEf_SVKEY) {
1719 PUSHs(make_sv_object(aTHX_ NULL, (SV*)mg->mg_ptr));
1721 PUSHs(sv_newmortal());
1723 PUSHs(sv_newmortal());
1726 if(mg->mg_type == PERL_MAGIC_qr) {
1727 mPUSHi(PTR2IV(mg->mg_obj));
1729 croak("REGEX is only meaningful on r-magic");
1733 if (mg->mg_type == PERL_MAGIC_qr) {
1734 REGEXP *rx = (REGEXP *)mg->mg_obj;
1735 PUSHs(newSVpvn_flags(rx ? RX_PRECOMP(rx) : NULL,
1736 rx ? RX_PRELEN(rx) : 0, SVs_TEMP));
1738 croak( "precomp is only meaningful on r-magic" );
1743 MODULE = B PACKAGE = B::GV PREFIX = Gv
1752 #if PERL_VERSION >= 10
1753 ST(0) = sv_2mortal(newSVhek(!ix ? GvNAME_HEK(gv)
1754 : (ix == 1 ? GvFILE_HEK(gv)
1755 : HvNAME_HEK((HV *)gv))));
1757 ST(0) = !ix ? newSVpvn_flags(GvNAME(gv), GvNAMELEN(gv), SVs_TEMP)
1758 : sv_2mortal(newSVpv(ix == 1 ? GvFILE(gv) : HvNAME((HV *)gv), 0))
1768 #if PERL_VERSION >= 9
1769 RETVAL = isGV_with_GP(gv) ? TRUE : FALSE;
1771 RETVAL = TRUE; /* In 5.8 and earlier they all are. */
1774 RETVAL = GvGP(gv) == Null(GP*);
1783 #define GP_sv_ix SVp | offsetof(struct gp, gp_sv)
1784 #define GP_io_ix SVp | offsetof(struct gp, gp_io)
1785 #define GP_cv_ix SVp | offsetof(struct gp, gp_cv)
1786 #define GP_cvgen_ix U32p | offsetof(struct gp, gp_cvgen)
1787 #define GP_refcnt_ix U32p | offsetof(struct gp, gp_refcnt)
1788 #define GP_hv_ix SVp | offsetof(struct gp, gp_hv)
1789 #define GP_av_ix SVp | offsetof(struct gp, gp_av)
1790 #define GP_form_ix SVp | offsetof(struct gp, gp_form)
1791 #define GP_egv_ix SVp | offsetof(struct gp, gp_egv)
1792 #define GP_line_ix line_tp | offsetof(struct gp, gp_line)
1802 GvREFCNT = GP_refcnt_ix
1815 const GV *const gv = CvGV(cv);
1816 Perl_croak(aTHX_ "NULL gp in B::GV::%s", gv ? GvNAME(gv) : "???");
1818 ptr = (ix & 0xFFFF) + (char *)gp;
1819 switch ((U8)(ix >> 16)) {
1820 case (U8)(SVp >> 16):
1821 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
1823 case (U8)(U32p >> 16):
1824 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
1826 case (U8)(line_tp >> 16):
1827 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
1837 MODULE = B PACKAGE = B::IO PREFIX = Io
1839 #if PERL_VERSION <= 8
1854 if( strEQ( name, "stdin" ) ) {
1855 handle = PerlIO_stdin();
1857 else if( strEQ( name, "stdout" ) ) {
1858 handle = PerlIO_stdout();
1860 else if( strEQ( name, "stderr" ) ) {
1861 handle = PerlIO_stderr();
1864 croak( "Invalid value '%s'", name );
1866 RETVAL = handle == IoIFP(io);
1870 MODULE = B PACKAGE = B::AV PREFIX = Av
1880 if (AvFILL(av) >= 0) {
1881 SV **svp = AvARRAY(av);
1883 for (i = 0; i <= AvFILL(av); i++)
1884 XPUSHs(make_sv_object(aTHX_ NULL, svp[i]));
1892 if (idx >= 0 && AvFILL(av) >= 0 && idx <= AvFILL(av))
1893 XPUSHs(make_sv_object(aTHX_ NULL, (AvARRAY(av)[idx])));
1895 XPUSHs(make_sv_object(aTHX_ NULL, NULL));
1897 #if PERL_VERSION < 9
1899 #define AvOFF(av) ((XPVAV*)SvANY(av))->xof_off
1905 MODULE = B PACKAGE = B::AV
1913 MODULE = B PACKAGE = B::CV PREFIX = Cv
1925 RETVAL = CvISXSUB(cv) ? NULL : ix ? CvROOT(cv) : CvSTART(cv);
1935 ST(0) = ix && CvCONST(cv)
1936 ? make_sv_object(aTHX_ NULL, (SV *)CvXSUBANY(cv).any_ptr)
1937 : sv_2mortal(newSViv(CvISXSUB(cv)
1938 ? (ix ? CvXSUBANY(cv).any_iv
1939 : PTR2IV(CvXSUB(cv)))
1942 MODULE = B PACKAGE = B::CV PREFIX = cv_
1948 MODULE = B PACKAGE = B::HV PREFIX = Hv
1958 #if PERL_VERSION < 9
1970 if (HvKEYS(hv) > 0) {
1974 (void)hv_iterinit(hv);
1975 EXTEND(sp, HvKEYS(hv) * 2);
1976 while ((sv = hv_iternextsv(hv, &key, &len))) {
1978 PUSHs(make_sv_object(aTHX_ NULL, sv));
1982 MODULE = B PACKAGE = B::HE PREFIX = He
1990 RETVAL = ix ? HeSVKEY_force(he) : HeVAL(he);
1998 MODULE = B PACKAGE = B::RHE
2000 #if PERL_VERSION >= 9
2006 RETVAL = newRV( (SV*)cophh_2hv(h, 0) );