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[] = {
26 #if PERL_VERSION <= 10
34 #if PERL_VERSION >= 11
61 static const char* const opclassnames[] = {
76 static const size_t opsizes[] = {
91 #define MY_CXT_KEY "B::_guts" XS_VERSION
94 int x_walkoptree_debug; /* Flag for walkoptree debug hook */
95 SV * x_specialsv_list[7];
100 #define walkoptree_debug (MY_CXT.x_walkoptree_debug)
101 #define specialsv_list (MY_CXT.x_specialsv_list)
104 cc_opclass(pTHX_ const OP *o)
112 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
114 if (o->op_type == OP_SASSIGN)
115 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPc_UNOP : OPc_BINOP);
117 if (o->op_type == OP_AELEMFAST) {
118 #if PERL_VERSION <= 14
119 if (o->op_flags & OPf_SPECIAL)
131 if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
132 o->op_type == OP_RCATLINE)
136 if (o->op_type == OP_CUSTOM)
139 switch (OP_CLASS(o)) {
164 case OA_PVOP_OR_SVOP:
166 * Character translations (tr///) are usually a PVOP, keeping a
167 * pointer to a table of shorts used to look up translations.
168 * Under utf8, however, a simple table isn't practical; instead,
169 * the OP is an SVOP (or, under threads, a PADOP),
170 * and the SV is a reference to a swash
171 * (i.e., an RV pointing to an HV).
174 (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
176 #if defined(USE_ITHREADS)
177 ? OPc_PADOP : OPc_PVOP;
179 ? OPc_SVOP : OPc_PVOP;
188 case OA_BASEOP_OR_UNOP:
190 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
191 * whether parens were seen. perly.y uses OPf_SPECIAL to
192 * signal whether a BASEOP had empty parens or none.
193 * Some other UNOPs are created later, though, so the best
194 * test is OPf_KIDS, which is set in newUNOP.
196 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
200 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
201 * the OPf_REF flag to distinguish between OP types instead of the
202 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
203 * return OPc_UNOP so that walkoptree can find our children. If
204 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
205 * (no argument to the operator) it's an OP; with OPf_REF set it's
206 * an SVOP (and op_sv is the GV for the filehandle argument).
208 return ((o->op_flags & OPf_KIDS) ? OPc_UNOP :
210 (o->op_flags & OPf_REF) ? OPc_PADOP : OPc_BASEOP);
212 (o->op_flags & OPf_REF) ? OPc_SVOP : OPc_BASEOP);
216 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
217 * label was omitted (in which case it's a BASEOP) or else a term was
218 * seen. In this last case, all except goto are definitely PVOP but
219 * goto is either a PVOP (with an ordinary constant label), an UNOP
220 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
221 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
224 if (o->op_flags & OPf_STACKED)
226 else if (o->op_flags & OPf_SPECIAL)
231 warn("can't determine class of operator %s, assuming BASEOP\n",
237 make_op_object(pTHX_ const OP *o)
239 SV *opsv = sv_newmortal();
240 sv_setiv(newSVrv(opsv, opclassnames[cc_opclass(aTHX_ o)]), PTR2IV(o));
246 get_overlay_object(pTHX_ const OP *o, const char * const name, U32 namelen)
251 SV *sv =get_sv("B::overlay", 0);
252 if (!sv || !SvROK(sv))
255 if (SvTYPE(sv) != SVt_PVHV)
257 key = newSViv(PTR2IV(o));
258 he = hv_fetch_ent((HV*)sv, key, 0, 0);
263 if (!sv || !SvROK(sv))
266 if (SvTYPE(sv) != SVt_PVHV)
268 svp = hv_fetch((HV*)sv, name, namelen, 0);
277 make_sv_object(pTHX_ SV *sv)
279 SV *const arg = sv_newmortal();
280 const char *type = 0;
284 for (iv = 0; iv < (IV)(sizeof(specialsv_list)/sizeof(SV*)); iv++) {
285 if (sv == specialsv_list[iv]) {
291 type = svclassnames[SvTYPE(sv)];
294 sv_setiv(newSVrv(arg, type), iv);
299 make_temp_object(pTHX_ SV *temp)
302 SV *arg = sv_newmortal();
303 const char *const type = svclassnames[SvTYPE(temp)];
304 const IV iv = PTR2IV(temp);
306 target = newSVrv(arg, type);
307 sv_setiv(target, iv);
309 /* Need to keep our "temp" around as long as the target exists.
310 Simplest way seems to be to hang it from magic, and let that clear
311 it up. No vtable, so won't actually get in the way of anything. */
312 sv_magicext(target, temp, PERL_MAGIC_sv, NULL, NULL, 0);
313 /* magic object has had its reference count increased, so we must drop
320 make_warnings_object(pTHX_ const COP *const cop)
322 const STRLEN *const warnings = cop->cop_warnings;
323 const char *type = 0;
325 IV iv = sizeof(specialsv_list)/sizeof(SV*);
327 /* Counting down is deliberate. Before the split between make_sv_object
328 and make_warnings_obj there appeared to be a bug - Nullsv and pWARN_STD
329 were both 0, so you could never get a B::SPECIAL for pWARN_STD */
332 if ((SV*)warnings == specialsv_list[iv]) {
338 SV *arg = sv_newmortal();
339 sv_setiv(newSVrv(arg, type), iv);
342 /* B assumes that warnings are a regular SV. Seems easier to keep it
343 happy by making them into a regular SV. */
344 return make_temp_object(aTHX_ newSVpvn((char *)(warnings + 1), *warnings));
349 make_cop_io_object(pTHX_ COP *cop)
351 SV *const value = newSV(0);
353 Perl_emulate_cop_io(aTHX_ cop, value);
356 return make_sv_object(aTHX_ value);
359 return make_sv_object(aTHX_ NULL);
364 make_mg_object(pTHX_ MAGIC *mg)
366 SV *arg = sv_newmortal();
367 sv_setiv(newSVrv(arg, "B::MAGIC"), PTR2IV(mg));
372 cstring(pTHX_ SV *sv, bool perlstyle)
377 return newSVpvs_flags("0", SVs_TEMP);
379 sstr = newSVpvs_flags("\"", SVs_TEMP);
381 if (perlstyle && SvUTF8(sv)) {
382 SV *tmpsv = sv_newmortal(); /* Temporary SV to feed sv_uni_display */
383 const STRLEN len = SvCUR(sv);
384 const char *s = sv_uni_display(tmpsv, sv, 8*len, UNI_DISPLAY_QQ);
388 sv_catpvs(sstr, "\\\"");
390 sv_catpvs(sstr, "\\$");
392 sv_catpvs(sstr, "\\@");
395 if (strchr("nrftax\\",*(s+1)))
396 sv_catpvn(sstr, s++, 2);
398 sv_catpvs(sstr, "\\\\");
400 else /* should always be printable */
401 sv_catpvn(sstr, s, 1);
409 const char *s = SvPV(sv, len);
410 for (; len; len--, s++)
412 /* At least try a little for readability */
414 sv_catpvs(sstr, "\\\"");
416 sv_catpvs(sstr, "\\\\");
417 /* trigraphs - bleagh */
418 else if (!perlstyle && *s == '?' && len>=3 && s[1] == '?') {
419 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", '?');
421 else if (perlstyle && *s == '$')
422 sv_catpvs(sstr, "\\$");
423 else if (perlstyle && *s == '@')
424 sv_catpvs(sstr, "\\@");
425 else if (isPRINT(*s))
426 sv_catpvn(sstr, s, 1);
428 sv_catpvs(sstr, "\\n");
430 sv_catpvs(sstr, "\\r");
432 sv_catpvs(sstr, "\\t");
434 sv_catpvs(sstr, "\\a");
436 sv_catpvs(sstr, "\\b");
438 sv_catpvs(sstr, "\\f");
439 else if (!perlstyle && *s == '\v')
440 sv_catpvs(sstr, "\\v");
443 /* Don't want promotion of a signed -1 char in sprintf args */
444 const unsigned char c = (unsigned char) *s;
445 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", c);
447 /* XXX Add line breaks if string is long */
450 sv_catpvs(sstr, "\"");
457 SV *sstr = newSVpvs_flags("'", SVs_TEMP);
458 const char *s = SvPV_nolen(sv);
459 /* Don't want promotion of a signed -1 char in sprintf args */
460 const unsigned char c = (unsigned char) *s;
463 sv_catpvs(sstr, "\\'");
465 sv_catpvs(sstr, "\\\\");
467 sv_catpvn(sstr, s, 1);
469 sv_catpvs(sstr, "\\n");
471 sv_catpvs(sstr, "\\r");
473 sv_catpvs(sstr, "\\t");
475 sv_catpvs(sstr, "\\a");
477 sv_catpvs(sstr, "\\b");
479 sv_catpvs(sstr, "\\f");
481 sv_catpvs(sstr, "\\v");
483 Perl_sv_catpvf(aTHX_ sstr, "\\%03o", c);
484 sv_catpvs(sstr, "'");
488 #define PMOP_pmreplstart(o) o->op_pmstashstartu.op_pmreplstart
489 #define PMOP_pmreplroot(o) o->op_pmreplrootu.op_pmreplroot
492 walkoptree(pTHX_ OP *o, const char *method, SV *ref)
497 const char *const classname = opclassnames[cc_opclass(aTHX_ o)];
500 /* Check that no-one has changed our reference, or is holding a reference
502 if (SvREFCNT(ref) == 1 && SvROK(ref) && SvTYPE(ref) == SVt_RV
503 && (object = SvRV(ref)) && SvREFCNT(object) == 1
504 && SvTYPE(object) == SVt_PVMG && SvIOK_only(object)
505 && !SvMAGICAL(object) && !SvMAGIC(object) && SvSTASH(object)) {
506 /* Looks good, so rebless it for the class we need: */
507 sv_bless(ref, gv_stashpv(classname, GV_ADD));
509 /* Need to make a new one. */
510 ref = sv_newmortal();
511 object = newSVrv(ref, classname);
513 sv_setiv(object, PTR2IV(o));
515 if (walkoptree_debug) {
519 perl_call_method("walkoptree_debug", G_DISCARD);
524 perl_call_method(method, G_DISCARD);
525 if (o && (o->op_flags & OPf_KIDS)) {
526 for (kid = ((UNOP*)o)->op_first; kid; kid = kid->op_sibling) {
527 ref = walkoptree(aTHX_ kid, method, ref);
530 if (o && (cc_opclass(aTHX_ o) == OPc_PMOP) && o->op_type != OP_PUSHRE
531 && (kid = PMOP_pmreplroot(cPMOPo)))
533 ref = walkoptree(aTHX_ kid, method, ref);
539 oplist(pTHX_ OP *o, SV **SP)
541 for(; o; o = o->op_next) {
545 XPUSHs(make_op_object(aTHX_ o));
546 switch (o->op_type) {
548 SP = oplist(aTHX_ PMOP_pmreplstart(cPMOPo), SP);
551 if (o->op_flags & OPf_STACKED && o->op_flags & OPf_SPECIAL) {
552 OP *kid = cLISTOPo->op_first->op_sibling; /* pass pushmark */
553 kid = kUNOP->op_first; /* pass rv2gv */
554 kid = kUNOP->op_first; /* pass leave */
555 SP = oplist(aTHX_ kid->op_next, SP);
559 switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
561 SP = oplist(aTHX_ cLOGOPo->op_other, SP);
564 SP = oplist(aTHX_ cLOOPo->op_lastop, SP);
565 SP = oplist(aTHX_ cLOOPo->op_nextop, SP);
566 SP = oplist(aTHX_ cLOOPo->op_redoop, SP);
574 typedef UNOP *B__UNOP;
575 typedef BINOP *B__BINOP;
576 typedef LOGOP *B__LOGOP;
577 typedef LISTOP *B__LISTOP;
578 typedef PMOP *B__PMOP;
579 typedef SVOP *B__SVOP;
580 typedef PADOP *B__PADOP;
581 typedef PVOP *B__PVOP;
582 typedef LOOP *B__LOOP;
590 #if PERL_VERSION >= 11
591 typedef SV *B__REGEXP;
603 typedef MAGIC *B__MAGIC;
605 typedef struct refcounted_he *B__RHE;
607 typedef PADLIST *B__PADLIST;
611 # define ASSIGN_COMMON_ALIAS(prefix, var) \
612 STMT_START { XSANY.any_i32 = offsetof(struct interpreter, prefix##var); } STMT_END
614 # define ASSIGN_COMMON_ALIAS(prefix, var) \
615 STMT_START { XSANY.any_ptr = (void *)&PL_##var; } STMT_END
618 /* This needs to be ALIASed in a custom way, hence can't easily be defined as
620 static XSPROTO(intrpvar_sv_common); /* prototype to pass -Wmissing-prototypes */
621 static XSPROTO(intrpvar_sv_common)
627 croak_xs_usage(cv, "");
629 ret = *(SV **)(XSANY.any_i32 + (char *)my_perl);
631 ret = *(SV **)(XSANY.any_ptr);
633 ST(0) = make_sv_object(aTHX_ ret);
643 #define PADOFFSETp 0x4
647 /* Keep this last: */
648 #define op_offset_special 0x8
650 /* table that drives most of the B::*OP methods */
655 U8 type; /* if op_offset_special, access is handled on a case-by-case basis */
658 STR_WITH_LEN("next"), OPp, offsetof(struct op, op_next), /* 0*/
659 STR_WITH_LEN("sibling"), OPp, offsetof(struct op, op_sibling), /* 1*/
660 STR_WITH_LEN("targ"), PADOFFSETp, offsetof(struct op, op_targ), /* 2*/
661 STR_WITH_LEN("flags"), U8p, offsetof(struct op, op_flags), /* 3*/
662 STR_WITH_LEN("private"), U8p, offsetof(struct op, op_private), /* 4*/
663 STR_WITH_LEN("first"), OPp, offsetof(struct unop, op_first), /* 5*/
664 STR_WITH_LEN("last"), OPp, offsetof(struct binop, op_last), /* 6*/
665 STR_WITH_LEN("other"), OPp, offsetof(struct logop, op_other), /* 7*/
666 STR_WITH_LEN("pmreplstart"), op_offset_special, 0, /* 8*/
667 STR_WITH_LEN("redoop"), OPp, offsetof(struct loop, op_redoop), /* 9*/
668 STR_WITH_LEN("nextop"), OPp, offsetof(struct loop, op_nextop), /*10*/
669 STR_WITH_LEN("lastop"), OPp, offsetof(struct loop, op_lastop), /*11*/
670 STR_WITH_LEN("pmflags"), U32p, offsetof(struct pmop, op_pmflags), /*12*/
671 #if PERL_VERSION >= 17
672 STR_WITH_LEN("code_list"),OPp, offsetof(struct pmop, op_code_list),/*13*/
674 STR_WITH_LEN("code_list"),op_offset_special, 0,
676 STR_WITH_LEN("sv"), SVp, offsetof(struct svop, op_sv), /*14*/
677 STR_WITH_LEN("gv"), SVp, offsetof(struct svop, op_sv), /*15*/
678 STR_WITH_LEN("padix"), PADOFFSETp,offsetof(struct padop, op_padix),/*16*/
679 STR_WITH_LEN("cop_seq"), U32p, offsetof(struct cop, cop_seq), /*17*/
680 STR_WITH_LEN("line"), line_tp, offsetof(struct cop, cop_line), /*18*/
681 STR_WITH_LEN("hints"), U32p, offsetof(struct cop, cop_hints), /*19*/
683 STR_WITH_LEN("pmoffset"),IVp, offsetof(struct pmop, op_pmoffset),/*20*/
684 STR_WITH_LEN("filegv"), op_offset_special, 0, /*21*/
685 STR_WITH_LEN("file"), char_pp, offsetof(struct cop, cop_file), /*22*/
686 STR_WITH_LEN("stash"), op_offset_special, 0, /*23*/
687 # if PERL_VERSION < 17
688 STR_WITH_LEN("stashpv"), char_pp, offsetof(struct cop, cop_stashpv), /*24*/
689 STR_WITH_LEN("stashoff"),op_offset_special, 0, /*25*/
691 STR_WITH_LEN("stashpv"), op_offset_special, 0, /*24*/
692 STR_WITH_LEN("stashoff"),PADOFFSETp,offsetof(struct cop, cop_stashoff),/*25*/
695 STR_WITH_LEN("pmoffset"),op_offset_special, 0, /*20*/
696 STR_WITH_LEN("filegv"), SVp, offsetof(struct cop, cop_filegv), /*21*/
697 STR_WITH_LEN("file"), op_offset_special, 0, /*22*/
698 STR_WITH_LEN("stash"), SVp, offsetof(struct cop, cop_stash), /*23*/
699 STR_WITH_LEN("stashpv"), op_offset_special, 0, /*24*/
700 STR_WITH_LEN("stashoff"),op_offset_special, 0, /*25*/
702 STR_WITH_LEN("size"), op_offset_special, 0, /*26*/
703 STR_WITH_LEN("name"), op_offset_special, 0, /*27*/
704 STR_WITH_LEN("desc"), op_offset_special, 0, /*28*/
705 STR_WITH_LEN("ppaddr"), op_offset_special, 0, /*29*/
706 STR_WITH_LEN("type"), op_offset_special, 0, /*30*/
707 STR_WITH_LEN("opt"), op_offset_special, 0, /*31*/
708 STR_WITH_LEN("spare"), op_offset_special, 0, /*32*/
709 STR_WITH_LEN("children"),op_offset_special, 0, /*33*/
710 STR_WITH_LEN("pmreplroot"), op_offset_special, 0, /*34*/
711 STR_WITH_LEN("pmstashpv"), op_offset_special, 0, /*35*/
712 STR_WITH_LEN("pmstash"), op_offset_special, 0, /*36*/
713 STR_WITH_LEN("precomp"), op_offset_special, 0, /*37*/
714 STR_WITH_LEN("reflags"), op_offset_special, 0, /*38*/
715 STR_WITH_LEN("sv"), op_offset_special, 0, /*39*/
716 STR_WITH_LEN("gv"), op_offset_special, 0, /*40*/
717 STR_WITH_LEN("pv"), op_offset_special, 0, /*41*/
718 STR_WITH_LEN("label"), op_offset_special, 0, /*42*/
719 STR_WITH_LEN("arybase"), op_offset_special, 0, /*43*/
720 STR_WITH_LEN("warnings"),op_offset_special, 0, /*44*/
721 STR_WITH_LEN("io"), op_offset_special, 0, /*45*/
722 STR_WITH_LEN("hints_hash"),op_offset_special, 0, /*46*/
723 #if PERL_VERSION >= 17
724 STR_WITH_LEN("slabbed"), op_offset_special, 0, /*47*/
725 STR_WITH_LEN("savefree"),op_offset_special, 0, /*48*/
726 STR_WITH_LEN("static"), op_offset_special, 0, /*49*/
727 #if PERL_VERSION >= 19
728 STR_WITH_LEN("folded"), op_offset_special, 0, /*50*/
733 #include "const-c.inc"
735 MODULE = B PACKAGE = B
737 INCLUDE: const-xs.inc
744 const char *file = __FILE__;
746 specialsv_list[0] = Nullsv;
747 specialsv_list[1] = &PL_sv_undef;
748 specialsv_list[2] = &PL_sv_yes;
749 specialsv_list[3] = &PL_sv_no;
750 specialsv_list[4] = (SV *) pWARN_ALL;
751 specialsv_list[5] = (SV *) pWARN_NONE;
752 specialsv_list[6] = (SV *) pWARN_STD;
754 cv = newXS("B::init_av", intrpvar_sv_common, file);
755 ASSIGN_COMMON_ALIAS(I, initav);
756 cv = newXS("B::check_av", intrpvar_sv_common, file);
757 ASSIGN_COMMON_ALIAS(I, checkav_save);
758 cv = newXS("B::unitcheck_av", intrpvar_sv_common, file);
759 ASSIGN_COMMON_ALIAS(I, unitcheckav_save);
760 cv = newXS("B::begin_av", intrpvar_sv_common, file);
761 ASSIGN_COMMON_ALIAS(I, beginav_save);
762 cv = newXS("B::end_av", intrpvar_sv_common, file);
763 ASSIGN_COMMON_ALIAS(I, endav);
764 cv = newXS("B::main_cv", intrpvar_sv_common, file);
765 ASSIGN_COMMON_ALIAS(I, main_cv);
766 cv = newXS("B::inc_gv", intrpvar_sv_common, file);
767 ASSIGN_COMMON_ALIAS(I, incgv);
768 cv = newXS("B::defstash", intrpvar_sv_common, file);
769 ASSIGN_COMMON_ALIAS(I, defstash);
770 cv = newXS("B::curstash", intrpvar_sv_common, file);
771 ASSIGN_COMMON_ALIAS(I, curstash);
773 cv = newXS("B::formfeed", intrpvar_sv_common, file);
774 ASSIGN_COMMON_ALIAS(I, formfeed);
777 cv = newXS("B::regex_padav", intrpvar_sv_common, file);
778 ASSIGN_COMMON_ALIAS(I, regex_padav);
780 cv = newXS("B::warnhook", intrpvar_sv_common, file);
781 ASSIGN_COMMON_ALIAS(I, warnhook);
782 cv = newXS("B::diehook", intrpvar_sv_common, file);
783 ASSIGN_COMMON_ALIAS(I, diehook);
791 PUSHs(make_sv_object(aTHX_ GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV))));
798 RETVAL = PL_amagic_generation;
805 PADLIST *padlist = CvPADLIST(PL_main_cv ? PL_main_cv : PL_compcv);
809 SV * const rv = sv_newmortal();
810 sv_setiv(newSVrv(rv, padlist ? "B::PADLIST" : "B::NULL"),
815 PUSHs(make_sv_object(aTHX_ (SV *)padlist));
824 PUSHs(make_sv_object(aTHX_ ix > 1 ? &PL_sv_yes
825 : ix < 1 ? &PL_sv_undef
833 PUSHs(make_op_object(aTHX_ ix ? PL_main_start : PL_main_root));
840 RETVAL = ix ? PL_dowarn : PL_sub_generation;
845 walkoptree(op, method)
849 (void) walkoptree(aTHX_ op, method, &PL_sv_undef);
852 walkoptree_debug(...)
855 RETVAL = walkoptree_debug;
856 if (items > 0 && SvTRUE(ST(1)))
857 walkoptree_debug = 1;
861 #define address(sv) PTR2IV(sv)
872 croak("argument is not a reference");
873 PUSHs(make_sv_object(aTHX_ SvRV(sv)));
882 ST(0) = sv_newmortal();
883 if (strncmp(name,"pp_",3) == 0)
885 for (i = 0; i < PL_maxo; i++)
887 if (strcmp(name, PL_op_name[i]) == 0)
893 sv_setiv(ST(0),result);
900 ST(0) = sv_newmortal();
901 if (opnum >= 0 && opnum < PL_maxo)
902 Perl_sv_setpvf(aTHX_ ST(0), "pp_%s", PL_op_name[opnum]);
910 const char *s = SvPVbyte(sv, len);
911 PERL_HASH(hash, s, len);
912 ST(0) = sv_2mortal(Perl_newSVpvf(aTHX_ "0x%"UVxf, (UV)hash));
914 #define cast_I32(foo) (I32)foo
936 PUSHs(ix == 2 ? cchar(aTHX_ sv) : cstring(aTHX_ sv, (bool)ix));
945 MODULE = B PACKAGE = B::OP
948 # The type checking code in B has always been identical for all OP types,
949 # irrespective of whether the action is actually defined on that OP.
963 B::PMOP::pmreplstart = 8
967 B::PMOP::pmflags = 12
968 B::PMOP::code_list = 13
975 B::PMOP::pmoffset = 20
980 B::COP::stashoff = 25
988 B::LISTOP::children = 33
989 B::PMOP::pmreplroot = 34
990 B::PMOP::pmstashpv = 35
991 B::PMOP::pmstash = 36
992 B::PMOP::precomp = 37
993 B::PMOP::reflags = 38
999 B::COP::warnings = 44
1001 B::COP::hints_hash = 46
1003 B::OP::savefree = 48
1009 if (ix < 0 || ix > 46)
1010 croak("Illegal alias %d for B::*OP::next", (int)ix);
1011 ret = get_overlay_object(aTHX_ o,
1012 op_methods[ix].name, op_methods[ix].namelen);
1018 /* handle non-direct field access */
1020 if (op_methods[ix].type == op_offset_special)
1022 case 8: /* pmreplstart */
1023 ret = make_op_object(aTHX_
1024 cPMOPo->op_type == OP_SUBST
1025 ? cPMOPo->op_pmstashstartu.op_pmreplstart
1030 case 21: /* filegv */
1031 ret = make_sv_object(aTHX_ (SV *)CopFILEGV((COP*)o));
1034 #ifndef USE_ITHREADS
1036 ret = sv_2mortal(newSVpv(CopFILE((COP*)o), 0));
1040 case 23: /* stash */
1041 ret = make_sv_object(aTHX_ (SV *)CopSTASH((COP*)o));
1044 #if PERL_VERSION >= 17 || !defined USE_ITHREADS
1045 case 24: /* stashpv */
1046 # if PERL_VERSION >= 17
1047 ret = sv_2mortal(CopSTASH((COP*)o)
1048 && SvTYPE(CopSTASH((COP*)o)) == SVt_PVHV
1049 ? newSVhek(HvNAME_HEK(CopSTASH((COP*)o)))
1052 ret = sv_2mortal(newSVpv(CopSTASHPV((COP*)o), 0));
1057 ret = sv_2mortal(newSVuv((UV)(opsizes[cc_opclass(aTHX_ o)])));
1061 ret = sv_2mortal(newSVpv(
1062 (char *)(ix == 28 ? OP_DESC(o) : OP_NAME(o)), 0));
1064 case 29: /* ppaddr */
1067 ret = sv_2mortal(Perl_newSVpvf(aTHX_ "PL_ppaddr[OP_%s]",
1068 PL_op_name[o->op_type]));
1069 for (i=13; (STRLEN)i < SvCUR(ret); ++i)
1070 SvPVX(ret)[i] = toUPPER(SvPVX(ret)[i]);
1075 case 32: /* spare */
1076 #if PERL_VERSION >= 17
1077 case 47: /* slabbed */
1078 case 48: /* savefree */
1079 case 49: /* static */
1080 #if PERL_VERSION >= 19
1081 case 50: /* folded */
1084 /* These are all bitfields, so we can't take their addresses */
1085 ret = sv_2mortal(newSVuv((UV)(
1086 ix == 30 ? o->op_type
1087 : ix == 31 ? o->op_opt
1088 : ix == 47 ? o->op_slabbed
1089 : ix == 48 ? o->op_savefree
1090 : ix == 49 ? o->op_static
1091 : ix == 50 ? o->op_folded
1094 case 33: /* children */
1098 for (kid = ((LISTOP*)o)->op_first; kid; kid = kid->op_sibling)
1100 ret = sv_2mortal(newSVuv(i));
1103 case 34: /* pmreplroot */
1104 if (cPMOPo->op_type == OP_PUSHRE) {
1106 ret = sv_newmortal();
1107 sv_setiv(ret, cPMOPo->op_pmreplrootu.op_pmtargetoff);
1109 GV *const target = cPMOPo->op_pmreplrootu.op_pmtargetgv;
1110 ret = sv_newmortal();
1111 sv_setiv(newSVrv(ret, target ?
1112 svclassnames[SvTYPE((SV*)target)] : "B::SV"),
1117 OP *const root = cPMOPo->op_pmreplrootu.op_pmreplroot;
1118 ret = make_op_object(aTHX_ root);
1122 case 35: /* pmstashpv */
1123 ret = sv_2mortal(newSVpv(PmopSTASHPV(cPMOPo),0));
1126 case 36: /* pmstash */
1127 ret = make_sv_object(aTHX_ (SV *) PmopSTASH(cPMOPo));
1130 case 37: /* precomp */
1131 case 38: /* reflags */
1133 REGEXP *rx = PM_GETRE(cPMOPo);
1134 ret = sv_newmortal();
1137 sv_setuv(ret, RX_EXTFLAGS(rx));
1140 sv_setpvn(ret, RX_PRECOMP(rx), RX_PRELEN(rx));
1147 /* It happens that the output typemaps for B::SV and B::GV
1148 * are identical. The "smarts" are in make_sv_object(),
1149 * which determines which class to use based on SvTYPE(),
1150 * rather than anything baked in at compile time. */
1151 if (cPADOPo->op_padix) {
1152 ret = PAD_SVl(cPADOPo->op_padix);
1153 if (ix == 40 && SvTYPE(ret) != SVt_PVGV)
1158 ret = make_sv_object(aTHX_ ret);
1161 /* OP_TRANS uses op_pv to point to a table of 256 or >=258
1162 * shorts whereas other PVOPs point to a null terminated
1164 if ( (cPVOPo->op_type == OP_TRANS
1165 || cPVOPo->op_type == OP_TRANSR) &&
1166 (cPVOPo->op_private & OPpTRANS_COMPLEMENT) &&
1167 !(cPVOPo->op_private & OPpTRANS_DELETE))
1169 const short* const tbl = (short*)cPVOPo->op_pv;
1170 const short entries = 257 + tbl[256];
1171 ret = newSVpvn_flags(cPVOPo->op_pv, entries * sizeof(short), SVs_TEMP);
1173 else if (cPVOPo->op_type == OP_TRANS || cPVOPo->op_type == OP_TRANSR) {
1174 ret = newSVpvn_flags(cPVOPo->op_pv, 256 * sizeof(short), SVs_TEMP);
1177 ret = newSVpvn_flags(cPVOPo->op_pv, strlen(cPVOPo->op_pv), SVs_TEMP);
1179 case 42: /* label */
1180 ret = sv_2mortal(newSVpv(CopLABEL(cCOPo),0));
1182 case 43: /* arybase */
1183 ret = sv_2mortal(newSVuv(0));
1185 case 44: /* warnings */
1186 ret = make_warnings_object(aTHX_ cCOPo);
1189 ret = make_cop_io_object(aTHX_ cCOPo);
1191 case 46: /* hints_hash */
1192 ret = sv_newmortal();
1193 sv_setiv(newSVrv(ret, "B::RHE"),
1194 PTR2IV(CopHINTHASH_get(cCOPo)));
1197 croak("method %s not implemented", op_methods[ix].name);
1199 /* do a direct structure offset lookup */
1200 const char *const ptr = (char *)o + op_methods[ix].offset;
1201 switch (op_methods[ix].type) {
1203 ret = make_op_object(aTHX_ *((OP **)ptr));
1206 ret = sv_2mortal(newSVuv(*((PADOFFSET*)ptr)));
1209 ret = sv_2mortal(newSVuv(*((U8*)ptr)));
1212 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
1215 ret = make_sv_object(aTHX_ *((SV **)ptr));
1218 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
1221 ret = sv_2mortal(newSViv(*((IV*)ptr)));
1224 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
1227 croak("Illegal type 0x%x for B::*OP::%s",
1228 (unsigned)op_methods[ix].type, op_methods[ix].name);
1239 SP = oplist(aTHX_ o, SP);
1242 MODULE = B PACKAGE = B::SV
1244 #define MAGICAL_FLAG_BITS (SVs_GMG|SVs_SMG|SVs_RMG)
1254 MAGICAL = MAGICAL_FLAG_BITS
1256 RETVAL = ix ? (SvFLAGS(sv) & (U32)ix) : SvREFCNT(sv);
1264 ST(0) = sv_2mortal(newRV(sv));
1267 MODULE = B PACKAGE = B::IV PREFIX = Sv
1273 MODULE = B PACKAGE = B::IV
1275 #define sv_SVp 0x00000
1276 #define sv_IVp 0x10000
1277 #define sv_UVp 0x20000
1278 #define sv_STRLENp 0x30000
1279 #define sv_U32p 0x40000
1280 #define sv_U8p 0x50000
1281 #define sv_char_pp 0x60000
1282 #define sv_NVp 0x70000
1283 #define sv_char_p 0x80000
1284 #define sv_SSize_tp 0x90000
1285 #define sv_I32p 0xA0000
1286 #define sv_U16p 0xB0000
1288 #define IV_ivx_ix sv_IVp | offsetof(struct xpviv, xiv_iv)
1289 #define IV_uvx_ix sv_UVp | offsetof(struct xpvuv, xuv_uv)
1290 #define NV_nvx_ix sv_NVp | offsetof(struct xpvnv, xnv_u.xnv_nv)
1292 #define NV_cop_seq_range_low_ix \
1293 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1294 #define NV_cop_seq_range_high_ix \
1295 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1296 #define NV_parent_pad_index_ix \
1297 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1298 #define NV_parent_fakelex_flags_ix \
1299 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1301 #define PV_cur_ix sv_STRLENp | offsetof(struct xpv, xpv_cur)
1302 #define PV_len_ix sv_STRLENp | offsetof(struct xpv, xpv_len)
1304 #define PVMG_stash_ix sv_SVp | offsetof(struct xpvmg, xmg_stash)
1306 #if PERL_VERSION > 18
1307 # define PVBM_useful_ix sv_I32p | offsetof(struct xpvgv, xnv_u.xbm_useful)
1308 #elif PERL_VERSION > 14
1309 # define PVBM_useful_ix sv_I32p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_useful)
1311 #define PVBM_useful_ix sv_I32p | offsetof(struct xpvgv, xiv_u.xivu_i32)
1314 #define PVLV_targoff_ix sv_U32p | offsetof(struct xpvlv, xlv_targoff)
1315 #define PVLV_targlen_ix sv_U32p | offsetof(struct xpvlv, xlv_targlen)
1316 #define PVLV_targ_ix sv_SVp | offsetof(struct xpvlv, xlv_targ)
1317 #define PVLV_type_ix sv_char_p | offsetof(struct xpvlv, xlv_type)
1319 #define PVGV_stash_ix sv_SVp | offsetof(struct xpvgv, xnv_u.xgv_stash)
1320 #define PVGV_flags_ix sv_STRLENp | offsetof(struct xpvgv, xpv_cur)
1321 #define PVIO_lines_ix sv_IVp | offsetof(struct xpvio, xiv_iv)
1323 #define PVIO_page_ix sv_IVp | offsetof(struct xpvio, xio_page)
1324 #define PVIO_page_len_ix sv_IVp | offsetof(struct xpvio, xio_page_len)
1325 #define PVIO_lines_left_ix sv_IVp | offsetof(struct xpvio, xio_lines_left)
1326 #define PVIO_top_name_ix sv_char_pp | offsetof(struct xpvio, xio_top_name)
1327 #define PVIO_top_gv_ix sv_SVp | offsetof(struct xpvio, xio_top_gv)
1328 #define PVIO_fmt_name_ix sv_char_pp | offsetof(struct xpvio, xio_fmt_name)
1329 #define PVIO_fmt_gv_ix sv_SVp | offsetof(struct xpvio, xio_fmt_gv)
1330 #define PVIO_bottom_name_ix sv_char_pp | offsetof(struct xpvio, xio_bottom_name)
1331 #define PVIO_bottom_gv_ix sv_SVp | offsetof(struct xpvio, xio_bottom_gv)
1332 #define PVIO_type_ix sv_char_p | offsetof(struct xpvio, xio_type)
1333 #define PVIO_flags_ix sv_U8p | offsetof(struct xpvio, xio_flags)
1335 #define PVAV_max_ix sv_SSize_tp | offsetof(struct xpvav, xav_max)
1337 #define PVCV_stash_ix sv_SVp | offsetof(struct xpvcv, xcv_stash)
1338 #if PERL_VERSION > 17 || (PERL_VERSION == 17 && PERL_SUBVERSION >= 3)
1339 # define PVCV_gv_ix sv_SVp | offsetof(struct xpvcv, xcv_gv_u.xcv_gv)
1341 # define PVCV_gv_ix sv_SVp | offsetof(struct xpvcv, xcv_gv)
1343 #define PVCV_file_ix sv_char_pp | offsetof(struct xpvcv, xcv_file)
1344 #define PVCV_outside_ix sv_SVp | offsetof(struct xpvcv, xcv_outside)
1345 #define PVCV_outside_seq_ix sv_U32p | offsetof(struct xpvcv, xcv_outside_seq)
1346 #define PVCV_flags_ix sv_U32p | offsetof(struct xpvcv, xcv_flags)
1348 #define PVHV_max_ix sv_STRLENp | offsetof(struct xpvhv, xhv_max)
1350 #if PERL_VERSION > 12
1351 #define PVHV_keys_ix sv_STRLENp | offsetof(struct xpvhv, xhv_keys)
1353 #define PVHV_keys_ix sv_IVp | offsetof(struct xpvhv, xhv_keys)
1356 # The type checking code in B has always been identical for all SV types,
1357 # irrespective of whether the action is actually defined on that SV.
1358 # We should fix this
1363 B::IV::IVX = IV_ivx_ix
1364 B::IV::UVX = IV_uvx_ix
1365 B::NV::NVX = NV_nvx_ix
1366 B::NV::COP_SEQ_RANGE_LOW = NV_cop_seq_range_low_ix
1367 B::NV::COP_SEQ_RANGE_HIGH = NV_cop_seq_range_high_ix
1368 B::NV::PARENT_PAD_INDEX = NV_parent_pad_index_ix
1369 B::NV::PARENT_FAKELEX_FLAGS = NV_parent_fakelex_flags_ix
1370 B::PV::CUR = PV_cur_ix
1371 B::PV::LEN = PV_len_ix
1372 B::PVMG::SvSTASH = PVMG_stash_ix
1373 B::PVLV::TARGOFF = PVLV_targoff_ix
1374 B::PVLV::TARGLEN = PVLV_targlen_ix
1375 B::PVLV::TARG = PVLV_targ_ix
1376 B::PVLV::TYPE = PVLV_type_ix
1377 B::GV::STASH = PVGV_stash_ix
1378 B::GV::GvFLAGS = PVGV_flags_ix
1379 B::BM::USEFUL = PVBM_useful_ix
1380 B::IO::LINES = PVIO_lines_ix
1381 B::IO::PAGE = PVIO_page_ix
1382 B::IO::PAGE_LEN = PVIO_page_len_ix
1383 B::IO::LINES_LEFT = PVIO_lines_left_ix
1384 B::IO::TOP_NAME = PVIO_top_name_ix
1385 B::IO::TOP_GV = PVIO_top_gv_ix
1386 B::IO::FMT_NAME = PVIO_fmt_name_ix
1387 B::IO::FMT_GV = PVIO_fmt_gv_ix
1388 B::IO::BOTTOM_NAME = PVIO_bottom_name_ix
1389 B::IO::BOTTOM_GV = PVIO_bottom_gv_ix
1390 B::IO::IoTYPE = PVIO_type_ix
1391 B::IO::IoFLAGS = PVIO_flags_ix
1392 B::AV::MAX = PVAV_max_ix
1393 B::CV::STASH = PVCV_stash_ix
1394 B::CV::FILE = PVCV_file_ix
1395 B::CV::OUTSIDE = PVCV_outside_ix
1396 B::CV::OUTSIDE_SEQ = PVCV_outside_seq_ix
1397 B::CV::CvFLAGS = PVCV_flags_ix
1398 B::HV::MAX = PVHV_max_ix
1399 B::HV::KEYS = PVHV_keys_ix
1404 ptr = (ix & 0xFFFF) + (char *)SvANY(sv);
1405 switch ((U8)(ix >> 16)) {
1406 case (U8)(sv_SVp >> 16):
1407 ret = make_sv_object(aTHX_ *((SV **)ptr));
1409 case (U8)(sv_IVp >> 16):
1410 ret = sv_2mortal(newSViv(*((IV *)ptr)));
1412 case (U8)(sv_UVp >> 16):
1413 ret = sv_2mortal(newSVuv(*((UV *)ptr)));
1415 case (U8)(sv_STRLENp >> 16):
1416 ret = sv_2mortal(newSVuv(*((STRLEN *)ptr)));
1418 case (U8)(sv_U32p >> 16):
1419 ret = sv_2mortal(newSVuv(*((U32 *)ptr)));
1421 case (U8)(sv_U8p >> 16):
1422 ret = sv_2mortal(newSVuv(*((U8 *)ptr)));
1424 case (U8)(sv_char_pp >> 16):
1425 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
1427 case (U8)(sv_NVp >> 16):
1428 ret = sv_2mortal(newSVnv(*((NV *)ptr)));
1430 case (U8)(sv_char_p >> 16):
1431 ret = newSVpvn_flags((char *)ptr, 1, SVs_TEMP);
1433 case (U8)(sv_SSize_tp >> 16):
1434 ret = sv_2mortal(newSViv(*((SSize_t *)ptr)));
1436 case (U8)(sv_I32p >> 16):
1437 ret = sv_2mortal(newSVuv(*((I32 *)ptr)));
1439 case (U8)(sv_U16p >> 16):
1440 ret = sv_2mortal(newSVuv(*((U16 *)ptr)));
1443 croak("Illegal alias 0x%08x for B::*IVX", (unsigned)ix);
1455 ST(0) = boolSV((I32)SvIVX(sv) != SvIVX(sv));
1456 } else if (sizeof(IV) == 8) {
1458 const IV iv = SvIVX(sv);
1460 * The following way of spelling 32 is to stop compilers on
1461 * 32-bit architectures from moaning about the shift count
1462 * being >= the width of the type. Such architectures don't
1463 * reach this code anyway (unless sizeof(IV) > 8 but then
1464 * everything else breaks too so I'm not fussed at the moment).
1467 wp[0] = htonl(((UV)iv) >> (sizeof(UV)*4));
1469 wp[0] = htonl(((U32)iv) >> (sizeof(UV)*4));
1471 wp[1] = htonl(iv & 0xffffffff);
1472 ST(0) = newSVpvn_flags((char *)wp, 8, SVs_TEMP);
1474 U32 w = htonl((U32)SvIVX(sv));
1475 ST(0) = newSVpvn_flags((char *)&w, 4, SVs_TEMP);
1478 MODULE = B PACKAGE = B::NV PREFIX = Sv
1484 #if PERL_VERSION < 11
1486 MODULE = B PACKAGE = B::RV PREFIX = Sv
1492 PUSHs(make_sv_object(aTHX_ SvRV(sv)));
1496 MODULE = B PACKAGE = B::REGEXP
1505 PUSHs(newSVpvn_flags(RX_PRECOMP(sv), RX_PRELEN(sv), SVs_TEMP));
1508 /* FIXME - can we code this method more efficiently? */
1514 MODULE = B PACKAGE = B::PV
1521 croak( "argument is not SvROK" );
1522 PUSHs(make_sv_object(aTHX_ SvRV(sv)));
1537 #ifndef PERL_FBM_TABLE_OFFSET
1538 const MAGIC *const mg = mg_find(sv, PERL_MAGIC_bm);
1541 croak("argument to B::BM::TABLE is not a PVBM");
1546 /* Boyer-Moore table is just after string and its safety-margin \0 */
1547 p += len + PERL_FBM_TABLE_OFFSET;
1550 } else if (ix == 2) {
1551 /* This used to read 257. I think that that was buggy - should have
1552 been 258. (The "\0", the flags byte, and 256 for the table.)
1553 The only user of this method is B::Bytecode in B::PV::bsave.
1554 I'm guessing that nothing tested the runtime correctness of
1555 output of bytecompiled string constant arguments to index (etc).
1557 Note the start pointer is and has always been SvPVX(sv), not
1558 SvPVX(sv) + SvCUR(sv) PVBM was added in 651aa52ea1faa806, and
1559 first used by the compiler in 651aa52ea1faa806. It's used to
1560 get a "complete" dump of the buffer at SvPVX(), not just the
1561 PVBM table. This permits the generated bytecode to "load"
1564 5.15 and later store the BM table via MAGIC, so the compiler
1565 should handle this just fine without changes if PVBM now
1566 always returns the SvPVX() buffer. */
1569 ? RX_WRAPPED_const((REGEXP*)sv)
1572 p = SvPVX_const(sv);
1574 #ifdef PERL_FBM_TABLE_OFFSET
1575 len = SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0);
1581 p = isREGEXP(sv) ? RX_WRAPPED((REGEXP*)sv) : SvPVX(sv);
1586 } else if (SvPOK(sv)) {
1588 p = SvPVX_const(sv);
1592 else if (isREGEXP(sv)) {
1594 p = RX_WRAPPED_const((REGEXP*)sv);
1599 /* XXX for backward compatibility, but should fail */
1600 /* croak( "argument is not SvPOK" ); */
1603 ST(0) = newSVpvn_flags(p, len, SVs_TEMP | utf8);
1605 MODULE = B PACKAGE = B::PVMG
1610 MAGIC * mg = NO_INIT
1612 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
1613 XPUSHs(make_mg_object(aTHX_ mg));
1615 MODULE = B PACKAGE = B::MAGIC
1632 XPUSHs(mg->mg_moremagic ? make_mg_object(aTHX_ mg->mg_moremagic)
1636 mPUSHu(mg->mg_private);
1639 PUSHs(newSVpvn_flags(&(mg->mg_type), 1, SVs_TEMP));
1642 mPUSHu(mg->mg_flags);
1648 PUSHs(make_sv_object(aTHX_ mg->mg_obj));
1652 if (mg->mg_len >= 0) {
1653 PUSHs(newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP));
1654 } else if (mg->mg_len == HEf_SVKEY) {
1655 PUSHs(make_sv_object(aTHX_ (SV*)mg->mg_ptr));
1657 PUSHs(sv_newmortal());
1659 PUSHs(sv_newmortal());
1662 if(mg->mg_type == PERL_MAGIC_qr) {
1663 mPUSHi(PTR2IV(mg->mg_obj));
1665 croak("REGEX is only meaningful on r-magic");
1669 if (mg->mg_type == PERL_MAGIC_qr) {
1670 REGEXP *rx = (REGEXP *)mg->mg_obj;
1671 PUSHs(newSVpvn_flags(rx ? RX_PRECOMP(rx) : NULL,
1672 rx ? RX_PRELEN(rx) : 0, SVs_TEMP));
1674 croak( "precomp is only meaningful on r-magic" );
1679 MODULE = B PACKAGE = B::BM PREFIX = Bm
1689 MODULE = B PACKAGE = B::GV PREFIX = Gv
1698 ST(0) = sv_2mortal(newSVhek(!ix ? GvNAME_HEK(gv)
1699 : (ix == 1 ? GvFILE_HEK(gv)
1700 : HvNAME_HEK((HV *)gv))));
1709 RETVAL = isGV_with_GP(gv) ? TRUE : FALSE;
1711 RETVAL = GvGP(gv) == Null(GP*);
1720 #define GP_sv_ix (SVp << 16) | offsetof(struct gp, gp_sv)
1721 #define GP_io_ix (SVp << 16) | offsetof(struct gp, gp_io)
1722 #define GP_cv_ix (SVp << 16) | offsetof(struct gp, gp_cv)
1723 #define GP_cvgen_ix (U32p << 16) | offsetof(struct gp, gp_cvgen)
1724 #define GP_refcnt_ix (U32p << 16) | offsetof(struct gp, gp_refcnt)
1725 #define GP_hv_ix (SVp << 16) | offsetof(struct gp, gp_hv)
1726 #define GP_av_ix (SVp << 16) | offsetof(struct gp, gp_av)
1727 #define GP_form_ix (SVp << 16) | offsetof(struct gp, gp_form)
1728 #define GP_egv_ix (SVp << 16) | offsetof(struct gp, gp_egv)
1729 #define GP_line_ix (line_tp << 16) | offsetof(struct gp, gp_line)
1739 GvREFCNT = GP_refcnt_ix
1752 const GV *const gv = CvGV(cv);
1753 Perl_croak(aTHX_ "NULL gp in B::GV::%s", gv ? GvNAME(gv) : "???");
1755 ptr = (ix & 0xFFFF) + (char *)gp;
1756 switch ((U8)(ix >> 16)) {
1758 ret = make_sv_object(aTHX_ *((SV **)ptr));
1761 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
1764 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
1767 croak("Illegal alias 0x%08x for B::*SV", (unsigned)ix);
1776 PUSHs(make_sv_object(aTHX_ (SV *)GvFILEGV(gv)));
1778 MODULE = B PACKAGE = B::IO PREFIX = Io
1788 if( strEQ( name, "stdin" ) ) {
1789 handle = PerlIO_stdin();
1791 else if( strEQ( name, "stdout" ) ) {
1792 handle = PerlIO_stdout();
1794 else if( strEQ( name, "stderr" ) ) {
1795 handle = PerlIO_stderr();
1798 croak( "Invalid value '%s'", name );
1800 RETVAL = handle == IoIFP(io);
1804 MODULE = B PACKAGE = B::AV PREFIX = Av
1814 if (AvFILL(av) >= 0) {
1815 SV **svp = AvARRAY(av);
1817 for (i = 0; i <= AvFILL(av); i++)
1818 XPUSHs(make_sv_object(aTHX_ svp[i]));
1826 if (idx >= 0 && AvFILL(av) >= 0 && idx <= AvFILL(av))
1827 XPUSHs(make_sv_object(aTHX_ (AvARRAY(av)[idx])));
1829 XPUSHs(make_sv_object(aTHX_ NULL));
1832 MODULE = B PACKAGE = B::FM PREFIX = Fm
1835 #define FmLINES(sv) 0
1841 MODULE = B PACKAGE = B::CV PREFIX = Cv
1853 PUSHs(make_op_object(aTHX_ CvISXSUB(cv) ? NULL
1854 : ix ? CvROOT(cv) : CvSTART(cv)));
1872 PUSHs(make_sv_object(aTHX_ (SV *)CvPADLIST(cv)));
1883 ST(0) = ix && CvCONST(cv)
1884 ? make_sv_object(aTHX_ (SV *)CvXSUBANY(cv).any_ptr)
1885 : sv_2mortal(newSViv(CvISXSUB(cv)
1886 ? (ix ? CvXSUBANY(cv).any_iv
1887 : PTR2IV(CvXSUB(cv)))
1894 PUSHs(make_sv_object(aTHX_ (SV *)cv_const_sv(cv)));
1900 ST(0) = make_sv_object(aTHX_ (SV*)CvGV(cv));
1902 #if PERL_VERSION > 17
1908 RETVAL = CvNAMED(cv) ? newSVhek(CvNAME_HEK(cv)) : &PL_sv_undef;
1914 MODULE = B PACKAGE = B::HV PREFIX = Hv
1928 if (HvUSEDKEYS(hv) > 0) {
1932 (void)hv_iterinit(hv);
1933 EXTEND(sp, HvUSEDKEYS(hv) * 2);
1934 while ((sv = hv_iternextsv(hv, &key, &len))) {
1936 PUSHs(make_sv_object(aTHX_ sv));
1940 MODULE = B PACKAGE = B::HE PREFIX = He
1948 PUSHs(make_sv_object(aTHX_ ix ? HeSVKEY_force(he) : HeVAL(he)));
1954 MODULE = B PACKAGE = B::RHE
1960 RETVAL = newRV( (SV*)cophh_2hv(h, 0) );
1967 MODULE = B PACKAGE = B::PADLIST PREFIX = Padlist
1974 PadlistARRAY(padlist)
1977 if (PadlistMAX(padlist) >= 0) {
1978 PAD **padp = PadlistARRAY(padlist);
1980 for (i = 0; i <= PadlistMAX(padlist); i++)
1981 XPUSHs(make_sv_object(aTHX_ (SV *)padp[i]));
1985 PadlistARRAYelt(padlist, idx)
1989 if (PadlistMAX(padlist) >= 0
1990 && idx <= PadlistMAX(padlist))
1991 XPUSHs(make_sv_object(aTHX_
1992 (SV *)PadlistARRAY(padlist)[idx]));
1994 XPUSHs(make_sv_object(aTHX_ NULL));
1997 PadlistREFCNT(padlist)
2000 RETVAL = PadlistREFCNT(padlist);