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
33 #if PERL_VERSION >= 19
39 #if PERL_VERSION >= 11
67 static const char* const opclassnames[] = {
83 static const size_t opsizes[] = {
99 #define MY_CXT_KEY "B::_guts" XS_VERSION
102 int x_walkoptree_debug; /* Flag for walkoptree debug hook */
103 SV * x_specialsv_list[7];
108 #define walkoptree_debug (MY_CXT.x_walkoptree_debug)
109 #define specialsv_list (MY_CXT.x_specialsv_list)
112 cc_opclass(pTHX_ const OP *o)
119 if (o->op_type == 0) {
120 if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
122 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
125 if (o->op_type == OP_SASSIGN)
126 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPc_UNOP : OPc_BINOP);
128 if (o->op_type == OP_AELEMFAST) {
129 #if PERL_VERSION <= 14
130 if (o->op_flags & OPf_SPECIAL)
142 if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
143 o->op_type == OP_RCATLINE)
147 if (o->op_type == OP_CUSTOM)
150 switch (OP_CLASS(o)) {
175 case OA_PVOP_OR_SVOP:
177 * Character translations (tr///) are usually a PVOP, keeping a
178 * pointer to a table of shorts used to look up translations.
179 * Under utf8, however, a simple table isn't practical; instead,
180 * the OP is an SVOP (or, under threads, a PADOP),
181 * and the SV is a reference to a swash
182 * (i.e., an RV pointing to an HV).
185 (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
187 #if defined(USE_ITHREADS)
188 ? OPc_PADOP : OPc_PVOP;
190 ? OPc_SVOP : OPc_PVOP;
199 case OA_BASEOP_OR_UNOP:
201 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
202 * whether parens were seen. perly.y uses OPf_SPECIAL to
203 * signal whether a BASEOP had empty parens or none.
204 * Some other UNOPs are created later, though, so the best
205 * test is OPf_KIDS, which is set in newUNOP.
207 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
211 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
212 * the OPf_REF flag to distinguish between OP types instead of the
213 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
214 * return OPc_UNOP so that walkoptree can find our children. If
215 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
216 * (no argument to the operator) it's an OP; with OPf_REF set it's
217 * an SVOP (and op_sv is the GV for the filehandle argument).
219 return ((o->op_flags & OPf_KIDS) ? OPc_UNOP :
221 (o->op_flags & OPf_REF) ? OPc_PADOP : OPc_BASEOP);
223 (o->op_flags & OPf_REF) ? OPc_SVOP : OPc_BASEOP);
227 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
228 * label was omitted (in which case it's a BASEOP) or else a term was
229 * seen. In this last case, all except goto are definitely PVOP but
230 * goto is either a PVOP (with an ordinary constant label), an UNOP
231 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
232 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
235 if (o->op_flags & OPf_STACKED)
237 else if (o->op_flags & OPf_SPECIAL)
244 warn("can't determine class of operator %s, assuming BASEOP\n",
250 make_op_object(pTHX_ const OP *o)
252 SV *opsv = sv_newmortal();
253 sv_setiv(newSVrv(opsv, opclassnames[cc_opclass(aTHX_ o)]), PTR2IV(o));
259 get_overlay_object(pTHX_ const OP *o, const char * const name, U32 namelen)
264 SV *sv =get_sv("B::overlay", 0);
265 if (!sv || !SvROK(sv))
268 if (SvTYPE(sv) != SVt_PVHV)
270 key = newSViv(PTR2IV(o));
271 he = hv_fetch_ent((HV*)sv, key, 0, 0);
276 if (!sv || !SvROK(sv))
279 if (SvTYPE(sv) != SVt_PVHV)
281 svp = hv_fetch((HV*)sv, name, namelen, 0);
290 make_sv_object(pTHX_ SV *sv)
292 SV *const arg = sv_newmortal();
293 const char *type = 0;
297 for (iv = 0; iv < (IV)(sizeof(specialsv_list)/sizeof(SV*)); iv++) {
298 if (sv == specialsv_list[iv]) {
304 type = svclassnames[SvTYPE(sv)];
307 sv_setiv(newSVrv(arg, type), iv);
312 make_temp_object(pTHX_ SV *temp)
315 SV *arg = sv_newmortal();
316 const char *const type = svclassnames[SvTYPE(temp)];
317 const IV iv = PTR2IV(temp);
319 target = newSVrv(arg, type);
320 sv_setiv(target, iv);
322 /* Need to keep our "temp" around as long as the target exists.
323 Simplest way seems to be to hang it from magic, and let that clear
324 it up. No vtable, so won't actually get in the way of anything. */
325 sv_magicext(target, temp, PERL_MAGIC_sv, NULL, NULL, 0);
326 /* magic object has had its reference count increased, so we must drop
333 make_warnings_object(pTHX_ const COP *const cop)
335 const STRLEN *const warnings = cop->cop_warnings;
336 const char *type = 0;
338 IV iv = sizeof(specialsv_list)/sizeof(SV*);
340 /* Counting down is deliberate. Before the split between make_sv_object
341 and make_warnings_obj there appeared to be a bug - Nullsv and pWARN_STD
342 were both 0, so you could never get a B::SPECIAL for pWARN_STD */
345 if ((SV*)warnings == specialsv_list[iv]) {
351 SV *arg = sv_newmortal();
352 sv_setiv(newSVrv(arg, type), iv);
355 /* B assumes that warnings are a regular SV. Seems easier to keep it
356 happy by making them into a regular SV. */
357 return make_temp_object(aTHX_ newSVpvn((char *)(warnings + 1), *warnings));
362 make_cop_io_object(pTHX_ COP *cop)
364 SV *const value = newSV(0);
366 Perl_emulate_cop_io(aTHX_ cop, value);
369 return make_sv_object(aTHX_ value);
372 return make_sv_object(aTHX_ NULL);
377 make_mg_object(pTHX_ MAGIC *mg)
379 SV *arg = sv_newmortal();
380 sv_setiv(newSVrv(arg, "B::MAGIC"), PTR2IV(mg));
385 cstring(pTHX_ SV *sv, bool perlstyle)
390 return newSVpvs_flags("0", SVs_TEMP);
392 sstr = newSVpvs_flags("\"", SVs_TEMP);
394 if (perlstyle && SvUTF8(sv)) {
395 SV *tmpsv = sv_newmortal(); /* Temporary SV to feed sv_uni_display */
396 const STRLEN len = SvCUR(sv);
397 const char *s = sv_uni_display(tmpsv, sv, 8*len, UNI_DISPLAY_QQ);
401 sv_catpvs(sstr, "\\\"");
403 sv_catpvs(sstr, "\\$");
405 sv_catpvs(sstr, "\\@");
408 if (strchr("nrftax\\",*(s+1)))
409 sv_catpvn(sstr, s++, 2);
411 sv_catpvs(sstr, "\\\\");
413 else /* should always be printable */
414 sv_catpvn(sstr, s, 1);
422 const char *s = SvPV(sv, len);
423 for (; len; len--, s++)
425 /* At least try a little for readability */
427 sv_catpvs(sstr, "\\\"");
429 sv_catpvs(sstr, "\\\\");
430 /* trigraphs - bleagh */
431 else if (!perlstyle && *s == '?' && len>=3 && s[1] == '?') {
432 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", '?');
434 else if (perlstyle && *s == '$')
435 sv_catpvs(sstr, "\\$");
436 else if (perlstyle && *s == '@')
437 sv_catpvs(sstr, "\\@");
438 else if (isPRINT(*s))
439 sv_catpvn(sstr, s, 1);
441 sv_catpvs(sstr, "\\n");
443 sv_catpvs(sstr, "\\r");
445 sv_catpvs(sstr, "\\t");
447 sv_catpvs(sstr, "\\a");
449 sv_catpvs(sstr, "\\b");
451 sv_catpvs(sstr, "\\f");
452 else if (!perlstyle && *s == '\v')
453 sv_catpvs(sstr, "\\v");
456 /* Don't want promotion of a signed -1 char in sprintf args */
457 const unsigned char c = (unsigned char) *s;
458 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", c);
460 /* XXX Add line breaks if string is long */
463 sv_catpvs(sstr, "\"");
470 SV *sstr = newSVpvs_flags("'", SVs_TEMP);
471 const char *s = SvPV_nolen(sv);
472 /* Don't want promotion of a signed -1 char in sprintf args */
473 const unsigned char c = (unsigned char) *s;
476 sv_catpvs(sstr, "\\'");
478 sv_catpvs(sstr, "\\\\");
480 sv_catpvn(sstr, s, 1);
482 sv_catpvs(sstr, "\\n");
484 sv_catpvs(sstr, "\\r");
486 sv_catpvs(sstr, "\\t");
488 sv_catpvs(sstr, "\\a");
490 sv_catpvs(sstr, "\\b");
492 sv_catpvs(sstr, "\\f");
494 sv_catpvs(sstr, "\\v");
496 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", c);
497 sv_catpvs(sstr, "'");
501 #define PMOP_pmreplstart(o) o->op_pmstashstartu.op_pmreplstart
502 #define PMOP_pmreplroot(o) o->op_pmreplrootu.op_pmreplroot
505 walkoptree(pTHX_ OP *o, const char *method, SV *ref)
510 const char *const classname = opclassnames[cc_opclass(aTHX_ o)];
513 /* Check that no-one has changed our reference, or is holding a reference
515 if (SvREFCNT(ref) == 1 && SvROK(ref) && SvTYPE(ref) == SVt_RV
516 && (object = SvRV(ref)) && SvREFCNT(object) == 1
517 && SvTYPE(object) == SVt_PVMG && SvIOK_only(object)
518 && !SvMAGICAL(object) && !SvMAGIC(object) && SvSTASH(object)) {
519 /* Looks good, so rebless it for the class we need: */
520 sv_bless(ref, gv_stashpv(classname, GV_ADD));
522 /* Need to make a new one. */
523 ref = sv_newmortal();
524 object = newSVrv(ref, classname);
526 sv_setiv(object, PTR2IV(o));
528 if (walkoptree_debug) {
532 perl_call_method("walkoptree_debug", G_DISCARD);
537 perl_call_method(method, G_DISCARD);
538 if (o && (o->op_flags & OPf_KIDS)) {
539 for (kid = ((UNOP*)o)->op_first; kid; kid = OP_SIBLING(kid)) {
540 ref = walkoptree(aTHX_ kid, method, ref);
543 if (o && (cc_opclass(aTHX_ o) == OPc_PMOP) && o->op_type != OP_PUSHRE
544 && (kid = PMOP_pmreplroot(cPMOPo)))
546 ref = walkoptree(aTHX_ kid, method, ref);
552 oplist(pTHX_ OP *o, SV **SP)
554 for(; o; o = o->op_next) {
558 XPUSHs(make_op_object(aTHX_ o));
559 switch (o->op_type) {
561 SP = oplist(aTHX_ PMOP_pmreplstart(cPMOPo), SP);
564 if (o->op_flags & OPf_STACKED && o->op_flags & OPf_SPECIAL) {
565 OP *kid = OP_SIBLING(cLISTOPo->op_first); /* pass pushmark */
566 kid = kUNOP->op_first; /* pass rv2gv */
567 kid = kUNOP->op_first; /* pass leave */
568 SP = oplist(aTHX_ kid->op_next, SP);
572 switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
574 SP = oplist(aTHX_ cLOGOPo->op_other, SP);
577 SP = oplist(aTHX_ cLOOPo->op_lastop, SP);
578 SP = oplist(aTHX_ cLOOPo->op_nextop, SP);
579 SP = oplist(aTHX_ cLOOPo->op_redoop, SP);
587 typedef UNOP *B__UNOP;
588 typedef BINOP *B__BINOP;
589 typedef LOGOP *B__LOGOP;
590 typedef LISTOP *B__LISTOP;
591 typedef PMOP *B__PMOP;
592 typedef SVOP *B__SVOP;
593 typedef PADOP *B__PADOP;
594 typedef PVOP *B__PVOP;
595 typedef LOOP *B__LOOP;
597 typedef METHOP *B__METHOP;
604 #if PERL_VERSION >= 11
605 typedef SV *B__REGEXP;
617 typedef MAGIC *B__MAGIC;
619 typedef struct refcounted_he *B__RHE;
621 typedef PADLIST *B__PADLIST;
623 typedef PADNAMELIST *B__PADNAMELIST;
627 # define ASSIGN_COMMON_ALIAS(prefix, var) \
628 STMT_START { XSANY.any_i32 = STRUCT_OFFSET(struct interpreter, prefix##var); } STMT_END
630 # define ASSIGN_COMMON_ALIAS(prefix, var) \
631 STMT_START { XSANY.any_ptr = (void *)&PL_##var; } STMT_END
634 /* This needs to be ALIASed in a custom way, hence can't easily be defined as
636 static XSPROTO(intrpvar_sv_common); /* prototype to pass -Wmissing-prototypes */
637 static XSPROTO(intrpvar_sv_common)
643 croak_xs_usage(cv, "");
645 ret = *(SV **)(XSANY.any_i32 + (char *)my_perl);
647 ret = *(SV **)(XSANY.any_ptr);
649 ST(0) = make_sv_object(aTHX_ ret);
659 #define PADOFFSETp 0x4
663 /* Keep this last: */
664 #define op_offset_special 0x8
666 /* table that drives most of the B::*OP methods */
671 U8 type; /* if op_offset_special, access is handled on a case-by-case basis */
674 { STR_WITH_LEN("next"), OPp, STRUCT_OFFSET(struct op, op_next), },/* 0*/
675 { STR_WITH_LEN("sibling"), op_offset_special, 0, },/* 1*/
676 { STR_WITH_LEN("targ"), PADOFFSETp, STRUCT_OFFSET(struct op, op_targ), },/* 2*/
677 { STR_WITH_LEN("flags"), U8p, STRUCT_OFFSET(struct op, op_flags), },/* 3*/
678 { STR_WITH_LEN("private"), U8p, STRUCT_OFFSET(struct op, op_private), },/* 4*/
679 { STR_WITH_LEN("first"), OPp, STRUCT_OFFSET(struct unop, op_first), },/* 5*/
680 { STR_WITH_LEN("last"), OPp, STRUCT_OFFSET(struct binop, op_last), },/* 6*/
681 { STR_WITH_LEN("other"), OPp, STRUCT_OFFSET(struct logop, op_other), },/* 7*/
682 { STR_WITH_LEN("pmreplstart"), op_offset_special, 0, },/* 8*/
683 { STR_WITH_LEN("redoop"), OPp, STRUCT_OFFSET(struct loop, op_redoop), },/* 9*/
684 { STR_WITH_LEN("nextop"), OPp, STRUCT_OFFSET(struct loop, op_nextop), },/*10*/
685 { STR_WITH_LEN("lastop"), OPp, STRUCT_OFFSET(struct loop, op_lastop), },/*11*/
686 { STR_WITH_LEN("pmflags"), U32p, STRUCT_OFFSET(struct pmop, op_pmflags),},/*12*/
687 #if PERL_VERSION >= 17
688 { STR_WITH_LEN("code_list"),OPp, STRUCT_OFFSET(struct pmop, op_code_list),},/*13*/
690 { STR_WITH_LEN("code_list"),op_offset_special, 0, }, /*13*/
692 { STR_WITH_LEN("sv"), SVp, STRUCT_OFFSET(struct svop, op_sv), },/*14*/
693 { STR_WITH_LEN("gv"), SVp, STRUCT_OFFSET(struct svop, op_sv), },/*15*/
694 { STR_WITH_LEN("padix"), PADOFFSETp,STRUCT_OFFSET(struct padop, op_padix),},/*16*/
695 { STR_WITH_LEN("cop_seq"), U32p, STRUCT_OFFSET(struct cop, cop_seq), },/*17*/
696 { STR_WITH_LEN("line"), line_tp, STRUCT_OFFSET(struct cop, cop_line), },/*18*/
697 { STR_WITH_LEN("hints"), U32p, STRUCT_OFFSET(struct cop, cop_hints), },/*19*/
699 { STR_WITH_LEN("pmoffset"),IVp, STRUCT_OFFSET(struct pmop, op_pmoffset),},/*20*/
700 { STR_WITH_LEN("filegv"), op_offset_special, 0, },/*21*/
701 { STR_WITH_LEN("file"), char_pp, STRUCT_OFFSET(struct cop, cop_file), },/*22*/
702 { STR_WITH_LEN("stash"), op_offset_special, 0, },/*23*/
703 # if PERL_VERSION < 17
704 { STR_WITH_LEN("stashpv"), char_pp, STRUCT_OFFSET(struct cop, cop_stashpv),}, /*24*/
705 { STR_WITH_LEN("stashoff"),op_offset_special, 0, },/*25*/
707 { STR_WITH_LEN("stashpv"), op_offset_special, 0, },/*24*/
708 { STR_WITH_LEN("stashoff"),PADOFFSETp,STRUCT_OFFSET(struct cop,cop_stashoff),},/*25*/
711 { STR_WITH_LEN("pmoffset"),op_offset_special, 0, },/*20*/
712 { STR_WITH_LEN("filegv"), SVp, STRUCT_OFFSET(struct cop, cop_filegv),},/*21*/
713 { STR_WITH_LEN("file"), op_offset_special, 0, },/*22*/
714 { STR_WITH_LEN("stash"), SVp, STRUCT_OFFSET(struct cop, cop_stash), },/*23*/
715 { STR_WITH_LEN("stashpv"), op_offset_special, 0, },/*24*/
716 { STR_WITH_LEN("stashoff"),op_offset_special, 0, },/*25*/
718 { STR_WITH_LEN("size"), op_offset_special, 0, },/*26*/
719 { STR_WITH_LEN("name"), op_offset_special, 0, },/*27*/
720 { STR_WITH_LEN("desc"), op_offset_special, 0, },/*28*/
721 { STR_WITH_LEN("ppaddr"), op_offset_special, 0, },/*29*/
722 { STR_WITH_LEN("type"), op_offset_special, 0, },/*30*/
723 { STR_WITH_LEN("opt"), op_offset_special, 0, },/*31*/
724 { STR_WITH_LEN("spare"), op_offset_special, 0, },/*32*/
725 { STR_WITH_LEN("children"),op_offset_special, 0, },/*33*/
726 { STR_WITH_LEN("pmreplroot"), op_offset_special, 0, },/*34*/
727 { STR_WITH_LEN("pmstashpv"), op_offset_special, 0, },/*35*/
728 { STR_WITH_LEN("pmstash"), op_offset_special, 0, },/*36*/
729 { STR_WITH_LEN("precomp"), op_offset_special, 0, },/*37*/
730 { STR_WITH_LEN("reflags"), op_offset_special, 0, },/*38*/
731 { STR_WITH_LEN("sv"), op_offset_special, 0, },/*39*/
732 { STR_WITH_LEN("gv"), op_offset_special, 0, },/*40*/
733 { STR_WITH_LEN("pv"), op_offset_special, 0, },/*41*/
734 { STR_WITH_LEN("label"), op_offset_special, 0, },/*42*/
735 { STR_WITH_LEN("arybase"), op_offset_special, 0, },/*43*/
736 { STR_WITH_LEN("warnings"),op_offset_special, 0, },/*44*/
737 { STR_WITH_LEN("io"), op_offset_special, 0, },/*45*/
738 { STR_WITH_LEN("hints_hash"),op_offset_special, 0, },/*46*/
739 #if PERL_VERSION >= 17
740 { STR_WITH_LEN("slabbed"), op_offset_special, 0, },/*47*/
741 { STR_WITH_LEN("savefree"),op_offset_special, 0, },/*48*/
742 { STR_WITH_LEN("static"), op_offset_special, 0, },/*49*/
743 # if PERL_VERSION >= 19
744 { STR_WITH_LEN("folded"), op_offset_special, 0, },/*50*/
745 { STR_WITH_LEN("lastsib"), op_offset_special, 0, },/*51*/
746 { STR_WITH_LEN("parent"), op_offset_special, 0, },/*52*/
749 #if PERL_VERSION >= 21
750 { STR_WITH_LEN("first"), op_offset_special, 0, },/*53*/
751 { STR_WITH_LEN("meth_sv"), op_offset_special, 0, },/*54*/
755 #include "const-c.inc"
757 MODULE = B PACKAGE = B
759 INCLUDE: const-xs.inc
766 const char *file = __FILE__;
768 specialsv_list[0] = Nullsv;
769 specialsv_list[1] = &PL_sv_undef;
770 specialsv_list[2] = &PL_sv_yes;
771 specialsv_list[3] = &PL_sv_no;
772 specialsv_list[4] = (SV *) pWARN_ALL;
773 specialsv_list[5] = (SV *) pWARN_NONE;
774 specialsv_list[6] = (SV *) pWARN_STD;
776 cv = newXS("B::init_av", intrpvar_sv_common, file);
777 ASSIGN_COMMON_ALIAS(I, initav);
778 cv = newXS("B::check_av", intrpvar_sv_common, file);
779 ASSIGN_COMMON_ALIAS(I, checkav_save);
780 cv = newXS("B::unitcheck_av", intrpvar_sv_common, file);
781 ASSIGN_COMMON_ALIAS(I, unitcheckav_save);
782 cv = newXS("B::begin_av", intrpvar_sv_common, file);
783 ASSIGN_COMMON_ALIAS(I, beginav_save);
784 cv = newXS("B::end_av", intrpvar_sv_common, file);
785 ASSIGN_COMMON_ALIAS(I, endav);
786 cv = newXS("B::main_cv", intrpvar_sv_common, file);
787 ASSIGN_COMMON_ALIAS(I, main_cv);
788 cv = newXS("B::inc_gv", intrpvar_sv_common, file);
789 ASSIGN_COMMON_ALIAS(I, incgv);
790 cv = newXS("B::defstash", intrpvar_sv_common, file);
791 ASSIGN_COMMON_ALIAS(I, defstash);
792 cv = newXS("B::curstash", intrpvar_sv_common, file);
793 ASSIGN_COMMON_ALIAS(I, curstash);
795 cv = newXS("B::formfeed", intrpvar_sv_common, file);
796 ASSIGN_COMMON_ALIAS(I, formfeed);
799 cv = newXS("B::regex_padav", intrpvar_sv_common, file);
800 ASSIGN_COMMON_ALIAS(I, regex_padav);
802 cv = newXS("B::warnhook", intrpvar_sv_common, file);
803 ASSIGN_COMMON_ALIAS(I, warnhook);
804 cv = newXS("B::diehook", intrpvar_sv_common, file);
805 ASSIGN_COMMON_ALIAS(I, diehook);
813 PUSHs(make_sv_object(aTHX_ GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV))));
820 RETVAL = PL_amagic_generation;
827 PADLIST *padlist = CvPADLIST(PL_main_cv ? PL_main_cv : PL_compcv);
831 SV * const rv = sv_newmortal();
832 sv_setiv(newSVrv(rv, padlist ? "B::PADLIST" : "B::NULL"),
837 PUSHs(make_sv_object(aTHX_ (SV *)padlist));
846 PUSHs(make_sv_object(aTHX_ ix > 1 ? &PL_sv_yes
847 : ix < 1 ? &PL_sv_undef
855 PUSHs(make_op_object(aTHX_ ix ? PL_main_start : PL_main_root));
862 RETVAL = ix ? PL_dowarn : PL_sub_generation;
867 walkoptree(op, method)
871 (void) walkoptree(aTHX_ op, method, &PL_sv_undef);
874 walkoptree_debug(...)
877 RETVAL = walkoptree_debug;
878 if (items > 0 && SvTRUE(ST(1)))
879 walkoptree_debug = 1;
883 #define address(sv) PTR2IV(sv)
894 croak("argument is not a reference");
895 PUSHs(make_sv_object(aTHX_ SvRV(sv)));
904 ST(0) = sv_newmortal();
905 if (strncmp(name,"pp_",3) == 0)
907 for (i = 0; i < PL_maxo; i++)
909 if (strcmp(name, PL_op_name[i]) == 0)
915 sv_setiv(ST(0),result);
922 ST(0) = sv_newmortal();
923 if (opnum >= 0 && opnum < PL_maxo)
924 Perl_sv_setpvf(aTHX_ ST(0), "pp_%s", PL_op_name[opnum]);
932 const char *s = SvPVbyte(sv, len);
933 PERL_HASH(hash, s, len);
934 ST(0) = sv_2mortal(Perl_newSVpvf(aTHX_ "0x%"UVxf, (UV)hash));
936 #define cast_I32(foo) (I32)foo
958 PUSHs(ix == 2 ? cchar(aTHX_ sv) : cstring(aTHX_ sv, (bool)ix));
967 MODULE = B PACKAGE = B::OP
970 # The type checking code in B has always been identical for all OP types,
971 # irrespective of whether the action is actually defined on that OP.
985 B::PMOP::pmreplstart = 8
989 B::PMOP::pmflags = 12
990 B::PMOP::code_list = 13
997 B::PMOP::pmoffset = 20
1001 B::COP::stashpv = 24
1002 B::COP::stashoff = 25
1010 B::LISTOP::children = 33
1011 B::PMOP::pmreplroot = 34
1012 B::PMOP::pmstashpv = 35
1013 B::PMOP::pmstash = 36
1014 B::PMOP::precomp = 37
1015 B::PMOP::reflags = 38
1020 B::COP::arybase = 43
1021 B::COP::warnings = 44
1023 B::COP::hints_hash = 46
1025 B::OP::savefree = 48
1030 B::METHOP::first = 53
1031 B::METHOP::meth_sv = 54
1035 if (ix < 0 || (U32)ix >= C_ARRAY_LENGTH(op_methods))
1036 croak("Illegal alias %d for B::*OP::next", (int)ix);
1037 ret = get_overlay_object(aTHX_ o,
1038 op_methods[ix].name, op_methods[ix].namelen);
1044 /* handle non-direct field access */
1046 if (op_methods[ix].type == op_offset_special)
1048 case 1: /* B::OP::op_sibling */
1049 ret = make_op_object(aTHX_ OP_SIBLING(o));
1052 case 8: /* B::PMOP::pmreplstart */
1053 ret = make_op_object(aTHX_
1054 cPMOPo->op_type == OP_SUBST
1055 ? cPMOPo->op_pmstashstartu.op_pmreplstart
1060 case 21: /* B::COP::filegv */
1061 ret = make_sv_object(aTHX_ (SV *)CopFILEGV((COP*)o));
1064 #ifndef USE_ITHREADS
1065 case 22: /* B::COP::file */
1066 ret = sv_2mortal(newSVpv(CopFILE((COP*)o), 0));
1070 case 23: /* B::COP::stash */
1071 ret = make_sv_object(aTHX_ (SV *)CopSTASH((COP*)o));
1074 #if PERL_VERSION >= 17 || !defined USE_ITHREADS
1075 case 24: /* B::COP::stashpv */
1076 # if PERL_VERSION >= 17
1077 ret = sv_2mortal(CopSTASH((COP*)o)
1078 && SvTYPE(CopSTASH((COP*)o)) == SVt_PVHV
1079 ? newSVhek(HvNAME_HEK(CopSTASH((COP*)o)))
1082 ret = sv_2mortal(newSVpv(CopSTASHPV((COP*)o), 0));
1086 case 26: /* B::OP::size */
1087 ret = sv_2mortal(newSVuv((UV)(opsizes[cc_opclass(aTHX_ o)])));
1089 case 27: /* B::OP::name */
1090 case 28: /* B::OP::desc */
1091 ret = sv_2mortal(newSVpv(
1092 (char *)(ix == 28 ? OP_DESC(o) : OP_NAME(o)), 0));
1094 case 29: /* B::OP::ppaddr */
1097 ret = sv_2mortal(Perl_newSVpvf(aTHX_ "PL_ppaddr[OP_%s]",
1098 PL_op_name[o->op_type]));
1099 for (i=13; (STRLEN)i < SvCUR(ret); ++i)
1100 SvPVX(ret)[i] = toUPPER(SvPVX(ret)[i]);
1103 case 30: /* B::OP::type */
1104 case 31: /* B::OP::opt */
1105 case 32: /* B::OP::spare */
1106 #if PERL_VERSION >= 17
1107 case 47: /* B::OP::slabbed */
1108 case 48: /* B::OP::savefree */
1109 case 49: /* B::OP::static */
1110 #if PERL_VERSION >= 19
1111 case 50: /* B::OP::folded */
1112 case 51: /* B::OP::lastsib */
1115 /* These are all bitfields, so we can't take their addresses */
1116 ret = sv_2mortal(newSVuv((UV)(
1117 ix == 30 ? o->op_type
1118 : ix == 31 ? o->op_opt
1119 : ix == 47 ? o->op_slabbed
1120 : ix == 48 ? o->op_savefree
1121 : ix == 49 ? o->op_static
1122 : ix == 50 ? o->op_folded
1123 : ix == 51 ? o->op_lastsib
1126 case 33: /* B::LISTOP::children */
1130 for (kid = ((LISTOP*)o)->op_first; kid; kid = OP_SIBLING(kid))
1132 ret = sv_2mortal(newSVuv(i));
1135 case 34: /* B::PMOP::pmreplroot */
1136 if (cPMOPo->op_type == OP_PUSHRE) {
1138 ret = sv_newmortal();
1139 sv_setiv(ret, cPMOPo->op_pmreplrootu.op_pmtargetoff);
1141 GV *const target = cPMOPo->op_pmreplrootu.op_pmtargetgv;
1142 ret = sv_newmortal();
1143 sv_setiv(newSVrv(ret, target ?
1144 svclassnames[SvTYPE((SV*)target)] : "B::SV"),
1149 OP *const root = cPMOPo->op_pmreplrootu.op_pmreplroot;
1150 ret = make_op_object(aTHX_ root);
1154 case 35: /* B::PMOP::pmstashpv */
1155 ret = sv_2mortal(newSVpv(PmopSTASHPV(cPMOPo),0));
1158 case 36: /* B::PMOP::pmstash */
1159 ret = make_sv_object(aTHX_ (SV *) PmopSTASH(cPMOPo));
1162 case 37: /* B::PMOP::precomp */
1163 case 38: /* B::PMOP::reflags */
1165 REGEXP *rx = PM_GETRE(cPMOPo);
1166 ret = sv_newmortal();
1169 sv_setuv(ret, RX_EXTFLAGS(rx));
1172 sv_setpvn(ret, RX_PRECOMP(rx), RX_PRELEN(rx));
1179 case 39: /* B::PADOP::sv */
1180 case 40: /* B::PADOP::gv */
1181 /* PADOPs should only be created on threaded builds.
1182 * They don't have an sv or gv field, just an op_padix
1183 * field. Leave it to the caller to retrieve padix
1184 * and look up th value in the pad. Don't do it here,
1185 * becuase PL_curpad is the pad of the caller, not the
1186 * pad of the sub the op is part of */
1187 ret = make_sv_object(aTHX_ NULL);
1189 case 41: /* B::PVOP::pv */
1190 /* OP_TRANS uses op_pv to point to a table of 256 or >=258
1191 * shorts whereas other PVOPs point to a null terminated
1193 if ( (cPVOPo->op_type == OP_TRANS
1194 || cPVOPo->op_type == OP_TRANSR) &&
1195 (cPVOPo->op_private & OPpTRANS_COMPLEMENT) &&
1196 !(cPVOPo->op_private & OPpTRANS_DELETE))
1198 const short* const tbl = (short*)cPVOPo->op_pv;
1199 const short entries = 257 + tbl[256];
1200 ret = newSVpvn_flags(cPVOPo->op_pv, entries * sizeof(short), SVs_TEMP);
1202 else if (cPVOPo->op_type == OP_TRANS || cPVOPo->op_type == OP_TRANSR) {
1203 ret = newSVpvn_flags(cPVOPo->op_pv, 256 * sizeof(short), SVs_TEMP);
1206 ret = newSVpvn_flags(cPVOPo->op_pv, strlen(cPVOPo->op_pv), SVs_TEMP);
1208 case 42: /* B::COP::label */
1209 ret = sv_2mortal(newSVpv(CopLABEL(cCOPo),0));
1211 case 43: /* B::COP::arybase */
1212 ret = sv_2mortal(newSVuv(0));
1214 case 44: /* B::COP::warnings */
1215 ret = make_warnings_object(aTHX_ cCOPo);
1217 case 45: /* B::COP::io */
1218 ret = make_cop_io_object(aTHX_ cCOPo);
1220 case 46: /* B::COP::hints_hash */
1221 ret = sv_newmortal();
1222 sv_setiv(newSVrv(ret, "B::RHE"),
1223 PTR2IV(CopHINTHASH_get(cCOPo)));
1225 case 52: /* B::OP::parent */
1226 ret = make_op_object(aTHX_ op_parent(o));
1228 case 53: /* B::METHOP::first */
1229 /* METHOP struct has an op_first/op_meth_sv union
1230 * as its first extra field. How to interpret the
1231 * union depends on the op type. For the purposes of
1232 * B, we treat it as a struct with both fields present,
1233 * where one of the fields always happens to be null
1234 * (i.e. we return NULL in preference to croaking with
1235 * 'method not implemented').
1237 ret = make_op_object(aTHX_
1238 o->op_type == OP_METHOD
1239 ? cMETHOPx(o)->op_u.op_first : NULL);
1241 case 54: /* B::METHOP::meth_sv */
1242 /* see comment above about METHOP */
1243 ret = make_sv_object(aTHX_
1244 o->op_type == OP_METHOD
1245 ? NULL : cMETHOPx(o)->op_u.op_meth_sv);
1248 croak("method %s not implemented", op_methods[ix].name);
1250 /* do a direct structure offset lookup */
1251 const char *const ptr = (char *)o + op_methods[ix].offset;
1252 switch (op_methods[ix].type) {
1254 ret = make_op_object(aTHX_ *((OP **)ptr));
1257 ret = sv_2mortal(newSVuv(*((PADOFFSET*)ptr)));
1260 ret = sv_2mortal(newSVuv(*((U8*)ptr)));
1263 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
1266 ret = make_sv_object(aTHX_ *((SV **)ptr));
1269 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
1272 ret = sv_2mortal(newSViv(*((IV*)ptr)));
1275 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
1278 croak("Illegal type 0x%x for B::*OP::%s",
1279 (unsigned)op_methods[ix].type, op_methods[ix].name);
1290 SP = oplist(aTHX_ o, SP);
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 | STRUCT_OFFSET(struct xpviv, xiv_iv)
1340 #define IV_uvx_ix sv_UVp | STRUCT_OFFSET(struct xpvuv, xuv_uv)
1341 #define NV_nvx_ix sv_NVp | STRUCT_OFFSET(struct xpvnv, xnv_u.xnv_nv)
1343 #define NV_cop_seq_range_low_ix \
1344 sv_U32p | STRUCT_OFFSET(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1345 #define NV_cop_seq_range_high_ix \
1346 sv_U32p | STRUCT_OFFSET(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1347 #define NV_parent_pad_index_ix \
1348 sv_U32p | STRUCT_OFFSET(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1349 #define NV_parent_fakelex_flags_ix \
1350 sv_U32p | STRUCT_OFFSET(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1352 #define PV_cur_ix sv_STRLENp | STRUCT_OFFSET(struct xpv, xpv_cur)
1353 #define PV_len_ix sv_STRLENp | STRUCT_OFFSET(struct xpv, xpv_len)
1355 #define PVMG_stash_ix sv_SVp | STRUCT_OFFSET(struct xpvmg, xmg_stash)
1357 #if PERL_VERSION > 18
1358 # define PVBM_useful_ix sv_IVp | STRUCT_OFFSET(struct xpviv, xiv_u.xivu_iv)
1359 #elif PERL_VERSION > 14
1360 # define PVBM_useful_ix sv_I32p | STRUCT_OFFSET(struct xpvgv, xnv_u.xbm_s.xbm_useful)
1362 #define PVBM_useful_ix sv_I32p | STRUCT_OFFSET(struct xpvgv, xiv_u.xivu_i32)
1365 #define PVLV_targoff_ix sv_U32p | STRUCT_OFFSET(struct xpvlv, xlv_targoff)
1366 #define PVLV_targlen_ix sv_U32p | STRUCT_OFFSET(struct xpvlv, xlv_targlen)
1367 #define PVLV_targ_ix sv_SVp | STRUCT_OFFSET(struct xpvlv, xlv_targ)
1368 #define PVLV_type_ix sv_char_p | STRUCT_OFFSET(struct xpvlv, xlv_type)
1370 #define PVGV_stash_ix sv_SVp | STRUCT_OFFSET(struct xpvgv, xnv_u.xgv_stash)
1371 #define PVGV_flags_ix sv_STRLENp | STRUCT_OFFSET(struct xpvgv, xpv_cur)
1372 #define PVIO_lines_ix sv_IVp | STRUCT_OFFSET(struct xpvio, xiv_iv)
1374 #define PVIO_page_ix sv_IVp | STRUCT_OFFSET(struct xpvio, xio_page)
1375 #define PVIO_page_len_ix sv_IVp | STRUCT_OFFSET(struct xpvio, xio_page_len)
1376 #define PVIO_lines_left_ix sv_IVp | STRUCT_OFFSET(struct xpvio, xio_lines_left)
1377 #define PVIO_top_name_ix sv_char_pp | STRUCT_OFFSET(struct xpvio, xio_top_name)
1378 #define PVIO_top_gv_ix sv_SVp | STRUCT_OFFSET(struct xpvio, xio_top_gv)
1379 #define PVIO_fmt_name_ix sv_char_pp | STRUCT_OFFSET(struct xpvio, xio_fmt_name)
1380 #define PVIO_fmt_gv_ix sv_SVp | STRUCT_OFFSET(struct xpvio, xio_fmt_gv)
1381 #define PVIO_bottom_name_ix sv_char_pp | STRUCT_OFFSET(struct xpvio, xio_bottom_name)
1382 #define PVIO_bottom_gv_ix sv_SVp | STRUCT_OFFSET(struct xpvio, xio_bottom_gv)
1383 #define PVIO_type_ix sv_char_p | STRUCT_OFFSET(struct xpvio, xio_type)
1384 #define PVIO_flags_ix sv_U8p | STRUCT_OFFSET(struct xpvio, xio_flags)
1386 #define PVAV_max_ix sv_SSize_tp | STRUCT_OFFSET(struct xpvav, xav_max)
1388 #define PVCV_stash_ix sv_SVp | STRUCT_OFFSET(struct xpvcv, xcv_stash)
1389 #if PERL_VERSION > 17 || (PERL_VERSION == 17 && PERL_SUBVERSION >= 3)
1390 # define PVCV_gv_ix sv_SVp | STRUCT_OFFSET(struct xpvcv, xcv_gv_u.xcv_gv)
1392 # define PVCV_gv_ix sv_SVp | STRUCT_OFFSET(struct xpvcv, xcv_gv)
1394 #define PVCV_file_ix sv_char_pp | STRUCT_OFFSET(struct xpvcv, xcv_file)
1395 #define PVCV_outside_ix sv_SVp | STRUCT_OFFSET(struct xpvcv, xcv_outside)
1396 #define PVCV_outside_seq_ix sv_U32p | STRUCT_OFFSET(struct xpvcv, xcv_outside_seq)
1397 #define PVCV_flags_ix sv_U32p | STRUCT_OFFSET(struct xpvcv, xcv_flags)
1399 #define PVHV_max_ix sv_STRLENp | STRUCT_OFFSET(struct xpvhv, xhv_max)
1401 #if PERL_VERSION > 12
1402 #define PVHV_keys_ix sv_STRLENp | STRUCT_OFFSET(struct xpvhv, xhv_keys)
1404 #define PVHV_keys_ix sv_IVp | STRUCT_OFFSET(struct xpvhv, xhv_keys)
1407 # The type checking code in B has always been identical for all SV types,
1408 # irrespective of whether the action is actually defined on that SV.
1409 # We should fix this
1414 B::IV::IVX = IV_ivx_ix
1415 B::IV::UVX = IV_uvx_ix
1416 B::NV::NVX = NV_nvx_ix
1417 B::NV::COP_SEQ_RANGE_LOW = NV_cop_seq_range_low_ix
1418 B::NV::COP_SEQ_RANGE_HIGH = NV_cop_seq_range_high_ix
1419 B::NV::PARENT_PAD_INDEX = NV_parent_pad_index_ix
1420 B::NV::PARENT_FAKELEX_FLAGS = NV_parent_fakelex_flags_ix
1421 B::PV::CUR = PV_cur_ix
1422 B::PV::LEN = PV_len_ix
1423 B::PVMG::SvSTASH = PVMG_stash_ix
1424 B::PVLV::TARGOFF = PVLV_targoff_ix
1425 B::PVLV::TARGLEN = PVLV_targlen_ix
1426 B::PVLV::TARG = PVLV_targ_ix
1427 B::PVLV::TYPE = PVLV_type_ix
1428 B::GV::STASH = PVGV_stash_ix
1429 B::GV::GvFLAGS = PVGV_flags_ix
1430 B::BM::USEFUL = PVBM_useful_ix
1431 B::IO::LINES = PVIO_lines_ix
1432 B::IO::PAGE = PVIO_page_ix
1433 B::IO::PAGE_LEN = PVIO_page_len_ix
1434 B::IO::LINES_LEFT = PVIO_lines_left_ix
1435 B::IO::TOP_NAME = PVIO_top_name_ix
1436 B::IO::TOP_GV = PVIO_top_gv_ix
1437 B::IO::FMT_NAME = PVIO_fmt_name_ix
1438 B::IO::FMT_GV = PVIO_fmt_gv_ix
1439 B::IO::BOTTOM_NAME = PVIO_bottom_name_ix
1440 B::IO::BOTTOM_GV = PVIO_bottom_gv_ix
1441 B::IO::IoTYPE = PVIO_type_ix
1442 B::IO::IoFLAGS = PVIO_flags_ix
1443 B::AV::MAX = PVAV_max_ix
1444 B::CV::STASH = PVCV_stash_ix
1445 B::CV::FILE = PVCV_file_ix
1446 B::CV::OUTSIDE = PVCV_outside_ix
1447 B::CV::OUTSIDE_SEQ = PVCV_outside_seq_ix
1448 B::CV::CvFLAGS = PVCV_flags_ix
1449 B::HV::MAX = PVHV_max_ix
1450 B::HV::KEYS = PVHV_keys_ix
1455 ptr = (ix & 0xFFFF) + (char *)SvANY(sv);
1456 switch ((U8)(ix >> 16)) {
1457 case (U8)(sv_SVp >> 16):
1458 ret = make_sv_object(aTHX_ *((SV **)ptr));
1460 case (U8)(sv_IVp >> 16):
1461 ret = sv_2mortal(newSViv(*((IV *)ptr)));
1463 case (U8)(sv_UVp >> 16):
1464 ret = sv_2mortal(newSVuv(*((UV *)ptr)));
1466 case (U8)(sv_STRLENp >> 16):
1467 ret = sv_2mortal(newSVuv(*((STRLEN *)ptr)));
1469 case (U8)(sv_U32p >> 16):
1470 ret = sv_2mortal(newSVuv(*((U32 *)ptr)));
1472 case (U8)(sv_U8p >> 16):
1473 ret = sv_2mortal(newSVuv(*((U8 *)ptr)));
1475 case (U8)(sv_char_pp >> 16):
1476 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
1478 case (U8)(sv_NVp >> 16):
1479 ret = sv_2mortal(newSVnv(*((NV *)ptr)));
1481 case (U8)(sv_char_p >> 16):
1482 ret = newSVpvn_flags((char *)ptr, 1, SVs_TEMP);
1484 case (U8)(sv_SSize_tp >> 16):
1485 ret = sv_2mortal(newSViv(*((SSize_t *)ptr)));
1487 case (U8)(sv_I32p >> 16):
1488 ret = sv_2mortal(newSVuv(*((I32 *)ptr)));
1490 case (U8)(sv_U16p >> 16):
1491 ret = sv_2mortal(newSVuv(*((U16 *)ptr)));
1494 croak("Illegal alias 0x%08x for B::*IVX", (unsigned)ix);
1506 ST(0) = boolSV((I32)SvIVX(sv) != SvIVX(sv));
1507 } else if (sizeof(IV) == 8) {
1509 const IV iv = SvIVX(sv);
1511 * The following way of spelling 32 is to stop compilers on
1512 * 32-bit architectures from moaning about the shift count
1513 * being >= the width of the type. Such architectures don't
1514 * reach this code anyway (unless sizeof(IV) > 8 but then
1515 * everything else breaks too so I'm not fussed at the moment).
1518 wp[0] = htonl(((UV)iv) >> (sizeof(UV)*4));
1520 wp[0] = htonl(((U32)iv) >> (sizeof(UV)*4));
1522 wp[1] = htonl(iv & 0xffffffff);
1523 ST(0) = newSVpvn_flags((char *)wp, 8, SVs_TEMP);
1525 U32 w = htonl((U32)SvIVX(sv));
1526 ST(0) = newSVpvn_flags((char *)&w, 4, SVs_TEMP);
1529 MODULE = B PACKAGE = B::NV PREFIX = Sv
1535 #if PERL_VERSION < 11
1537 MODULE = B PACKAGE = B::RV PREFIX = Sv
1543 PUSHs(make_sv_object(aTHX_ SvRV(sv)));
1547 MODULE = B PACKAGE = B::REGEXP
1557 PUSHs(newSVpvn_flags(RX_PRECOMP(sv), RX_PRELEN(sv), SVs_TEMP));
1559 PUSHs(make_sv_object(aTHX_ (SV *)ReANY(sv)->qr_anoncv));
1562 /* FIXME - can we code this method more efficiently? */
1568 MODULE = B PACKAGE = B::PV
1575 croak( "argument is not SvROK" );
1576 PUSHs(make_sv_object(aTHX_ SvRV(sv)));
1591 #ifndef PERL_FBM_TABLE_OFFSET
1592 const MAGIC *const mg = mg_find(sv, PERL_MAGIC_bm);
1595 croak("argument to B::BM::TABLE is not a PVBM");
1600 /* Boyer-Moore table is just after string and its safety-margin \0 */
1601 p += len + PERL_FBM_TABLE_OFFSET;
1604 } else if (ix == 2) {
1605 /* This used to read 257. I think that that was buggy - should have
1606 been 258. (The "\0", the flags byte, and 256 for the table.)
1607 The only user of this method is B::Bytecode in B::PV::bsave.
1608 I'm guessing that nothing tested the runtime correctness of
1609 output of bytecompiled string constant arguments to index (etc).
1611 Note the start pointer is and has always been SvPVX(sv), not
1612 SvPVX(sv) + SvCUR(sv) PVBM was added in 651aa52ea1faa806, and
1613 first used by the compiler in 651aa52ea1faa806. It's used to
1614 get a "complete" dump of the buffer at SvPVX(), not just the
1615 PVBM table. This permits the generated bytecode to "load"
1618 5.15 and later store the BM table via MAGIC, so the compiler
1619 should handle this just fine without changes if PVBM now
1620 always returns the SvPVX() buffer. */
1623 ? RX_WRAPPED_const((REGEXP*)sv)
1626 p = SvPVX_const(sv);
1628 #ifdef PERL_FBM_TABLE_OFFSET
1629 len = SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0);
1635 p = isREGEXP(sv) ? RX_WRAPPED((REGEXP*)sv) : SvPVX(sv);
1640 } else if (SvPOK(sv)) {
1642 p = SvPVX_const(sv);
1646 else if (isREGEXP(sv)) {
1648 p = RX_WRAPPED_const((REGEXP*)sv);
1653 /* XXX for backward compatibility, but should fail */
1654 /* croak( "argument is not SvPOK" ); */
1657 ST(0) = newSVpvn_flags(p, len, SVs_TEMP | utf8);
1659 MODULE = B PACKAGE = B::PVMG
1664 MAGIC * mg = NO_INIT
1666 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
1667 XPUSHs(make_mg_object(aTHX_ mg));
1669 MODULE = B PACKAGE = B::MAGIC
1686 XPUSHs(mg->mg_moremagic ? make_mg_object(aTHX_ mg->mg_moremagic)
1690 mPUSHu(mg->mg_private);
1693 PUSHs(newSVpvn_flags(&(mg->mg_type), 1, SVs_TEMP));
1696 mPUSHu(mg->mg_flags);
1702 PUSHs(make_sv_object(aTHX_ mg->mg_obj));
1706 if (mg->mg_len >= 0) {
1707 PUSHs(newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP));
1708 } else if (mg->mg_len == HEf_SVKEY) {
1709 PUSHs(make_sv_object(aTHX_ (SV*)mg->mg_ptr));
1711 PUSHs(sv_newmortal());
1713 PUSHs(sv_newmortal());
1716 if(mg->mg_type == PERL_MAGIC_qr) {
1717 mPUSHi(PTR2IV(mg->mg_obj));
1719 croak("REGEX is only meaningful on r-magic");
1723 if (mg->mg_type == PERL_MAGIC_qr) {
1724 REGEXP *rx = (REGEXP *)mg->mg_obj;
1725 PUSHs(newSVpvn_flags(rx ? RX_PRECOMP(rx) : NULL,
1726 rx ? RX_PRELEN(rx) : 0, SVs_TEMP));
1728 croak( "precomp is only meaningful on r-magic" );
1733 MODULE = B PACKAGE = B::BM PREFIX = Bm
1739 #if PERL_VERSION >= 19
1740 PERL_UNUSED_VAR(sv);
1742 RETVAL = BmPREVIOUS(sv);
1751 #if PERL_VERSION >= 19
1752 PERL_UNUSED_VAR(sv);
1754 RETVAL = BmRARE(sv);
1759 MODULE = B PACKAGE = B::GV PREFIX = Gv
1768 ST(0) = sv_2mortal(newSVhek(!ix ? GvNAME_HEK(gv)
1769 : (ix == 1 ? GvFILE_HEK(gv)
1770 : HvNAME_HEK((HV *)gv))));
1779 RETVAL = isGV_with_GP(gv) ? TRUE : FALSE;
1781 RETVAL = GvGP(gv) == Null(GP*);
1790 #define GP_sv_ix (SVp << 16) | STRUCT_OFFSET(struct gp, gp_sv)
1791 #define GP_io_ix (SVp << 16) | STRUCT_OFFSET(struct gp, gp_io)
1792 #define GP_cv_ix (SVp << 16) | STRUCT_OFFSET(struct gp, gp_cv)
1793 #define GP_cvgen_ix (U32p << 16) | STRUCT_OFFSET(struct gp, gp_cvgen)
1794 #define GP_refcnt_ix (U32p << 16) | STRUCT_OFFSET(struct gp, gp_refcnt)
1795 #define GP_hv_ix (SVp << 16) | STRUCT_OFFSET(struct gp, gp_hv)
1796 #define GP_av_ix (SVp << 16) | STRUCT_OFFSET(struct gp, gp_av)
1797 #define GP_form_ix (SVp << 16) | STRUCT_OFFSET(struct gp, gp_form)
1798 #define GP_egv_ix (SVp << 16) | STRUCT_OFFSET(struct gp, gp_egv)
1808 GvREFCNT = GP_refcnt_ix
1820 const GV *const gv = CvGV(cv);
1821 Perl_croak(aTHX_ "NULL gp in B::GV::%s", gv ? GvNAME(gv) : "???");
1823 ptr = (ix & 0xFFFF) + (char *)gp;
1824 switch ((U8)(ix >> 16)) {
1826 ret = make_sv_object(aTHX_ *((SV **)ptr));
1829 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
1832 croak("Illegal alias 0x%08x for B::*SV", (unsigned)ix);
1849 PUSHs(make_sv_object(aTHX_ (SV *)GvFILEGV(gv)));
1851 MODULE = B PACKAGE = B::IO PREFIX = Io
1861 if( strEQ( name, "stdin" ) ) {
1862 handle = PerlIO_stdin();
1864 else if( strEQ( name, "stdout" ) ) {
1865 handle = PerlIO_stdout();
1867 else if( strEQ( name, "stderr" ) ) {
1868 handle = PerlIO_stderr();
1871 croak( "Invalid value '%s'", name );
1873 RETVAL = handle == IoIFP(io);
1877 MODULE = B PACKAGE = B::AV PREFIX = Av
1887 if (AvFILL(av) >= 0) {
1888 SV **svp = AvARRAY(av);
1890 for (i = 0; i <= AvFILL(av); i++)
1891 XPUSHs(make_sv_object(aTHX_ svp[i]));
1899 if (idx >= 0 && AvFILL(av) >= 0 && idx <= AvFILL(av))
1900 XPUSHs(make_sv_object(aTHX_ (AvARRAY(av)[idx])));
1902 XPUSHs(make_sv_object(aTHX_ NULL));
1905 MODULE = B PACKAGE = B::FM PREFIX = Fm
1911 PERL_UNUSED_VAR(format);
1917 MODULE = B PACKAGE = B::CV PREFIX = Cv
1929 PUSHs(make_op_object(aTHX_ CvISXSUB(cv) ? NULL
1930 : ix ? CvROOT(cv) : CvSTART(cv)));
1942 RETVAL = CvISXSUB(cv) ? NULL : CvPADLIST(cv);
1952 PUSHs(make_sv_object(aTHX_ (SV *)CvPADLIST(cv)));
1961 RETVAL = newSVuv(CvISXSUB(cv) ? PTR2UV(CvHSCXT(cv)) : 0);
1971 ST(0) = ix && CvCONST(cv)
1972 ? make_sv_object(aTHX_ (SV *)CvXSUBANY(cv).any_ptr)
1973 : sv_2mortal(newSViv(CvISXSUB(cv)
1974 ? (ix ? CvXSUBANY(cv).any_iv
1975 : PTR2IV(CvXSUB(cv)))
1982 PUSHs(make_sv_object(aTHX_ (SV *)cv_const_sv(cv)));
1988 ST(0) = make_sv_object(aTHX_ (SV*)CvGV(cv));
1990 #if PERL_VERSION > 17
1996 RETVAL = CvNAMED(cv) ? newSVhek(CvNAME_HEK(cv)) : &PL_sv_undef;
2002 MODULE = B PACKAGE = B::HV PREFIX = Hv
2016 if (HvUSEDKEYS(hv) > 0) {
2018 (void)hv_iterinit(hv);
2019 EXTEND(sp, HvUSEDKEYS(hv) * 2);
2020 while ((he = hv_iternext(hv))) {
2022 mPUSHs(HeSVKEY(he));
2023 } else if (HeKUTF8(he)) {
2024 PUSHs(newSVpvn_flags(HeKEY(he), HeKLEN(he), SVf_UTF8|SVs_TEMP));
2026 mPUSHp(HeKEY(he), HeKLEN(he));
2028 PUSHs(make_sv_object(aTHX_ HeVAL(he)));
2032 MODULE = B PACKAGE = B::HE PREFIX = He
2040 PUSHs(make_sv_object(aTHX_ ix ? HeSVKEY_force(he) : HeVAL(he)));
2046 MODULE = B PACKAGE = B::RHE
2052 RETVAL = newRV( (SV*)cophh_2hv(h, 0) );
2059 MODULE = B PACKAGE = B::PADLIST PREFIX = Padlist
2064 ALIAS: B::PADNAMELIST::MAX = 0
2066 PERL_UNUSED_VAR(ix);
2067 RETVAL = PadlistMAX(padlist);
2072 PadlistNAMES(padlist)
2076 PadlistARRAY(padlist)
2079 if (PadlistMAX(padlist) >= 0) {
2081 PAD **padp = PadlistARRAY(padlist);
2083 sv_setiv(newSVrv(TARG, PadlistNAMES(padlist)
2086 PTR2IV(PadlistNAMES(padlist)));
2088 for (i = 1; i <= PadlistMAX(padlist); i++)
2089 XPUSHs(make_sv_object(aTHX_ (SV *)padp[i]));
2093 PadlistARRAYelt(padlist, idx)
2097 if (idx < 0 || idx > PadlistMAX(padlist))
2098 XPUSHs(make_sv_object(aTHX_ NULL));
2101 PUSHMARK(PL_stack_sp-1);
2102 XS_B__PADLIST_NAMES(aTHX_ cv);
2106 XPUSHs(make_sv_object(aTHX_
2107 (SV *)PadlistARRAY(padlist)[idx]));
2110 PadlistREFCNT(padlist)
2113 PERL_UNUSED_VAR(padlist);
2114 RETVAL = PadlistREFCNT(padlist);
2120 MODULE = B PACKAGE = B::PADNAMELIST PREFIX = Padnamelist
2123 PadnamelistARRAY(pnl)
2126 if (PadnamelistMAX(pnl) >= 0) {
2127 PADNAME **padp = PadnamelistARRAY(pnl);
2129 for (; i <= PadnamelistMAX(pnl); i++)
2130 XPUSHs(make_sv_object(aTHX_ padp[i]));
2134 PadnamelistARRAYelt(pnl, idx)
2138 if (idx < 0 || idx > PadnamelistMAX(pnl))
2139 XPUSHs(make_sv_object(aTHX_ NULL));
2141 XPUSHs(make_sv_object(aTHX_
2142 (SV *)PadnamelistARRAY(pnl)[idx]));
2145 PadnamelistREFCNT(pnl)