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[] = {
27 #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);
641 #define line_tp 0x20000
643 #define PADOFFSETp 0x40000
646 #define char_pp 0x70000
648 /* table that drives most of the B::*OP methods */
654 size_t offset; /* if -1, access is handled on a case-by-case basis */
656 STR_WITH_LEN("next"), OPp, offsetof(struct op, op_next), /* 0*/
657 STR_WITH_LEN("sibling"), OPp, offsetof(struct op, op_sibling), /* 1*/
658 STR_WITH_LEN("targ"), PADOFFSETp, offsetof(struct op, op_targ), /* 2*/
659 STR_WITH_LEN("flags"), U8p, offsetof(struct op, op_flags), /* 3*/
660 STR_WITH_LEN("private"), U8p, offsetof(struct op, op_private), /* 4*/
661 STR_WITH_LEN("first"), OPp, offsetof(struct unop, op_first), /* 5*/
662 STR_WITH_LEN("last"), OPp, offsetof(struct binop, op_last), /* 6*/
663 STR_WITH_LEN("other"), OPp, offsetof(struct logop, op_other), /* 7*/
664 STR_WITH_LEN("pmreplstart"), OPp,
665 offsetof(struct pmop, op_pmstashstartu.op_pmreplstart), /* 8*/
666 STR_WITH_LEN("redoop"), OPp, offsetof(struct loop, op_redoop), /* 9*/
667 STR_WITH_LEN("nextop"), OPp, offsetof(struct loop, op_nextop), /*10*/
668 STR_WITH_LEN("lastop"), OPp, offsetof(struct loop, op_lastop), /*11*/
669 STR_WITH_LEN("pmflags"), U32p, offsetof(struct pmop, op_pmflags), /*12*/
670 #if PERL_VERSION >= 17
671 STR_WITH_LEN("code_list"),OPp, offsetof(struct pmop, op_code_list),/*13*/
673 STR_WITH_LEN("code_list"),0, -1,
675 STR_WITH_LEN("sv"), SVp, offsetof(struct svop, op_sv), /*14*/
676 STR_WITH_LEN("gv"), SVp, offsetof(struct svop, op_sv), /*15*/
677 STR_WITH_LEN("padix"), PADOFFSETp,offsetof(struct padop, op_padix),/*16*/
678 STR_WITH_LEN("cop_seq"), U32p, offsetof(struct cop, cop_seq), /*17*/
679 STR_WITH_LEN("line"), line_tp, offsetof(struct cop, cop_line), /*18*/
680 STR_WITH_LEN("hints"), U32p, offsetof(struct cop, cop_hints), /*19*/
682 STR_WITH_LEN("pmoffset"),IVp, offsetof(struct pmop, op_pmoffset),/*20*/
683 STR_WITH_LEN("filegv"), 0, -1, /*21*/
684 STR_WITH_LEN("file"), char_pp, offsetof(struct cop, cop_file), /*22*/
685 STR_WITH_LEN("stash"), 0, -1, /*23*/
686 # if PERL_VERSION < 17
687 STR_WITH_LEN("stashpv"), char_pp, offsetof(struct cop, cop_stashpv), /*24*/
688 STR_WITH_LEN("stashoff"),0, -1, /*25*/
690 STR_WITH_LEN("stashpv"), 0, -1, /*24*/
691 STR_WITH_LEN("stashoff"),PADOFFSETp,offsetof(struct cop, cop_stashoff),/*25*/
694 STR_WITH_LEN("pmoffset"),0, -1, /*20*/
695 STR_WITH_LEN("filegv"), SVp, offsetof(struct cop, cop_filegv), /*21*/
696 STR_WITH_LEN("file"), 0, -1, /*22*/
697 STR_WITH_LEN("stash"), SVp, offsetof(struct cop, cop_stash), /*23*/
698 STR_WITH_LEN("stashpv"), 0, -1, /*24*/
699 STR_WITH_LEN("stashoff"),0, -1, /*25*/
701 STR_WITH_LEN("size"), 0, -1, /*26*/
702 STR_WITH_LEN("name"), 0, -1, /*27*/
703 STR_WITH_LEN("desc"), 0, -1, /*28*/
704 STR_WITH_LEN("ppaddr"), 0, -1, /*29*/
705 STR_WITH_LEN("type"), 0, -1, /*30*/
706 STR_WITH_LEN("opt"), 0, -1, /*31*/
707 STR_WITH_LEN("spare"), 0, -1, /*32*/
708 STR_WITH_LEN("children"),0, -1, /*33*/
709 STR_WITH_LEN("pmreplroot"), 0, -1, /*34*/
710 STR_WITH_LEN("pmstashpv"), 0, -1, /*35*/
711 STR_WITH_LEN("pmstash"), 0, -1, /*36*/
712 STR_WITH_LEN("precomp"), 0, -1, /*37*/
713 STR_WITH_LEN("reflags"), 0, -1, /*38*/
714 STR_WITH_LEN("sv"), 0, -1, /*39*/
715 STR_WITH_LEN("gv"), 0, -1, /*40*/
716 STR_WITH_LEN("pv"), 0, -1, /*41*/
717 STR_WITH_LEN("label"), 0, -1, /*42*/
718 STR_WITH_LEN("arybase"), 0, -1, /*43*/
719 STR_WITH_LEN("warnings"),0, -1, /*44*/
720 STR_WITH_LEN("io"), 0, -1, /*45*/
721 STR_WITH_LEN("hints_hash"),0, -1, /*46*/
724 #include "const-c.inc"
726 MODULE = B PACKAGE = B
728 INCLUDE: const-xs.inc
735 const char *file = __FILE__;
737 specialsv_list[0] = Nullsv;
738 specialsv_list[1] = &PL_sv_undef;
739 specialsv_list[2] = &PL_sv_yes;
740 specialsv_list[3] = &PL_sv_no;
741 specialsv_list[4] = (SV *) pWARN_ALL;
742 specialsv_list[5] = (SV *) pWARN_NONE;
743 specialsv_list[6] = (SV *) pWARN_STD;
745 cv = newXS("B::init_av", intrpvar_sv_common, file);
746 ASSIGN_COMMON_ALIAS(I, initav);
747 cv = newXS("B::check_av", intrpvar_sv_common, file);
748 ASSIGN_COMMON_ALIAS(I, checkav_save);
749 cv = newXS("B::unitcheck_av", intrpvar_sv_common, file);
750 ASSIGN_COMMON_ALIAS(I, unitcheckav_save);
751 cv = newXS("B::begin_av", intrpvar_sv_common, file);
752 ASSIGN_COMMON_ALIAS(I, beginav_save);
753 cv = newXS("B::end_av", intrpvar_sv_common, file);
754 ASSIGN_COMMON_ALIAS(I, endav);
755 cv = newXS("B::main_cv", intrpvar_sv_common, file);
756 ASSIGN_COMMON_ALIAS(I, main_cv);
757 cv = newXS("B::inc_gv", intrpvar_sv_common, file);
758 ASSIGN_COMMON_ALIAS(I, incgv);
759 cv = newXS("B::defstash", intrpvar_sv_common, file);
760 ASSIGN_COMMON_ALIAS(I, defstash);
761 cv = newXS("B::curstash", intrpvar_sv_common, file);
762 ASSIGN_COMMON_ALIAS(I, curstash);
764 cv = newXS("B::formfeed", intrpvar_sv_common, file);
765 ASSIGN_COMMON_ALIAS(I, formfeed);
768 cv = newXS("B::regex_padav", intrpvar_sv_common, file);
769 ASSIGN_COMMON_ALIAS(I, regex_padav);
771 cv = newXS("B::warnhook", intrpvar_sv_common, file);
772 ASSIGN_COMMON_ALIAS(I, warnhook);
773 cv = newXS("B::diehook", intrpvar_sv_common, file);
774 ASSIGN_COMMON_ALIAS(I, diehook);
782 PUSHs(make_sv_object(aTHX_ GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV))));
789 RETVAL = PL_amagic_generation;
796 PADLIST *padlist = CvPADLIST(PL_main_cv ? PL_main_cv : PL_compcv);
800 SV * const rv = sv_newmortal();
801 sv_setiv(newSVrv(rv, padlist ? "B::PADLIST" : "B::NULL"),
806 PUSHs(make_sv_object(aTHX_ (SV *)padlist));
815 PUSHs(make_sv_object(aTHX_ ix > 1 ? &PL_sv_yes
816 : ix < 1 ? &PL_sv_undef
824 PUSHs(make_op_object(aTHX_ ix ? PL_main_start : PL_main_root));
831 RETVAL = ix ? PL_dowarn : PL_sub_generation;
836 walkoptree(op, method)
840 (void) walkoptree(aTHX_ op, method, &PL_sv_undef);
843 walkoptree_debug(...)
846 RETVAL = walkoptree_debug;
847 if (items > 0 && SvTRUE(ST(1)))
848 walkoptree_debug = 1;
852 #define address(sv) PTR2IV(sv)
863 croak("argument is not a reference");
864 PUSHs(make_sv_object(aTHX_ SvRV(sv)));
873 ST(0) = sv_newmortal();
874 if (strncmp(name,"pp_",3) == 0)
876 for (i = 0; i < PL_maxo; i++)
878 if (strcmp(name, PL_op_name[i]) == 0)
884 sv_setiv(ST(0),result);
891 ST(0) = sv_newmortal();
892 if (opnum >= 0 && opnum < PL_maxo)
893 Perl_sv_setpvf(aTHX_ ST(0), "pp_%s", PL_op_name[opnum]);
901 const char *s = SvPVbyte(sv, len);
902 PERL_HASH(hash, s, len);
903 ST(0) = sv_2mortal(Perl_newSVpvf(aTHX_ "0x%"UVxf, (UV)hash));
905 #define cast_I32(foo) (I32)foo
927 PUSHs(ix == 2 ? cchar(aTHX_ sv) : cstring(aTHX_ sv, (bool)ix));
936 MODULE = B PACKAGE = B::OP
939 # The type checking code in B has always been identical for all OP types,
940 # irrespective of whether the action is actually defined on that OP.
954 B::PMOP::pmreplstart = 8
958 B::PMOP::pmflags = 12
959 B::PMOP::code_list = 13
966 B::PMOP::pmoffset = 20
971 B::COP::stashoff = 25
979 B::LISTOP::children = 33
980 B::PMOP::pmreplroot = 34
981 B::PMOP::pmstashpv = 35
982 B::PMOP::pmstash = 36
983 B::PMOP::precomp = 37
984 B::PMOP::reflags = 38
990 B::COP::warnings = 44
992 B::COP::hints_hash = 46
1000 if (ix < 0 || ix > 46)
1001 croak("Illegal alias %d for B::*OP::next", (int)ix);
1002 ret = get_overlay_object(aTHX_ o,
1003 op_methods[ix].name, op_methods[ix].namelen);
1009 /* handle non-direct field access */
1011 offset = op_methods[ix].offset;
1015 case 21: /* filegv */
1016 ret = make_sv_object(aTHX_ (SV *)CopFILEGV((COP*)o));
1019 #ifndef USE_ITHREADS
1021 ret = sv_2mortal(newSVpv(CopFILE((COP*)o), 0));
1025 case 23: /* stash */
1026 ret = make_sv_object(aTHX_ (SV *)CopSTASH((COP*)o));
1029 #if PERL_VERSION >= 17 || !defined USE_ITHREADS
1030 case 24: /* stashpv */
1031 # if PERL_VERSION >= 17
1032 ret = sv_2mortal(CopSTASH((COP*)o)
1033 && SvTYPE(CopSTASH((COP*)o)) == SVt_PVHV
1034 ? newSVhek(HvNAME_HEK(CopSTASH((COP*)o)))
1037 ret = sv_2mortal(newSVpv(CopSTASHPV((COP*)o), 0));
1042 ret = sv_2mortal(newSVuv((UV)(opsizes[cc_opclass(aTHX_ o)])));
1046 ret = sv_2mortal(newSVpv(
1047 (char *)(ix == 28 ? OP_DESC(o) : OP_NAME(o)), 0));
1049 case 29: /* ppaddr */
1052 ret = sv_2mortal(Perl_newSVpvf(aTHX_ "PL_ppaddr[OP_%s]",
1053 PL_op_name[o->op_type]));
1054 for (i=13; (STRLEN)i < SvCUR(ret); ++i)
1055 SvPVX(ret)[i] = toUPPER(SvPVX(ret)[i]);
1060 case 32: /* spare */
1061 /* These 3 are all bitfields, so we can't take their addresses */
1062 ret = sv_2mortal(newSVuv((UV)(
1063 ix == 30 ? o->op_type
1064 : ix == 31 ? o->op_opt
1067 case 33: /* children */
1071 for (kid = ((LISTOP*)o)->op_first; kid; kid = kid->op_sibling)
1073 ret = sv_2mortal(newSVuv(i));
1076 case 34: /* pmreplroot */
1077 if (cPMOPo->op_type == OP_PUSHRE) {
1079 ret = sv_newmortal();
1080 sv_setiv(ret, cPMOPo->op_pmreplrootu.op_pmtargetoff);
1082 GV *const target = cPMOPo->op_pmreplrootu.op_pmtargetgv;
1083 ret = sv_newmortal();
1084 sv_setiv(newSVrv(ret, target ?
1085 svclassnames[SvTYPE((SV*)target)] : "B::SV"),
1090 OP *const root = cPMOPo->op_pmreplrootu.op_pmreplroot;
1091 ret = make_op_object(aTHX_ root);
1095 case 35: /* pmstashpv */
1096 ret = sv_2mortal(newSVpv(PmopSTASHPV(cPMOPo),0));
1099 case 36: /* pmstash */
1100 ret = make_sv_object(aTHX_ (SV *) PmopSTASH(cPMOPo));
1103 case 37: /* precomp */
1104 case 38: /* reflags */
1106 REGEXP *rx = PM_GETRE(cPMOPo);
1107 ret = sv_newmortal();
1110 sv_setuv(ret, RX_EXTFLAGS(rx));
1113 sv_setpvn(ret, RX_PRECOMP(rx), RX_PRELEN(rx));
1120 /* It happens that the output typemaps for B::SV and B::GV
1121 * are identical. The "smarts" are in make_sv_object(),
1122 * which determines which class to use based on SvTYPE(),
1123 * rather than anything baked in at compile time. */
1124 if (cPADOPo->op_padix) {
1125 ret = PAD_SVl(cPADOPo->op_padix);
1126 if (ix == 40 && SvTYPE(ret) != SVt_PVGV)
1131 ret = make_sv_object(aTHX_ ret);
1134 /* OP_TRANS uses op_pv to point to a table of 256 or >=258
1135 * shorts whereas other PVOPs point to a null terminated
1137 if ( (cPVOPo->op_type == OP_TRANS
1138 || cPVOPo->op_type == OP_TRANSR) &&
1139 (cPVOPo->op_private & OPpTRANS_COMPLEMENT) &&
1140 !(cPVOPo->op_private & OPpTRANS_DELETE))
1142 const short* const tbl = (short*)cPVOPo->op_pv;
1143 const short entries = 257 + tbl[256];
1144 ret = newSVpvn_flags(cPVOPo->op_pv, entries * sizeof(short), SVs_TEMP);
1146 else if (cPVOPo->op_type == OP_TRANS || cPVOPo->op_type == OP_TRANSR) {
1147 ret = newSVpvn_flags(cPVOPo->op_pv, 256 * sizeof(short), SVs_TEMP);
1150 ret = newSVpvn_flags(cPVOPo->op_pv, strlen(cPVOPo->op_pv), SVs_TEMP);
1152 case 42: /* label */
1153 ret = sv_2mortal(newSVpv(CopLABEL(cCOPo),0));
1155 case 43: /* arybase */
1156 ret = sv_2mortal(newSVuv(0));
1158 case 44: /* warnings */
1159 ret = make_warnings_object(aTHX_ cCOPo);
1162 ret = make_cop_io_object(aTHX_ cCOPo);
1164 case 46: /* hints_hash */
1165 ret = sv_newmortal();
1166 sv_setiv(newSVrv(ret, "B::RHE"),
1167 PTR2IV(CopHINTHASH_get(cCOPo)));
1170 croak("method %s not implemented", op_methods[ix].name);
1176 /* do a direct structure offset lookup */
1178 ptr = (char *)o + offset;
1179 type = op_methods[ix].type;
1180 switch ((U8)(type >> 16)) {
1181 case (U8)(OPp >> 16):
1182 ret = make_op_object(aTHX_ *((OP **)ptr));
1184 case (U8)(PADOFFSETp >> 16):
1185 ret = sv_2mortal(newSVuv(*((PADOFFSET*)ptr)));
1187 case (U8)(U8p >> 16):
1188 ret = sv_2mortal(newSVuv(*((U8*)ptr)));
1190 case (U8)(U32p >> 16):
1191 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
1193 case (U8)(SVp >> 16):
1194 ret = make_sv_object(aTHX_ *((SV **)ptr));
1196 case (U8)(line_tp >> 16):
1197 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
1199 case (U8)(IVp >> 16):
1200 ret = sv_2mortal(newSViv(*((IV*)ptr)));
1202 case (U8)(char_pp >> 16):
1203 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
1206 croak("Illegal type 0x%08x for B::*OP::%s",
1207 (unsigned)type, op_methods[ix].name);
1218 SP = oplist(aTHX_ o, SP);
1221 MODULE = B PACKAGE = B::SV
1223 #define MAGICAL_FLAG_BITS (SVs_GMG|SVs_SMG|SVs_RMG)
1233 MAGICAL = MAGICAL_FLAG_BITS
1235 RETVAL = ix ? (SvFLAGS(sv) & (U32)ix) : SvREFCNT(sv);
1243 ST(0) = sv_2mortal(newRV(sv));
1246 MODULE = B PACKAGE = B::IV PREFIX = Sv
1252 MODULE = B PACKAGE = B::IV
1254 #define sv_SVp 0x00000
1255 #define sv_IVp 0x10000
1256 #define sv_UVp 0x20000
1257 #define sv_STRLENp 0x30000
1258 #define sv_U32p 0x40000
1259 #define sv_U8p 0x50000
1260 #define sv_char_pp 0x60000
1261 #define sv_NVp 0x70000
1262 #define sv_char_p 0x80000
1263 #define sv_SSize_tp 0x90000
1264 #define sv_I32p 0xA0000
1265 #define sv_U16p 0xB0000
1267 #define IV_ivx_ix sv_IVp | offsetof(struct xpviv, xiv_iv)
1268 #define IV_uvx_ix sv_UVp | offsetof(struct xpvuv, xuv_uv)
1269 #define NV_nvx_ix sv_NVp | offsetof(struct xpvnv, xnv_u.xnv_nv)
1271 #define NV_cop_seq_range_low_ix \
1272 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1273 #define NV_cop_seq_range_high_ix \
1274 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1275 #define NV_parent_pad_index_ix \
1276 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xlow)
1277 #define NV_parent_fakelex_flags_ix \
1278 sv_U32p | offsetof(struct xpvnv, xnv_u.xpad_cop_seq.xhigh)
1280 #define PV_cur_ix sv_STRLENp | offsetof(struct xpv, xpv_cur)
1281 #define PV_len_ix sv_STRLENp | offsetof(struct xpv, xpv_len)
1283 #define PVMG_stash_ix sv_SVp | offsetof(struct xpvmg, xmg_stash)
1285 #if PERL_VERSION > 14
1286 # define PVBM_useful_ix sv_I32p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_useful)
1287 # define PVBM_previous_ix sv_UVp | offsetof(struct xpvuv, xuv_uv)
1289 #define PVBM_useful_ix sv_I32p | offsetof(struct xpvgv, xiv_u.xivu_i32)
1290 #define PVBM_previous_ix sv_U32p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_previous)
1293 #define PVBM_rare_ix sv_U8p | offsetof(struct xpvgv, xnv_u.xbm_s.xbm_rare)
1295 #define PVLV_targoff_ix sv_U32p | offsetof(struct xpvlv, xlv_targoff)
1296 #define PVLV_targlen_ix sv_U32p | offsetof(struct xpvlv, xlv_targlen)
1297 #define PVLV_targ_ix sv_SVp | offsetof(struct xpvlv, xlv_targ)
1298 #define PVLV_type_ix sv_char_p | offsetof(struct xpvlv, xlv_type)
1300 #define PVGV_stash_ix sv_SVp | offsetof(struct xpvgv, xnv_u.xgv_stash)
1301 #define PVGV_flags_ix sv_STRLENp | offsetof(struct xpvgv, xpv_cur)
1302 #define PVIO_lines_ix sv_IVp | offsetof(struct xpvio, xiv_iv)
1304 #define PVIO_page_ix sv_IVp | offsetof(struct xpvio, xio_page)
1305 #define PVIO_page_len_ix sv_IVp | offsetof(struct xpvio, xio_page_len)
1306 #define PVIO_lines_left_ix sv_IVp | offsetof(struct xpvio, xio_lines_left)
1307 #define PVIO_top_name_ix sv_char_pp | offsetof(struct xpvio, xio_top_name)
1308 #define PVIO_top_gv_ix sv_SVp | offsetof(struct xpvio, xio_top_gv)
1309 #define PVIO_fmt_name_ix sv_char_pp | offsetof(struct xpvio, xio_fmt_name)
1310 #define PVIO_fmt_gv_ix sv_SVp | offsetof(struct xpvio, xio_fmt_gv)
1311 #define PVIO_bottom_name_ix sv_char_pp | offsetof(struct xpvio, xio_bottom_name)
1312 #define PVIO_bottom_gv_ix sv_SVp | offsetof(struct xpvio, xio_bottom_gv)
1313 #define PVIO_type_ix sv_char_p | offsetof(struct xpvio, xio_type)
1314 #define PVIO_flags_ix sv_U8p | offsetof(struct xpvio, xio_flags)
1316 #define PVAV_max_ix sv_SSize_tp | offsetof(struct xpvav, xav_max)
1318 #define PVCV_stash_ix sv_SVp | offsetof(struct xpvcv, xcv_stash)
1319 #if PERL_VERSION > 17 || (PERL_VERSION == 17 && PERL_SUBVERSION >= 3)
1320 # define PVCV_gv_ix sv_SVp | offsetof(struct xpvcv, xcv_gv_u.xcv_gv)
1322 # define PVCV_gv_ix sv_SVp | offsetof(struct xpvcv, xcv_gv)
1324 #define PVCV_file_ix sv_char_pp | offsetof(struct xpvcv, xcv_file)
1325 #define PVCV_outside_ix sv_SVp | offsetof(struct xpvcv, xcv_outside)
1326 #define PVCV_outside_seq_ix sv_U32p | offsetof(struct xpvcv, xcv_outside_seq)
1327 #define PVCV_flags_ix sv_U16p | offsetof(struct xpvcv, xcv_flags)
1329 #define PVHV_max_ix sv_STRLENp | offsetof(struct xpvhv, xhv_max)
1331 #if PERL_VERSION > 12
1332 #define PVHV_keys_ix sv_STRLENp | offsetof(struct xpvhv, xhv_keys)
1334 #define PVHV_keys_ix sv_IVp | offsetof(struct xpvhv, xhv_keys)
1337 # The type checking code in B has always been identical for all SV types,
1338 # irrespective of whether the action is actually defined on that SV.
1339 # We should fix this
1344 B::IV::IVX = IV_ivx_ix
1345 B::IV::UVX = IV_uvx_ix
1346 B::NV::NVX = NV_nvx_ix
1347 B::NV::COP_SEQ_RANGE_LOW = NV_cop_seq_range_low_ix
1348 B::NV::COP_SEQ_RANGE_HIGH = NV_cop_seq_range_high_ix
1349 B::NV::PARENT_PAD_INDEX = NV_parent_pad_index_ix
1350 B::NV::PARENT_FAKELEX_FLAGS = NV_parent_fakelex_flags_ix
1351 B::PV::CUR = PV_cur_ix
1352 B::PV::LEN = PV_len_ix
1353 B::PVMG::SvSTASH = PVMG_stash_ix
1354 B::PVLV::TARGOFF = PVLV_targoff_ix
1355 B::PVLV::TARGLEN = PVLV_targlen_ix
1356 B::PVLV::TARG = PVLV_targ_ix
1357 B::PVLV::TYPE = PVLV_type_ix
1358 B::GV::STASH = PVGV_stash_ix
1359 B::GV::GvFLAGS = PVGV_flags_ix
1360 B::BM::USEFUL = PVBM_useful_ix
1361 B::BM::PREVIOUS = PVBM_previous_ix
1362 B::BM::RARE = PVBM_rare_ix
1363 B::IO::LINES = PVIO_lines_ix
1364 B::IO::PAGE = PVIO_page_ix
1365 B::IO::PAGE_LEN = PVIO_page_len_ix
1366 B::IO::LINES_LEFT = PVIO_lines_left_ix
1367 B::IO::TOP_NAME = PVIO_top_name_ix
1368 B::IO::TOP_GV = PVIO_top_gv_ix
1369 B::IO::FMT_NAME = PVIO_fmt_name_ix
1370 B::IO::FMT_GV = PVIO_fmt_gv_ix
1371 B::IO::BOTTOM_NAME = PVIO_bottom_name_ix
1372 B::IO::BOTTOM_GV = PVIO_bottom_gv_ix
1373 B::IO::IoTYPE = PVIO_type_ix
1374 B::IO::IoFLAGS = PVIO_flags_ix
1375 B::AV::MAX = PVAV_max_ix
1376 B::CV::STASH = PVCV_stash_ix
1377 B::CV::GV = PVCV_gv_ix
1378 B::CV::FILE = PVCV_file_ix
1379 B::CV::OUTSIDE = PVCV_outside_ix
1380 B::CV::OUTSIDE_SEQ = PVCV_outside_seq_ix
1381 B::CV::CvFLAGS = PVCV_flags_ix
1382 B::HV::MAX = PVHV_max_ix
1383 B::HV::KEYS = PVHV_keys_ix
1388 ptr = (ix & 0xFFFF) + (char *)SvANY(sv);
1389 switch ((U8)(ix >> 16)) {
1390 case (U8)(sv_SVp >> 16):
1391 ret = make_sv_object(aTHX_ *((SV **)ptr));
1393 case (U8)(sv_IVp >> 16):
1394 ret = sv_2mortal(newSViv(*((IV *)ptr)));
1396 case (U8)(sv_UVp >> 16):
1397 ret = sv_2mortal(newSVuv(*((UV *)ptr)));
1399 case (U8)(sv_STRLENp >> 16):
1400 ret = sv_2mortal(newSVuv(*((STRLEN *)ptr)));
1402 case (U8)(sv_U32p >> 16):
1403 ret = sv_2mortal(newSVuv(*((U32 *)ptr)));
1405 case (U8)(sv_U8p >> 16):
1406 ret = sv_2mortal(newSVuv(*((U8 *)ptr)));
1408 case (U8)(sv_char_pp >> 16):
1409 ret = sv_2mortal(newSVpv(*((char **)ptr), 0));
1411 case (U8)(sv_NVp >> 16):
1412 ret = sv_2mortal(newSVnv(*((NV *)ptr)));
1414 case (U8)(sv_char_p >> 16):
1415 ret = newSVpvn_flags((char *)ptr, 1, SVs_TEMP);
1417 case (U8)(sv_SSize_tp >> 16):
1418 ret = sv_2mortal(newSViv(*((SSize_t *)ptr)));
1420 case (U8)(sv_I32p >> 16):
1421 ret = sv_2mortal(newSVuv(*((I32 *)ptr)));
1423 case (U8)(sv_U16p >> 16):
1424 ret = sv_2mortal(newSVuv(*((U16 *)ptr)));
1427 croak("Illegal alias 0x%08x for B::*IVX", (unsigned)ix);
1439 ST(0) = boolSV((I32)SvIVX(sv) != SvIVX(sv));
1440 } else if (sizeof(IV) == 8) {
1442 const IV iv = SvIVX(sv);
1444 * The following way of spelling 32 is to stop compilers on
1445 * 32-bit architectures from moaning about the shift count
1446 * being >= the width of the type. Such architectures don't
1447 * reach this code anyway (unless sizeof(IV) > 8 but then
1448 * everything else breaks too so I'm not fussed at the moment).
1451 wp[0] = htonl(((UV)iv) >> (sizeof(UV)*4));
1453 wp[0] = htonl(((U32)iv) >> (sizeof(UV)*4));
1455 wp[1] = htonl(iv & 0xffffffff);
1456 ST(0) = newSVpvn_flags((char *)wp, 8, SVs_TEMP);
1458 U32 w = htonl((U32)SvIVX(sv));
1459 ST(0) = newSVpvn_flags((char *)&w, 4, SVs_TEMP);
1462 MODULE = B PACKAGE = B::NV PREFIX = Sv
1468 #if PERL_VERSION < 11
1470 MODULE = B PACKAGE = B::RV PREFIX = Sv
1476 PUSHs(make_sv_object(aTHX_ SvRV(sv)));
1480 MODULE = B PACKAGE = B::REGEXP
1489 PUSHs(newSVpvn_flags(RX_PRECOMP(sv), RX_PRELEN(sv), SVs_TEMP));
1492 /* FIXME - can we code this method more efficiently? */
1498 MODULE = B PACKAGE = B::PV
1505 croak( "argument is not SvROK" );
1506 PUSHs(make_sv_object(aTHX_ SvRV(sv)));
1521 #ifndef PERL_FBM_TABLE_OFFSET
1522 const MAGIC *const mg = mg_find(sv, PERL_MAGIC_bm);
1525 croak("argument to B::BM::TABLE is not a PVBM");
1530 /* Boyer-Moore table is just after string and its safety-margin \0 */
1531 p += len + PERL_FBM_TABLE_OFFSET;
1534 } else if (ix == 2) {
1535 /* This used to read 257. I think that that was buggy - should have
1536 been 258. (The "\0", the flags byte, and 256 for the table.)
1537 The only user of this method is B::Bytecode in B::PV::bsave.
1538 I'm guessing that nothing tested the runtime correctness of
1539 output of bytecompiled string constant arguments to index (etc).
1541 Note the start pointer is and has always been SvPVX(sv), not
1542 SvPVX(sv) + SvCUR(sv) PVBM was added in 651aa52ea1faa806, and
1543 first used by the compiler in 651aa52ea1faa806. It's used to
1544 get a "complete" dump of the buffer at SvPVX(), not just the
1545 PVBM table. This permits the generated bytecode to "load"
1548 5.15 and later store the BM table via MAGIC, so the compiler
1549 should handle this just fine without changes if PVBM now
1550 always returns the SvPVX() buffer. */
1553 ? RX_WRAPPED_const((REGEXP*)sv)
1556 p = SvPVX_const(sv);
1558 #ifdef PERL_FBM_TABLE_OFFSET
1559 len = SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0);
1565 p = isREGEXP(sv) ? RX_WRAPPED((REGEXP*)sv) : SvPVX(sv);
1570 } else if (SvPOK(sv)) {
1572 p = SvPVX_const(sv);
1576 else if (isREGEXP(sv)) {
1578 p = RX_WRAPPED_const((REGEXP*)sv);
1583 /* XXX for backward compatibility, but should fail */
1584 /* croak( "argument is not SvPOK" ); */
1587 ST(0) = newSVpvn_flags(p, len, SVs_TEMP | utf8);
1589 MODULE = B PACKAGE = B::PVMG
1594 MAGIC * mg = NO_INIT
1596 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
1597 XPUSHs(make_mg_object(aTHX_ mg));
1599 MODULE = B PACKAGE = B::MAGIC
1616 XPUSHs(mg->mg_moremagic ? make_mg_object(aTHX_ mg->mg_moremagic)
1620 mPUSHu(mg->mg_private);
1623 PUSHs(newSVpvn_flags(&(mg->mg_type), 1, SVs_TEMP));
1626 mPUSHu(mg->mg_flags);
1632 PUSHs(make_sv_object(aTHX_ mg->mg_obj));
1636 if (mg->mg_len >= 0) {
1637 PUSHs(newSVpvn_flags(mg->mg_ptr, mg->mg_len, SVs_TEMP));
1638 } else if (mg->mg_len == HEf_SVKEY) {
1639 PUSHs(make_sv_object(aTHX_ (SV*)mg->mg_ptr));
1641 PUSHs(sv_newmortal());
1643 PUSHs(sv_newmortal());
1646 if(mg->mg_type == PERL_MAGIC_qr) {
1647 mPUSHi(PTR2IV(mg->mg_obj));
1649 croak("REGEX is only meaningful on r-magic");
1653 if (mg->mg_type == PERL_MAGIC_qr) {
1654 REGEXP *rx = (REGEXP *)mg->mg_obj;
1655 PUSHs(newSVpvn_flags(rx ? RX_PRECOMP(rx) : NULL,
1656 rx ? RX_PRELEN(rx) : 0, SVs_TEMP));
1658 croak( "precomp is only meaningful on r-magic" );
1663 MODULE = B PACKAGE = B::GV PREFIX = Gv
1672 ST(0) = sv_2mortal(newSVhek(!ix ? GvNAME_HEK(gv)
1673 : (ix == 1 ? GvFILE_HEK(gv)
1674 : HvNAME_HEK((HV *)gv))));
1683 RETVAL = isGV_with_GP(gv) ? TRUE : FALSE;
1685 RETVAL = GvGP(gv) == Null(GP*);
1694 #define GP_sv_ix SVp | offsetof(struct gp, gp_sv)
1695 #define GP_io_ix SVp | offsetof(struct gp, gp_io)
1696 #define GP_cv_ix SVp | offsetof(struct gp, gp_cv)
1697 #define GP_cvgen_ix U32p | offsetof(struct gp, gp_cvgen)
1698 #define GP_refcnt_ix U32p | offsetof(struct gp, gp_refcnt)
1699 #define GP_hv_ix SVp | offsetof(struct gp, gp_hv)
1700 #define GP_av_ix SVp | offsetof(struct gp, gp_av)
1701 #define GP_form_ix SVp | offsetof(struct gp, gp_form)
1702 #define GP_egv_ix SVp | offsetof(struct gp, gp_egv)
1703 #define GP_line_ix line_tp | offsetof(struct gp, gp_line)
1713 GvREFCNT = GP_refcnt_ix
1726 const GV *const gv = CvGV(cv);
1727 Perl_croak(aTHX_ "NULL gp in B::GV::%s", gv ? GvNAME(gv) : "???");
1729 ptr = (ix & 0xFFFF) + (char *)gp;
1730 switch ((U8)(ix >> 16)) {
1731 case (U8)(SVp >> 16):
1732 ret = make_sv_object(aTHX_ *((SV **)ptr));
1734 case (U8)(U32p >> 16):
1735 ret = sv_2mortal(newSVuv(*((U32*)ptr)));
1737 case (U8)(line_tp >> 16):
1738 ret = sv_2mortal(newSVuv(*((line_t *)ptr)));
1741 croak("Illegal alias 0x%08x for B::*SV", (unsigned)ix);
1750 PUSHs(make_sv_object(aTHX_ (SV *)GvFILEGV(gv)));
1752 MODULE = B PACKAGE = B::IO PREFIX = Io
1762 if( strEQ( name, "stdin" ) ) {
1763 handle = PerlIO_stdin();
1765 else if( strEQ( name, "stdout" ) ) {
1766 handle = PerlIO_stdout();
1768 else if( strEQ( name, "stderr" ) ) {
1769 handle = PerlIO_stderr();
1772 croak( "Invalid value '%s'", name );
1774 RETVAL = handle == IoIFP(io);
1778 MODULE = B PACKAGE = B::AV PREFIX = Av
1788 if (AvFILL(av) >= 0) {
1789 SV **svp = AvARRAY(av);
1791 for (i = 0; i <= AvFILL(av); i++)
1792 XPUSHs(make_sv_object(aTHX_ svp[i]));
1800 if (idx >= 0 && AvFILL(av) >= 0 && idx <= AvFILL(av))
1801 XPUSHs(make_sv_object(aTHX_ (AvARRAY(av)[idx])));
1803 XPUSHs(make_sv_object(aTHX_ NULL));
1806 MODULE = B PACKAGE = B::FM PREFIX = Fm
1809 #define FmLINES(sv) 0
1815 MODULE = B PACKAGE = B::CV PREFIX = Cv
1827 PUSHs(make_op_object(aTHX_ CvISXSUB(cv) ? NULL
1828 : ix ? CvROOT(cv) : CvSTART(cv)));
1846 PUSHs(make_sv_object(aTHX_ (SV *)CvPADLIST(cv)));
1857 ST(0) = ix && CvCONST(cv)
1858 ? make_sv_object(aTHX_ (SV *)CvXSUBANY(cv).any_ptr)
1859 : sv_2mortal(newSViv(CvISXSUB(cv)
1860 ? (ix ? CvXSUBANY(cv).any_iv
1861 : PTR2IV(CvXSUB(cv)))
1868 PUSHs(make_sv_object(aTHX_ (SV *)cv_const_sv(cv)));
1870 MODULE = B PACKAGE = B::HV PREFIX = Hv
1884 if (HvUSEDKEYS(hv) > 0) {
1888 (void)hv_iterinit(hv);
1889 EXTEND(sp, HvUSEDKEYS(hv) * 2);
1890 while ((sv = hv_iternextsv(hv, &key, &len))) {
1892 PUSHs(make_sv_object(aTHX_ sv));
1896 MODULE = B PACKAGE = B::HE PREFIX = He
1904 PUSHs(make_sv_object(aTHX_ ix ? HeSVKEY_force(he) : HeVAL(he)));
1910 MODULE = B PACKAGE = B::RHE
1916 RETVAL = newRV( (SV*)cophh_2hv(h, 0) );
1923 MODULE = B PACKAGE = B::PADLIST PREFIX = Padlist
1930 PadlistARRAY(padlist)
1933 if (PadlistMAX(padlist) >= 0) {
1934 PAD **padp = PadlistARRAY(padlist);
1936 for (i = 0; i <= PadlistMAX(padlist); i++)
1937 XPUSHs(make_sv_object(aTHX_ (SV *)padp[i]));
1941 PadlistARRAYelt(padlist, idx)
1945 if (PadlistMAX(padlist) >= 0
1946 && idx <= PadlistMAX(padlist))
1947 XPUSHs(make_sv_object(aTHX_
1948 (SV *)PadlistARRAY(padlist)[idx]));
1950 XPUSHs(make_sv_object(aTHX_ NULL));
1953 PadlistREFCNT(padlist)
1956 RETVAL = PadlistREFCNT(padlist);