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 make_op_object(pTHX_ const OP *o)
241 SV *opsv = sv_newmortal();
242 sv_setiv(newSVrv(opsv, opclassnames[cc_opclass(aTHX_ o)]), PTR2IV(o));
246 /* FIXME - figure out how to get the typemap to assign this to ST(0), rather
247 than creating a new mortal for ST(0) then passing it in as the first
250 make_sv_object(pTHX_ SV *arg, SV *sv)
252 const char *type = 0;
257 arg = sv_newmortal();
259 for (iv = 0; iv < sizeof(specialsv_list)/sizeof(SV*); iv++) {
260 if (sv == specialsv_list[iv]) {
266 type = svclassnames[SvTYPE(sv)];
269 sv_setiv(newSVrv(arg, type), iv);
273 #if PERL_VERSION >= 9
275 make_temp_object(pTHX_ SV *temp)
278 SV *arg = sv_newmortal();
279 const char *const type = svclassnames[SvTYPE(temp)];
280 const IV iv = PTR2IV(temp);
282 target = newSVrv(arg, type);
283 sv_setiv(target, iv);
285 /* Need to keep our "temp" around as long as the target exists.
286 Simplest way seems to be to hang it from magic, and let that clear
287 it up. No vtable, so won't actually get in the way of anything. */
288 sv_magicext(target, temp, PERL_MAGIC_sv, NULL, NULL, 0);
289 /* magic object has had its reference count increased, so we must drop
296 make_warnings_object(pTHX_ const COP *const cop)
298 const STRLEN *const warnings = cop->cop_warnings;
299 const char *type = 0;
301 IV iv = sizeof(specialsv_list)/sizeof(SV*);
303 /* Counting down is deliberate. Before the split between make_sv_object
304 and make_warnings_obj there appeared to be a bug - Nullsv and pWARN_STD
305 were both 0, so you could never get a B::SPECIAL for pWARN_STD */
308 if ((SV*)warnings == specialsv_list[iv]) {
314 SV *arg = sv_newmortal();
315 sv_setiv(newSVrv(arg, type), iv);
318 /* B assumes that warnings are a regular SV. Seems easier to keep it
319 happy by making them into a regular SV. */
320 return make_temp_object(aTHX_ newSVpvn((char *)(warnings + 1), *warnings));
325 make_cop_io_object(pTHX_ COP *cop)
327 SV *const value = newSV(0);
329 Perl_emulate_cop_io(aTHX_ cop, value);
332 return make_sv_object(aTHX_ NULL, value);
335 return make_sv_object(aTHX_ NULL, NULL);
341 make_mg_object(pTHX_ MAGIC *mg)
343 SV *arg = sv_newmortal();
344 sv_setiv(newSVrv(arg, "B::MAGIC"), PTR2IV(mg));
349 cstring(pTHX_ SV *sv, bool perlstyle)
354 return newSVpvs_flags("0", SVs_TEMP);
356 sstr = newSVpvs_flags("\"", SVs_TEMP);
358 if (perlstyle && SvUTF8(sv)) {
359 SV *tmpsv = sv_newmortal(); /* Temporary SV to feed sv_uni_display */
360 const STRLEN len = SvCUR(sv);
361 const char *s = sv_uni_display(tmpsv, sv, 8*len, UNI_DISPLAY_QQ);
365 sv_catpvs(sstr, "\\\"");
367 sv_catpvs(sstr, "\\$");
369 sv_catpvs(sstr, "\\@");
372 if (strchr("nrftax\\",*(s+1)))
373 sv_catpvn(sstr, s++, 2);
375 sv_catpvs(sstr, "\\\\");
377 else /* should always be printable */
378 sv_catpvn(sstr, s, 1);
386 const char *s = SvPV(sv, len);
387 for (; len; len--, s++)
389 /* At least try a little for readability */
391 sv_catpvs(sstr, "\\\"");
393 sv_catpvs(sstr, "\\\\");
394 /* trigraphs - bleagh */
395 else if (!perlstyle && *s == '?' && len>=3 && s[1] == '?') {
396 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", '?');
398 else if (perlstyle && *s == '$')
399 sv_catpvs(sstr, "\\$");
400 else if (perlstyle && *s == '@')
401 sv_catpvs(sstr, "\\@");
403 else if (isPRINT(*s))
405 else if (*s >= ' ' && *s < 127)
407 sv_catpvn(sstr, s, 1);
409 sv_catpvs(sstr, "\\n");
411 sv_catpvs(sstr, "\\r");
413 sv_catpvs(sstr, "\\t");
415 sv_catpvs(sstr, "\\a");
417 sv_catpvs(sstr, "\\b");
419 sv_catpvs(sstr, "\\f");
420 else if (!perlstyle && *s == '\v')
421 sv_catpvs(sstr, "\\v");
424 /* Don't want promotion of a signed -1 char in sprintf args */
425 const unsigned char c = (unsigned char) *s;
426 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", c);
428 /* XXX Add line breaks if string is long */
431 sv_catpvs(sstr, "\"");
438 SV *sstr = newSVpvs_flags("'", SVs_TEMP);
439 const char *s = SvPV_nolen(sv);
440 /* Don't want promotion of a signed -1 char in sprintf args */
441 const unsigned char c = (unsigned char) *s;
444 sv_catpvs(sstr, "\\'");
446 sv_catpvs(sstr, "\\\\");
450 else if (c >= ' ' && c < 127)
452 sv_catpvn(sstr, s, 1);
454 sv_catpvs(sstr, "\\n");
456 sv_catpvs(sstr, "\\r");
458 sv_catpvs(sstr, "\\t");
460 sv_catpvs(sstr, "\\a");
462 sv_catpvs(sstr, "\\b");
464 sv_catpvs(sstr, "\\f");
466 sv_catpvs(sstr, "\\v");
468 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", c);
469 sv_catpvs(sstr, "'");
473 #if PERL_VERSION >= 9
474 # define PMOP_pmreplstart(o) o->op_pmstashstartu.op_pmreplstart
475 # define PMOP_pmreplroot(o) o->op_pmreplrootu.op_pmreplroot
477 # define PMOP_pmreplstart(o) o->op_pmreplstart
478 # define PMOP_pmreplroot(o) o->op_pmreplroot
479 # define PMOP_pmpermflags(o) o->op_pmpermflags
480 # define PMOP_pmdynflags(o) o->op_pmdynflags
484 walkoptree(pTHX_ OP *o, const char *method, SV *ref)
489 const char *const classname = opclassnames[cc_opclass(aTHX_ o)];
492 /* Check that no-one has changed our reference, or is holding a reference
494 if (SvREFCNT(ref) == 1 && SvROK(ref) && SvTYPE(ref) == SVt_RV
495 && (object = SvRV(ref)) && SvREFCNT(object) == 1
496 && SvTYPE(object) == SVt_PVMG && SvIOK_only(object)
497 && !SvMAGICAL(object) && !SvMAGIC(object) && SvSTASH(object)) {
498 /* Looks good, so rebless it for the class we need: */
499 sv_bless(ref, gv_stashpv(classname, GV_ADD));
501 /* Need to make a new one. */
502 ref = sv_newmortal();
503 object = newSVrv(ref, classname);
505 sv_setiv(object, PTR2IV(o));
507 if (walkoptree_debug) {
511 perl_call_method("walkoptree_debug", G_DISCARD);
516 perl_call_method(method, G_DISCARD);
517 if (o && (o->op_flags & OPf_KIDS)) {
518 for (kid = ((UNOP*)o)->op_first; kid; kid = kid->op_sibling) {
519 ref = walkoptree(aTHX_ kid, method, ref);
522 if (o && (cc_opclass(aTHX_ o) == OPc_PMOP) && o->op_type != OP_PUSHRE
523 && (kid = PMOP_pmreplroot(cPMOPo)))
525 ref = walkoptree(aTHX_ kid, method, ref);
531 oplist(pTHX_ OP *o, SV **SP)
533 for(; o; o = o->op_next) {
534 #if PERL_VERSION >= 9
543 XPUSHs(make_op_object(aTHX_ 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 PUSHs(make_op_object(aTHX_ ix ? PL_main_start : PL_main_root));
723 RETVAL = ix ? PL_dowarn : PL_sub_generation;
728 walkoptree(op, method)
732 (void) walkoptree(aTHX_ op, method, &PL_sv_undef);
735 walkoptree_debug(...)
738 RETVAL = walkoptree_debug;
739 if (items > 0 && SvTRUE(ST(1)))
740 walkoptree_debug = 1;
744 #define address(sv) PTR2IV(sv)
755 croak("argument is not a reference");
756 RETVAL = (SV*)SvRV(sv);
767 ST(0) = sv_newmortal();
768 if (strncmp(name,"pp_",3) == 0)
770 for (i = 0; i < PL_maxo; i++)
772 if (strcmp(name, PL_op_name[i]) == 0)
778 sv_setiv(ST(0),result);
785 ST(0) = sv_newmortal();
786 if (opnum >= 0 && opnum < PL_maxo) {
787 sv_setpvs(ST(0), "pp_");
788 sv_catpv(ST(0), PL_op_name[opnum]);
797 const char *s = SvPVbyte(sv, len);
798 PERL_HASH(hash, s, len);
799 ST(0) = sv_2mortal(Perl_newSVpvf(aTHX_ "0x%"UVxf, (UV)hash));
801 #define cast_I32(foo) (I32)foo
823 PUSHs(ix == 2 ? cchar(aTHX_ sv) : cstring(aTHX_ sv, ix));
828 #if PERL_VERSION <= 8
829 # ifdef USE_5005THREADS
831 const STRLEN len = strlen(PL_threadsv_names);
834 for (i = 0; i < len; i++)
835 PUSHs(newSVpvn_flags(&PL_threadsv_names[i], 1, SVs_TEMP));
841 #define line_tp 0x20000
843 #define PADOFFSETp 0x40000
846 #define char_pp 0x70000
848 #define OP_next_ix OPp | offsetof(struct op, op_next)
849 #define OP_sibling_ix OPp | offsetof(struct op, op_sibling)
850 #define UNOP_first_ix OPp | offsetof(struct unop, op_first)
851 #define BINOP_last_ix OPp | offsetof(struct binop, op_last)
852 #define LOGOP_other_ix OPp | offsetof(struct logop, op_other)
853 #if PERL_VERSION >= 9
854 # define PMOP_pmreplstart_ix \
855 OPp | offsetof(struct pmop, op_pmstashstartu.op_pmreplstart)
857 # define PMOP_pmreplstart_ix OPp | offsetof(struct pmop, op_pmreplstart)
859 #define LOOP_redoop_ix OPp | offsetof(struct loop, op_redoop)
860 #define LOOP_nextop_ix OPp | offsetof(struct loop, op_nextop)
861 #define LOOP_lastop_ix OPp | offsetof(struct loop, op_lastop)
863 #define OP_targ_ix PADOFFSETp | offsetof(struct op, op_targ)
864 #define OP_flags_ix U8p | offsetof(struct op, op_flags)
865 #define OP_private_ix U8p | offsetof(struct op, op_private)
867 #define PMOP_pmflags_ix U32p | offsetof(struct pmop, op_pmflags)
870 #define PMOP_pmoffset_ix IVp | offsetof(struct pmop, op_pmoffset)
873 # Yes, B::SV::sv and B::SV::gv really do end up generating identical code.
874 #define SVOP_sv_ix SVp | offsetof(struct svop, op_sv)
875 #define SVOP_gv_ix SVp | offsetof(struct svop, op_sv)
877 #define PADOP_padix_ix PADOFFSETp | offsetof(struct padop, op_padix)
879 #define COP_seq_ix U32p | offsetof(struct cop, cop_seq)
880 #define COP_line_ix line_tp | offsetof(struct cop, cop_line)
881 #if PERL_VERSION >= 9
882 #define COP_hints_ix U32p | offsetof(struct cop, cop_hints)
884 #define COP_hints_ix U8p | offsetof(struct cop, op_private)
888 #define COP_stashpv_ix char_pp | offsetof(struct cop, cop_stashpv)
889 #define COP_file_ix char_pp | offsetof(struct cop, cop_file)
891 #define COP_stash_ix SVp | offsetof(struct cop, cop_stash)
892 #define COP_filegv_ix SVp | offsetof(struct cop, cop_filegv)
895 MODULE = B PACKAGE = B::OP
901 RETVAL = opsizes[cc_opclass(aTHX_ o)];
905 # The type checking code in B has always been identical for all OP types,
906 # irrespective of whether the action is actually defined on that OP.
912 B::OP::next = OP_next_ix
913 B::OP::sibling = OP_sibling_ix
914 B::OP::targ = OP_targ_ix
915 B::OP::flags = OP_flags_ix
916 B::OP::private = OP_private_ix
917 B::UNOP::first = UNOP_first_ix
918 B::BINOP::last = BINOP_last_ix
919 B::LOGOP::other = LOGOP_other_ix
920 B::PMOP::pmreplstart = PMOP_pmreplstart_ix
921 B::LOOP::redoop = LOOP_redoop_ix
922 B::LOOP::nextop = LOOP_nextop_ix
923 B::LOOP::lastop = LOOP_lastop_ix
924 B::PMOP::pmflags = PMOP_pmflags_ix
925 B::SVOP::sv = SVOP_sv_ix
926 B::SVOP::gv = SVOP_gv_ix
927 B::PADOP::padix = PADOP_padix_ix
928 B::COP::cop_seq = COP_seq_ix
929 B::COP::line = COP_line_ix
930 B::COP::hints = COP_hints_ix
935 ptr = (ix & 0xFFFF) + (char *)o;
936 switch ((U8)(ix >> 16)) {
937 case (U8)(OPp >> 16):
938 ret = make_op_object(aTHX_ *((OP **)ptr));
940 case (U8)(PADOFFSETp >> 16):
941 ret = sv_2mortal(newSVuv(*((PADOFFSET*)ptr)));
943 case (U8)(U8p >> 16):
944 ret = sv_2mortal(newSVuv(*((U8*)ptr)));
946 case (U8)(U32p >> 16):
947 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
949 case (U8)(SVp >> 16):
950 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
952 case (U8)(line_tp >> 16):
953 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
956 case (U8)(IVp >> 16):
957 ret = sv_2mortal(newSViv(*((IV*)ptr)));
959 case (U8)(char_pp >> 16):
960 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
973 RETVAL = (char *)(ix ? PL_op_desc : PL_op_name)[o->op_type];
982 SV *sv = newSVpvs_flags("PL_ppaddr[OP_", SVs_TEMP);
984 sv_catpv(sv, PL_op_name[o->op_type]);
985 for (i=13; (STRLEN)i < SvCUR(sv); ++i)
986 SvPVX(sv)[i] = toUPPER(SvPVX(sv)[i]);
990 #if PERL_VERSION >= 9
991 # These 3 are all bitfields, so we can't take their addresses.
1004 RETVAL = o->op_spare;
1007 RETVAL = o->op_type;
1025 RETVAL = o->op_type;
1036 SP = oplist(aTHX_ o, SP);
1038 MODULE = B PACKAGE = B::LISTOP
1047 for (kid = o->op_first; kid; kid = kid->op_sibling)
1053 MODULE = B PACKAGE = B::PMOP PREFIX = PMOP_
1055 #if PERL_VERSION <= 8
1062 root = o->op_pmreplroot;
1063 /* OP_PUSHRE stores an SV* instead of an OP* in op_pmreplroot */
1064 if (o->op_type == OP_PUSHRE) {
1065 ST(0) = sv_newmortal();
1066 # ifdef USE_ITHREADS
1067 sv_setiv(ST(0), INT2PTR(PADOFFSET,root) );
1069 sv_setiv(newSVrv(ST(0), root ?
1070 svclassnames[SvTYPE((SV*)root)] : "B::SV"),
1075 ST(0) = make_op_object(aTHX_ root);
1084 if (o->op_type == OP_PUSHRE) {
1085 ST(0) = sv_newmortal();
1086 # ifdef USE_ITHREADS
1087 sv_setiv(ST(0), o->op_pmreplrootu.op_pmtargetoff);
1089 GV *const target = o->op_pmreplrootu.op_pmtargetgv;
1090 sv_setiv(newSVrv(ST(0), target ?
1091 svclassnames[SvTYPE((SV*)target)] : "B::SV"),
1096 OP *const root = o->op_pmreplrootu.op_pmreplroot;
1097 ST(0) = make_op_object(aTHX_ root);
1103 #define PMOP_pmstashpv(o) PmopSTASHPV(o);
1110 #define PMOP_pmstash(o) PmopSTASH(o);
1118 #if PERL_VERSION < 9
1124 PUSHs(make_op_object(aTHX_ o->op_pmnext));
1144 ST(0) = sv_newmortal();
1146 #if PERL_VERSION >= 9
1148 sv_setuv(ST(0), RX_EXTFLAGS(rx));
1152 sv_setpvn(ST(0), RX_PRECOMP(rx), RX_PRELEN(rx));
1160 cv = newXS("B::PMOP::pmoffset", XS_B__OP_next, __FILE__);
1161 XSANY.any_i32 = PMOP_pmoffset_ix;
1162 cv = newXS("B::COP::stashpv", XS_B__OP_next, __FILE__);
1163 XSANY.any_i32 = COP_stashpv_ix;
1164 cv = newXS("B::COP::file", XS_B__OP_next, __FILE__);
1165 XSANY.any_i32 = COP_file_ix;
1167 cv = newXS("B::COP::stash", XS_B__OP_next, __FILE__);
1168 XSANY.any_i32 = COP_stash_ix;
1169 cv = newXS("B::COP::filegv", XS_B__OP_next, __FILE__);
1170 XSANY.any_i32 = COP_filegv_ix;
1172 #if PERL_VERSION >= 9
1173 cv = newXS("B::PMOP::reflags", XS_B__PMOP_precomp, __FILE__);
1178 MODULE = B PACKAGE = B::PADOP
1186 /* It happens that the output typemaps for B::SV and B::GV are
1187 identical. The "smarts" are in make_sv_object(), which determines
1188 which class to use based on SvTYPE(), rather than anything baked in
1191 RETVAL = PAD_SVl(o->op_padix);
1192 if (ix && SvTYPE(RETVAL) != SVt_PVGV)
1200 MODULE = B PACKAGE = B::PVOP
1207 * OP_TRANS uses op_pv to point to a table of 256 or >=258 shorts
1208 * whereas other PVOPs point to a null terminated string.
1210 if ((o->op_type == OP_TRANS || o->op_type == OP_TRANSR) &&
1211 (o->op_private & OPpTRANS_COMPLEMENT) &&
1212 !(o->op_private & OPpTRANS_DELETE))
1214 const short* const tbl = (short*)o->op_pv;
1215 const short entries = 257 + tbl[256];
1216 ST(0) = newSVpvn_flags(o->op_pv, entries * sizeof(short), SVs_TEMP);
1218 else if (o->op_type == OP_TRANS || o->op_type == OP_TRANSR) {
1219 ST(0) = newSVpvn_flags(o->op_pv, 256 * sizeof(short), SVs_TEMP);
1222 ST(0) = newSVpvn_flags(o->op_pv, strlen(o->op_pv), SVs_TEMP);
1224 #define COP_label(o) CopLABEL(o)
1225 #define COP_arybase(o) CopARYBASE_get(o)
1227 MODULE = B PACKAGE = B::COP PREFIX = COP_
1233 # Both pairs of accessors are provided for both ithreads and not, but for each,
1234 # one pair is direct structure access, and 1 pair "faked up" with a more complex
1235 # macro. We implement the direct structure access pair using the common code
1236 # above (B::OP::next)
1246 RETVAL = ix ? (SV *)CopFILEGV(o) : (SV *)CopSTASH(o);
1258 RETVAL = ix ? CopFILE(o) : CopSTASHPV(o);
1274 #if PERL_VERSION >= 9
1275 ST(0) = ix ? make_cop_io_object(aTHX_ o) : make_warnings_object(aTHX_ o);
1277 ST(0) = make_sv_object(aTHX_ NULL, ix ? o->cop_io : o->cop_warnings);
1281 #if PERL_VERSION >= 9
1287 RETVAL = CopHINTHASH_get(o);
1293 MODULE = B PACKAGE = B::SV
1295 #define MAGICAL_FLAG_BITS (SVs_GMG|SVs_SMG|SVs_RMG)
1305 MAGICAL = MAGICAL_FLAG_BITS
1307 RETVAL = ix ? (SvFLAGS(sv) & (U32)ix) : SvREFCNT(sv);
1315 ST(0) = sv_2mortal(newRV(sv));
1318 MODULE = B PACKAGE = B::IV PREFIX = Sv
1324 MODULE = B PACKAGE = B::IV
1326 #define sv_SVp 0x00000
1327 #define sv_IVp 0x10000
1328 #define sv_UVp 0x20000
1329 #define sv_STRLENp 0x30000
1330 #define sv_U32p 0x40000
1331 #define sv_U8p 0x50000
1332 #define sv_char_pp 0x60000
1333 #define sv_NVp 0x70000
1334 #define sv_char_p 0x80000
1335 #define sv_SSize_tp 0x90000
1336 #define sv_I32p 0xA0000
1337 #define sv_U16p 0xB0000
1339 #define IV_ivx_ix sv_IVp | offsetof(struct xpviv, xiv_iv)
1340 #define IV_uvx_ix sv_UVp | offsetof(struct xpvuv, xuv_uv)
1341 #define NV_nvx_ix sv_NVp | offsetof(struct xpvnv, xnv_u.xnv_nv)
1343 #if PERL_VERSION >= 10
1344 #define NV_cop_seq_range_low_ix \
1345 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1346 #define NV_cop_seq_range_high_ix \
1347 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1348 #define NV_parent_pad_index_ix \
1349 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1350 #define NV_parent_fakelex_flags_ix \
1351 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1353 #define NV_cop_seq_range_low_ix \
1354 sv_NVp | offsetof(struct xpvnv, xnv_nv)
1355 #define NV_cop_seq_range_high_ix \
1356 sv_UVp | offsetof(struct xpvnv, xuv_uv)
1357 #define NV_parent_pad_index_ix \
1358 sv_NVp | offsetof(struct xpvnv, xnv_nv)
1359 #define NV_parent_fakelex_flags_ix \
1360 sv_UVp | offsetof(struct xpvnv, xuv_uv)
1363 #define PV_cur_ix sv_STRLENp | offsetof(struct xpv, xpv_cur)
1364 #define PV_len_ix sv_STRLENp | offsetof(struct xpv, xpv_len)
1366 #define PVMG_stash_ix sv_SVp | offsetof(struct xpvmg, xmg_stash)
1368 #if PERL_VERSION >= 10
1369 #define PVBM_useful_ix sv_I32p | offsetof(struct xpvgv, xiv_u.xivu_i32)
1370 #define PVBM_previous_ix sv_U32p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_previous)
1371 #define PVBM_rare_ix sv_U8p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_rare)
1373 #define PVBM_useful_ix sv_I32p | offsetof(struct xpvbm, xbm_useful)
1374 #define PVBM_previous_ix sv_U16p | offsetof(struct xpvbm, xbm_previous)
1375 #define PVBM_rare_ix sv_U8p | offsetof(struct xpvbm, xbm_rare)
1378 #define PVLV_targoff_ix sv_U32p | offsetof(struct xpvlv, xlv_targoff)
1379 #define PVLV_targlen_ix sv_U32p | offsetof(struct xpvlv, xlv_targlen)
1380 #define PVLV_targ_ix sv_SVp | offsetof(struct xpvlv, xlv_targ)
1381 #define PVLV_type_ix sv_char_p | offsetof(struct xpvlv, xlv_type)
1383 #if PERL_VERSION >= 10
1384 #define PVGV_stash_ix sv_SVp | offsetof(struct xpvgv, xnv_u.xgv_stash)
1385 #define PVGV_flags_ix sv_STRLENp | offsetof(struct xpvgv, xpv_cur)
1386 #define PVIO_lines_ix sv_IVp | offsetof(struct xpvio, xiv_iv)
1388 #define PVGV_stash_ix sv_SVp | offsetof(struct xpvgv, xgv_stash)
1389 #define PVGV_flags_ix sv_U8p | offsetof(struct xpvgv, xgv_flags)
1390 #define PVIO_lines_ix sv_IVp | offsetof(struct xpvio, xio_lines)
1393 #define PVIO_page_ix sv_IVp | offsetof(struct xpvio, xio_page)
1394 #define PVIO_page_len_ix sv_IVp | offsetof(struct xpvio, xio_page_len)
1395 #define PVIO_lines_left_ix sv_IVp | offsetof(struct xpvio, xio_lines_left)
1396 #define PVIO_top_name_ix sv_char_pp | offsetof(struct xpvio, xio_top_name)
1397 #define PVIO_top_gv_ix sv_SVp | offsetof(struct xpvio, xio_top_gv)
1398 #define PVIO_fmt_name_ix sv_char_pp | offsetof(struct xpvio, xio_fmt_name)
1399 #define PVIO_fmt_gv_ix sv_SVp | offsetof(struct xpvio, xio_fmt_gv)
1400 #define PVIO_bottom_name_ix sv_char_pp | offsetof(struct xpvio, xio_bottom_name)
1401 #define PVIO_bottom_gv_ix sv_SVp | offsetof(struct xpvio, xio_bottom_gv)
1402 #define PVIO_type_ix sv_char_p | offsetof(struct xpvio, xio_type)
1403 #define PVIO_flags_ix sv_U8p | offsetof(struct xpvio, xio_flags)
1405 #define PVAV_max_ix sv_SSize_tp | offsetof(struct xpvav, xav_max)
1407 #define PVFM_lines_ix sv_IVp | offsetof(struct xpvfm, xfm_lines)
1409 #define PVCV_stash_ix sv_SVp | offsetof(struct xpvcv, xcv_stash)
1410 #define PVCV_gv_ix sv_SVp | offsetof(struct xpvcv, xcv_gv)
1411 #define PVCV_file_ix sv_char_pp | offsetof(struct xpvcv, xcv_file)
1412 #define PVCV_depth_ix sv_I32p | offsetof(struct xpvcv, xcv_depth)
1413 #define PVCV_padlist_ix sv_SVp | offsetof(struct xpvcv, xcv_padlist)
1414 #define PVCV_outside_ix sv_SVp | offsetof(struct xpvcv, xcv_outside)
1415 #define PVCV_outside_seq_ix sv_U32p | offsetof(struct xpvcv, xcv_outside_seq)
1416 #define PVCV_flags_ix sv_U16p | offsetof(struct xpvcv, xcv_flags)
1418 #define PVHV_max_ix sv_STRLENp | offsetof(struct xpvhv, xhv_max)
1420 #if PERL_VERSION > 12
1421 #define PVHV_keys_ix sv_STRLENp | offsetof(struct xpvhv, xhv_keys)
1423 #define PVHV_keys_ix sv_IVp | offsetof(struct xpvhv, xhv_keys)
1426 # The type checking code in B has always been identical for all SV types,
1427 # irrespective of whether the action is actually defined on that SV.
1428 # We should fix this
1433 B::IV::IVX = IV_ivx_ix
1434 B::IV::UVX = IV_uvx_ix
1435 B::NV::NVX = NV_nvx_ix
1436 B::NV::COP_SEQ_RANGE_LOW = NV_cop_seq_range_low_ix
1437 B::NV::COP_SEQ_RANGE_HIGH = NV_cop_seq_range_high_ix
1438 B::NV::PARENT_PAD_INDEX = NV_parent_pad_index_ix
1439 B::NV::PARENT_FAKELEX_FLAGS = NV_parent_fakelex_flags_ix
1440 B::PV::CUR = PV_cur_ix
1441 B::PV::LEN = PV_len_ix
1442 B::PVMG::SvSTASH = PVMG_stash_ix
1443 B::PVLV::TARGOFF = PVLV_targoff_ix
1444 B::PVLV::TARGLEN = PVLV_targlen_ix
1445 B::PVLV::TARG = PVLV_targ_ix
1446 B::PVLV::TYPE = PVLV_type_ix
1447 B::GV::STASH = PVGV_stash_ix
1448 B::GV::GvFLAGS = PVGV_flags_ix
1449 B::BM::USEFUL = PVBM_useful_ix
1450 B::BM::PREVIOUS = PVBM_previous_ix
1451 B::BM::RARE = PVBM_rare_ix
1452 B::IO::LINES = PVIO_lines_ix
1453 B::IO::PAGE = PVIO_page_ix
1454 B::IO::PAGE_LEN = PVIO_page_len_ix
1455 B::IO::LINES_LEFT = PVIO_lines_left_ix
1456 B::IO::TOP_NAME = PVIO_top_name_ix
1457 B::IO::TOP_GV = PVIO_top_gv_ix
1458 B::IO::FMT_NAME = PVIO_fmt_name_ix
1459 B::IO::FMT_GV = PVIO_fmt_gv_ix
1460 B::IO::BOTTOM_NAME = PVIO_bottom_name_ix
1461 B::IO::BOTTOM_GV = PVIO_bottom_gv_ix
1462 B::IO::IoTYPE = PVIO_type_ix
1463 B::IO::IoFLAGS = PVIO_flags_ix
1464 B::AV::MAX = PVAV_max_ix
1465 B::FM::LINES = PVFM_lines_ix
1466 B::CV::STASH = PVCV_stash_ix
1467 B::CV::GV = PVCV_gv_ix
1468 B::CV::FILE = PVCV_file_ix
1469 B::CV::DEPTH = PVCV_depth_ix
1470 B::CV::PADLIST = PVCV_padlist_ix
1471 B::CV::OUTSIDE = PVCV_outside_ix
1472 B::CV::OUTSIDE_SEQ = PVCV_outside_seq_ix
1473 B::CV::CvFLAGS = PVCV_flags_ix
1474 B::HV::MAX = PVHV_max_ix
1475 B::HV::KEYS = PVHV_keys_ix
1480 ptr = (ix & 0xFFFF) + (char *)SvANY(sv);
1481 switch ((U8)(ix >> 16)) {
1482 case (U8)(sv_SVp >> 16):
1483 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
1485 case (U8)(sv_IVp >> 16):
1486 ret = sv_2mortal(newSViv(*((IV *)ptr)));
1488 case (U8)(sv_UVp >> 16):
1489 ret = sv_2mortal(newSVuv(*((UV *)ptr)));
1491 case (U8)(sv_STRLENp >> 16):
1492 ret = sv_2mortal(newSVuv(*((STRLEN *)ptr)));
1494 case (U8)(sv_U32p >> 16):
1495 ret = sv_2mortal(newSVuv(*((U32 *)ptr)));
1497 case (U8)(sv_U8p >> 16):
1498 ret = sv_2mortal(newSVuv(*((U8 *)ptr)));
1500 case (U8)(sv_char_pp >> 16):
1501 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
1503 case (U8)(sv_NVp >> 16):
1504 ret = sv_2mortal(newSVnv(*((NV *)ptr)));
1506 case (U8)(sv_char_p >> 16):
1507 ret = newSVpvn_flags((char *)ptr, 1, SVs_TEMP);
1509 case (U8)(sv_SSize_tp >> 16):
1510 ret = sv_2mortal(newSViv(*((SSize_t *)ptr)));
1512 case (U8)(sv_I32p >> 16):
1513 ret = sv_2mortal(newSVuv(*((I32 *)ptr)));
1515 case (U8)(sv_U16p >> 16):
1516 ret = sv_2mortal(newSVuv(*((U16 *)ptr)));
1529 ST(0) = boolSV((I32)SvIVX(sv) != SvIVX(sv));
1530 } else if (sizeof(IV) == 8) {
1532 const IV iv = SvIVX(sv);
1534 * The following way of spelling 32 is to stop compilers on
1535 * 32-bit architectures from moaning about the shift count
1536 * being >= the width of the type. Such architectures don't
1537 * reach this code anyway (unless sizeof(IV) > 8 but then
1538 * everything else breaks too so I'm not fussed at the moment).
1541 wp[0] = htonl(((UV)iv) >> (sizeof(UV)*4));
1543 wp[0] = htonl(((U32)iv) >> (sizeof(UV)*4));
1545 wp[1] = htonl(iv & 0xffffffff);
1546 ST(0) = newSVpvn_flags((char *)wp, 8, SVs_TEMP);
1548 U32 w = htonl((U32)SvIVX(sv));
1549 ST(0) = newSVpvn_flags((char *)&w, 4, SVs_TEMP);
1552 MODULE = B PACKAGE = B::NV PREFIX = Sv
1558 #if PERL_VERSION < 11
1560 MODULE = B PACKAGE = B::RV PREFIX = Sv
1568 MODULE = B PACKAGE = B::REGEXP
1577 PUSHs(newSVpvn_flags(RX_PRECOMP(sv), RX_PRELEN(sv), SVs_TEMP));
1580 /* FIXME - can we code this method more efficiently? */
1586 MODULE = B PACKAGE = B::PV
1596 croak( "argument is not SvROK" );
1615 /* Boyer-Moore table is just after string and its safety-margin \0 */
1616 p += len + PERL_FBM_TABLE_OFFSET;
1618 } else if (ix == 2) {
1619 /* This used to read 257. I think that that was buggy - should have
1620 been 258. (The "\0", the flags byte, and 256 for the table. Not
1621 that anything anywhere calls this method. NWC. */
1622 /* Also, the start pointer has always been SvPVX(sv). Surely it
1623 should be SvPVX(sv) + SvCUR(sv)? The code has faithfully been
1624 refactored with this behaviour, since PVBM was added in
1625 651aa52ea1faa806. */
1626 p = SvPVX_const(sv);
1627 len = SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0);
1631 } else if (SvPOK(sv)) {
1633 p = SvPVX_const(sv);
1635 #if PERL_VERSION < 10
1636 /* Before 5.10 (well 931b58fb28fa5ca7), PAD_COMPNAME_GEN was stored
1637 in SvCUR(), which meant we had to attempt this special casing
1638 to avoid tripping up over variable names in the pads. */
1639 if((SvLEN(sv) && len >= SvLEN(sv))) {
1640 /* It claims to be longer than the space allocated for it -
1641 presuambly it's a variable name in the pad */
1647 /* XXX for backward compatibility, but should fail */
1648 /* croak( "argument is not SvPOK" ); */
1651 ST(0) = newSVpvn_flags(p, len, SVs_TEMP | utf8);
1653 MODULE = B PACKAGE = B::PVMG
1658 MAGIC * mg = NO_INIT
1660 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
1661 XPUSHs(make_mg_object(aTHX_ mg));
1663 MODULE = B PACKAGE = B::MAGIC
1680 XPUSHs(mg->mg_moremagic ? make_mg_object(aTHX_ mg->mg_moremagic)
1684 mPUSHu(mg->mg_private);
1687 PUSHs(newSVpvn_flags(&(mg->mg_type), 1, SVs_TEMP));
1690 mPUSHu(mg->mg_flags);
1696 PUSHs(make_sv_object(aTHX_ NULL, mg->mg_obj));
1700 if (mg->mg_len >= 0) {
1701 PUSHs(newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP));
1702 } else if (mg->mg_len == HEf_SVKEY) {
1703 PUSHs(make_sv_object(aTHX_ NULL, (SV*)mg->mg_ptr));
1705 PUSHs(sv_newmortal());
1707 PUSHs(sv_newmortal());
1710 if(mg->mg_type == PERL_MAGIC_qr) {
1711 mPUSHi(PTR2IV(mg->mg_obj));
1713 croak("REGEX is only meaningful on r-magic");
1717 if (mg->mg_type == PERL_MAGIC_qr) {
1718 REGEXP *rx = (REGEXP *)mg->mg_obj;
1719 PUSHs(newSVpvn_flags(rx ? RX_PRECOMP(rx) : NULL,
1720 rx ? RX_PRELEN(rx) : 0, SVs_TEMP));
1722 croak( "precomp is only meaningful on r-magic" );
1727 MODULE = B PACKAGE = B::GV PREFIX = Gv
1736 #if PERL_VERSION >= 10
1737 ST(0) = sv_2mortal(newSVhek(!ix ? GvNAME_HEK(gv)
1738 : (ix == 1 ? GvFILE_HEK(gv)
1739 : HvNAME_HEK((HV *)gv))));
1741 ST(0) = !ix ? newSVpvn_flags(GvNAME(gv), GvNAMELEN(gv), SVs_TEMP)
1742 : sv_2mortal(newSVpv(ix == 1 ? GvFILE(gv) : HvNAME((HV *)gv), 0))
1752 #if PERL_VERSION >= 9
1753 RETVAL = isGV_with_GP(gv) ? TRUE : FALSE;
1755 RETVAL = TRUE; /* In 5.8 and earlier they all are. */
1758 RETVAL = GvGP(gv) == Null(GP*);
1767 #define GP_sv_ix SVp | offsetof(struct gp, gp_sv)
1768 #define GP_io_ix SVp | offsetof(struct gp, gp_io)
1769 #define GP_cv_ix SVp | offsetof(struct gp, gp_cv)
1770 #define GP_cvgen_ix U32p | offsetof(struct gp, gp_cvgen)
1771 #define GP_refcnt_ix U32p | offsetof(struct gp, gp_refcnt)
1772 #define GP_hv_ix SVp | offsetof(struct gp, gp_hv)
1773 #define GP_av_ix SVp | offsetof(struct gp, gp_av)
1774 #define GP_form_ix SVp | offsetof(struct gp, gp_form)
1775 #define GP_egv_ix SVp | offsetof(struct gp, gp_egv)
1776 #define GP_line_ix line_tp | offsetof(struct gp, gp_line)
1786 GvREFCNT = GP_refcnt_ix
1799 const GV *const gv = CvGV(cv);
1800 Perl_croak(aTHX_ "NULL gp in B::GV::%s", gv ? GvNAME(gv) : "???");
1802 ptr = (ix & 0xFFFF) + (char *)gp;
1803 switch ((U8)(ix >> 16)) {
1804 case (U8)(SVp >> 16):
1805 ret = make_sv_object(aTHX_ NULL, *((SV **)ptr));
1807 case (U8)(U32p >> 16):
1808 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
1810 case (U8)(line_tp >> 16):
1811 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
1821 MODULE = B PACKAGE = B::IO PREFIX = Io
1823 #if PERL_VERSION <= 8
1838 if( strEQ( name, "stdin" ) ) {
1839 handle = PerlIO_stdin();
1841 else if( strEQ( name, "stdout" ) ) {
1842 handle = PerlIO_stdout();
1844 else if( strEQ( name, "stderr" ) ) {
1845 handle = PerlIO_stderr();
1848 croak( "Invalid value '%s'", name );
1850 RETVAL = handle == IoIFP(io);
1854 MODULE = B PACKAGE = B::AV PREFIX = Av
1864 if (AvFILL(av) >= 0) {
1865 SV **svp = AvARRAY(av);
1867 for (i = 0; i <= AvFILL(av); i++)
1868 XPUSHs(make_sv_object(aTHX_ NULL, svp[i]));
1876 if (idx >= 0 && AvFILL(av) >= 0 && idx <= AvFILL(av))
1877 XPUSHs(make_sv_object(aTHX_ NULL, (AvARRAY(av)[idx])));
1879 XPUSHs(make_sv_object(aTHX_ NULL, NULL));
1881 #if PERL_VERSION < 9
1883 #define AvOFF(av) ((XPVAV*)SvANY(av))->xof_off
1889 MODULE = B PACKAGE = B::AV
1897 MODULE = B PACKAGE = B::CV PREFIX = Cv
1909 PUSHs(make_op_object(aTHX_ CvISXSUB(cv) ? NULL
1910 : ix ? CvROOT(cv) : CvSTART(cv)));
1918 ST(0) = ix && CvCONST(cv)
1919 ? make_sv_object(aTHX_ NULL, (SV *)CvXSUBANY(cv).any_ptr)
1920 : sv_2mortal(newSViv(CvISXSUB(cv)
1921 ? (ix ? CvXSUBANY(cv).any_iv
1922 : PTR2IV(CvXSUB(cv)))
1925 MODULE = B PACKAGE = B::CV PREFIX = cv_
1931 MODULE = B PACKAGE = B::HV PREFIX = Hv
1941 #if PERL_VERSION < 9
1947 PUSHs(make_op_object(aTHX_ HvPMROOT(hv));
1955 if (HvKEYS(hv) > 0) {
1959 (void)hv_iterinit(hv);
1960 EXTEND(sp, HvKEYS(hv) * 2);
1961 while ((sv = hv_iternextsv(hv, &key, &len))) {
1963 PUSHs(make_sv_object(aTHX_ NULL, sv));
1967 MODULE = B PACKAGE = B::HE PREFIX = He
1975 RETVAL = ix ? HeSVKEY_force(he) : HeVAL(he);
1983 MODULE = B PACKAGE = B::RHE
1985 #if PERL_VERSION >= 9
1991 RETVAL = newRV( (SV*)cophh_2hv(h, 0) );