3 * Copyright (c) 1996 Malcolm Beattie
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
10 #define PERL_NO_GET_CONTEXT
16 typedef PerlIO * InputStream;
18 typedef FILE * InputStream;
22 static const char* const svclassnames[] = {
29 #if PERL_VERSION <= 10
39 #if PERL_VERSION >= 11
71 static const char* const opclassnames[] = {
86 static const size_t opsizes[] = {
101 #define MY_CXT_KEY "B::_guts" XS_VERSION
104 int x_walkoptree_debug; /* Flag for walkoptree debug hook */
105 SV * x_specialsv_list[7];
110 #define walkoptree_debug (MY_CXT.x_walkoptree_debug)
111 #define specialsv_list (MY_CXT.x_specialsv_list)
114 cc_opclass(pTHX_ const OP *o)
120 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
122 if (o->op_type == OP_SASSIGN)
123 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPc_UNOP : OPc_BINOP);
125 if (o->op_type == OP_AELEMFAST) {
126 if (o->op_flags & OPf_SPECIAL)
137 if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
138 o->op_type == OP_RCATLINE)
142 switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
167 case OA_PVOP_OR_SVOP:
169 * Character translations (tr///) are usually a PVOP, keeping a
170 * pointer to a table of shorts used to look up translations.
171 * Under utf8, however, a simple table isn't practical; instead,
172 * the OP is an SVOP, and the SV is a reference to a swash
173 * (i.e., an RV pointing to an HV).
175 return (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
176 ? OPc_SVOP : OPc_PVOP;
184 case OA_BASEOP_OR_UNOP:
186 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
187 * whether parens were seen. perly.y uses OPf_SPECIAL to
188 * signal whether a BASEOP had empty parens or none.
189 * Some other UNOPs are created later, though, so the best
190 * test is OPf_KIDS, which is set in newUNOP.
192 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
196 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
197 * the OPf_REF flag to distinguish between OP types instead of the
198 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
199 * return OPc_UNOP so that walkoptree can find our children. If
200 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
201 * (no argument to the operator) it's an OP; with OPf_REF set it's
202 * an SVOP (and op_sv is the GV for the filehandle argument).
204 return ((o->op_flags & OPf_KIDS) ? OPc_UNOP :
206 (o->op_flags & OPf_REF) ? OPc_PADOP : OPc_BASEOP);
208 (o->op_flags & OPf_REF) ? OPc_SVOP : OPc_BASEOP);
212 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
213 * label was omitted (in which case it's a BASEOP) or else a term was
214 * seen. In this last case, all except goto are definitely PVOP but
215 * goto is either a PVOP (with an ordinary constant label), an UNOP
216 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
217 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
220 if (o->op_flags & OPf_STACKED)
222 else if (o->op_flags & OPf_SPECIAL)
227 warn("can't determine class of operator %s, assuming BASEOP\n",
228 PL_op_name[o->op_type]);
233 cc_opclassname(pTHX_ const OP *o)
235 return (char *)opclassnames[cc_opclass(aTHX_ o)];
239 make_sv_object(pTHX_ SV *arg, SV *sv)
241 const char *type = 0;
245 for (iv = 0; iv < sizeof(specialsv_list)/sizeof(SV*); iv++) {
246 if (sv == specialsv_list[iv]) {
252 type = svclassnames[SvTYPE(sv)];
255 sv_setiv(newSVrv(arg, type), iv);
259 #if PERL_VERSION >= 9
261 make_temp_object(pTHX_ SV *arg, SV *temp)
264 const char *const type = svclassnames[SvTYPE(temp)];
265 const IV iv = PTR2IV(temp);
267 target = newSVrv(arg, type);
268 sv_setiv(target, iv);
270 /* Need to keep our "temp" around as long as the target exists.
271 Simplest way seems to be to hang it from magic, and let that clear
272 it up. No vtable, so won't actually get in the way of anything. */
273 sv_magicext(target, temp, PERL_MAGIC_sv, NULL, NULL, 0);
274 /* magic object has had its reference count increased, so we must drop
281 make_warnings_object(pTHX_ SV *arg, STRLEN *warnings)
283 const char *type = 0;
285 IV iv = sizeof(specialsv_list)/sizeof(SV*);
287 /* Counting down is deliberate. Before the split between make_sv_object
288 and make_warnings_obj there appeared to be a bug - Nullsv and pWARN_STD
289 were both 0, so you could never get a B::SPECIAL for pWARN_STD */
292 if ((SV*)warnings == specialsv_list[iv]) {
298 sv_setiv(newSVrv(arg, type), iv);
301 /* B assumes that warnings are a regular SV. Seems easier to keep it
302 happy by making them into a regular SV. */
303 return make_temp_object(aTHX_ arg,
304 newSVpvn((char *)(warnings + 1), *warnings));
309 make_cop_io_object(pTHX_ SV *arg, COP *cop)
311 SV *const value = newSV(0);
313 Perl_emulate_cop_io(aTHX_ cop, value);
316 return make_temp_object(aTHX_ arg, newSVsv(value));
319 return make_sv_object(aTHX_ arg, NULL);
325 make_mg_object(pTHX_ SV *arg, MAGIC *mg)
327 sv_setiv(newSVrv(arg, "B::MAGIC"), PTR2IV(mg));
332 cstring(pTHX_ SV *sv, bool perlstyle)
334 SV *sstr = newSVpvn("", 0);
337 sv_setpvn(sstr, "0", 1);
338 else if (perlstyle && SvUTF8(sv)) {
339 SV *tmpsv = sv_newmortal(); /* Temporary SV to feed sv_uni_display */
340 const STRLEN len = SvCUR(sv);
341 const char *s = sv_uni_display(tmpsv, sv, 8*len, UNI_DISPLAY_QQ);
342 sv_setpvn(sstr,"\"",1);
346 sv_catpvn(sstr, "\\\"", 2);
348 sv_catpvn(sstr, "\\$", 2);
350 sv_catpvn(sstr, "\\@", 2);
353 if (strchr("nrftax\\",*(s+1)))
354 sv_catpvn(sstr, s++, 2);
356 sv_catpvn(sstr, "\\\\", 2);
358 else /* should always be printable */
359 sv_catpvn(sstr, s, 1);
362 sv_catpv(sstr, "\"");
369 const char *s = SvPV(sv, len);
370 sv_catpv(sstr, "\"");
371 for (; len; len--, s++)
373 /* At least try a little for readability */
375 sv_catpv(sstr, "\\\"");
377 sv_catpv(sstr, "\\\\");
378 /* trigraphs - bleagh */
379 else if (!perlstyle && *s == '?' && len>=3 && s[1] == '?') {
380 char escbuff[5]; /* to fit backslash, 3 octals + trailing \0 */
381 sprintf(escbuff, "\\%03o", '?');
382 sv_catpv(sstr, escbuff);
384 else if (perlstyle && *s == '$')
385 sv_catpv(sstr, "\\$");
386 else if (perlstyle && *s == '@')
387 sv_catpv(sstr, "\\@");
389 else if (isPRINT(*s))
391 else if (*s >= ' ' && *s < 127)
393 sv_catpvn(sstr, s, 1);
395 sv_catpv(sstr, "\\n");
397 sv_catpv(sstr, "\\r");
399 sv_catpv(sstr, "\\t");
401 sv_catpv(sstr, "\\a");
403 sv_catpv(sstr, "\\b");
405 sv_catpv(sstr, "\\f");
406 else if (!perlstyle && *s == '\v')
407 sv_catpv(sstr, "\\v");
410 /* Don't want promotion of a signed -1 char in sprintf args */
411 char escbuff[5]; /* to fit backslash, 3 octals + trailing \0 */
412 const unsigned char c = (unsigned char) *s;
413 sprintf(escbuff, "\\%03o", c);
414 sv_catpv(sstr, escbuff);
416 /* XXX Add line breaks if string is long */
418 sv_catpv(sstr, "\"");
426 SV *sstr = newSVpvn("'", 1);
427 const char *s = SvPV_nolen(sv);
430 sv_catpvn(sstr, "\\'", 2);
432 sv_catpvn(sstr, "\\\\", 2);
434 else if (isPRINT(*s))
436 else if (*s >= ' ' && *s < 127)
438 sv_catpvn(sstr, s, 1);
440 sv_catpvn(sstr, "\\n", 2);
442 sv_catpvn(sstr, "\\r", 2);
444 sv_catpvn(sstr, "\\t", 2);
446 sv_catpvn(sstr, "\\a", 2);
448 sv_catpvn(sstr, "\\b", 2);
450 sv_catpvn(sstr, "\\f", 2);
452 sv_catpvn(sstr, "\\v", 2);
455 /* no trigraph support */
456 char escbuff[5]; /* to fit backslash, 3 octals + trailing \0 */
457 /* Don't want promotion of a signed -1 char in sprintf args */
458 unsigned char c = (unsigned char) *s;
459 sprintf(escbuff, "\\%03o", c);
460 sv_catpv(sstr, escbuff);
462 sv_catpvn(sstr, "'", 1);
466 #if PERL_VERSION >= 9
467 # define PMOP_pmreplstart(o) o->op_pmstashstartu.op_pmreplstart
468 # define PMOP_pmreplroot(o) o->op_pmreplrootu.op_pmreplroot
470 # define PMOP_pmreplstart(o) o->op_pmreplstart
471 # define PMOP_pmreplroot(o) o->op_pmreplroot
472 # define PMOP_pmpermflags(o) o->op_pmpermflags
473 # define PMOP_pmdynflags(o) o->op_pmdynflags
477 walkoptree(pTHX_ SV *opsv, const char *method)
484 croak("opsv is not a reference");
485 opsv = sv_mortalcopy(opsv);
486 o = INT2PTR(OP*,SvIV((SV*)SvRV(opsv)));
487 if (walkoptree_debug) {
491 perl_call_method("walkoptree_debug", G_DISCARD);
496 perl_call_method(method, G_DISCARD);
497 if (o && (o->op_flags & OPf_KIDS)) {
498 for (kid = ((UNOP*)o)->op_first; kid; kid = kid->op_sibling) {
499 /* Use the same opsv. Rely on methods not to mess it up. */
500 sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ kid)), PTR2IV(kid));
501 walkoptree(aTHX_ opsv, method);
504 if (o && (cc_opclass(aTHX_ o) == OPc_PMOP) && o->op_type != OP_PUSHRE
505 && (kid = PMOP_pmreplroot(cPMOPo)))
507 sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ kid)), PTR2IV(kid));
508 walkoptree(aTHX_ opsv, method);
513 oplist(pTHX_ OP *o, SV **SP)
515 for(; o; o = o->op_next) {
517 #if PERL_VERSION >= 9
526 opsv = sv_newmortal();
527 sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ (OP*)o)), PTR2IV(o));
529 switch (o->op_type) {
531 SP = oplist(aTHX_ PMOP_pmreplstart(cPMOPo), SP);
534 if (o->op_flags & OPf_STACKED && o->op_flags & OPf_SPECIAL) {
535 OP *kid = cLISTOPo->op_first->op_sibling; /* pass pushmark */
536 kid = kUNOP->op_first; /* pass rv2gv */
537 kid = kUNOP->op_first; /* pass leave */
538 SP = oplist(aTHX_ kid->op_next, SP);
542 switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
544 SP = oplist(aTHX_ cLOGOPo->op_other, SP);
547 SP = oplist(aTHX_ cLOOPo->op_lastop, SP);
548 SP = oplist(aTHX_ cLOOPo->op_nextop, SP);
549 SP = oplist(aTHX_ cLOOPo->op_redoop, SP);
557 typedef UNOP *B__UNOP;
558 typedef BINOP *B__BINOP;
559 typedef LOGOP *B__LOGOP;
560 typedef LISTOP *B__LISTOP;
561 typedef PMOP *B__PMOP;
562 typedef SVOP *B__SVOP;
563 typedef PADOP *B__PADOP;
564 typedef PVOP *B__PVOP;
565 typedef LOOP *B__LOOP;
573 #if PERL_VERSION >= 11
574 typedef SV *B__REGEXP;
586 typedef MAGIC *B__MAGIC;
588 #if PERL_VERSION >= 9
589 typedef struct refcounted_he *B__RHE;
592 MODULE = B PACKAGE = B PREFIX = B_
598 HV *stash = gv_stashpvn("B", 1, GV_ADD);
599 AV *export_ok = perl_get_av("B::EXPORT_OK", GV_ADD);
601 specialsv_list[0] = Nullsv;
602 specialsv_list[1] = &PL_sv_undef;
603 specialsv_list[2] = &PL_sv_yes;
604 specialsv_list[3] = &PL_sv_no;
605 specialsv_list[4] = (SV *) pWARN_ALL;
606 specialsv_list[5] = (SV *) pWARN_NONE;
607 specialsv_list[6] = (SV *) pWARN_STD;
608 #if PERL_VERSION <= 8
609 # define OPpPAD_STATE 0
614 #define B_main_cv() PL_main_cv
615 #define B_init_av() PL_initav
616 #define B_inc_gv() PL_incgv
617 #define B_check_av() PL_checkav_save
619 # define B_unitcheck_av() PL_unitcheckav_save
621 # define B_unitcheck_av() NULL
623 #define B_begin_av() PL_beginav_save
624 #define B_end_av() PL_endav
625 #define B_main_root() PL_main_root
626 #define B_main_start() PL_main_start
627 #define B_amagic_generation() PL_amagic_generation
628 #define B_sub_generation() PL_sub_generation
629 #define B_defstash() PL_defstash
630 #define B_curstash() PL_curstash
631 #define B_dowarn() PL_dowarn
632 #define B_comppadlist() (PL_main_cv ? CvPADLIST(PL_main_cv) : CvPADLIST(PL_compcv))
633 #define B_sv_undef() &PL_sv_undef
634 #define B_sv_yes() &PL_sv_yes
635 #define B_sv_no() &PL_sv_no
636 #define B_formfeed() PL_formfeed
638 #define B_regex_padav() PL_regex_padav
647 #if PERL_VERSION >= 9
680 B_amagic_generation()
712 ST(0) = make_sv_object(aTHX_ sv_newmortal(), PL_warnhook);
717 ST(0) = make_sv_object(aTHX_ sv_newmortal(), PL_diehook);
719 MODULE = B PACKAGE = B
722 walkoptree(opsv, method)
726 walkoptree(aTHX_ opsv, method);
729 walkoptree_debug(...)
732 RETVAL = walkoptree_debug;
733 if (items > 0 && SvTRUE(ST(1)))
734 walkoptree_debug = 1;
738 #define address(sv) PTR2IV(sv)
749 croak("argument is not a reference");
750 RETVAL = (SV*)SvRV(sv);
761 ST(0) = sv_newmortal();
762 if (strncmp(name,"pp_",3) == 0)
764 for (i = 0; i < PL_maxo; i++)
766 if (strcmp(name, PL_op_name[i]) == 0)
772 sv_setiv(ST(0),result);
779 ST(0) = sv_newmortal();
780 if (opnum >= 0 && opnum < PL_maxo) {
781 sv_setpvn(ST(0), "pp_", 3);
782 sv_catpv(ST(0), PL_op_name[opnum]);
791 char hexhash[19]; /* must fit "0xffffffffffffffff" plus trailing \0 */
792 const char *s = SvPV(sv, len);
793 PERL_HASH(hash, s, len);
794 sprintf(hexhash, "0x%"UVxf, (UV)hash);
795 ST(0) = sv_2mortal(newSVpv(hexhash, 0));
797 #define cast_I32(foo) (I32)foo
816 RETVAL = cstring(aTHX_ sv, 0);
824 RETVAL = cstring(aTHX_ sv, 1);
832 RETVAL = cchar(aTHX_ sv);
839 #if PERL_VERSION <= 8
840 # ifdef USE_5005THREADS
842 const STRLEN len = strlen(PL_threadsv_names);
845 for (i = 0; i < len; i++)
846 PUSHs(sv_2mortal(newSVpvn(&PL_threadsv_names[i], 1)));
850 #define OP_next(o) o->op_next
851 #define OP_sibling(o) o->op_sibling
852 #define OP_desc(o) (char *)PL_op_desc[o->op_type]
853 #define OP_targ(o) o->op_targ
854 #define OP_type(o) o->op_type
855 #if PERL_VERSION >= 9
856 # define OP_opt(o) o->op_opt
858 # define OP_seq(o) o->op_seq
860 #define OP_flags(o) o->op_flags
861 #define OP_private(o) o->op_private
862 #define OP_spare(o) o->op_spare
864 MODULE = B PACKAGE = B::OP PREFIX = OP_
870 RETVAL = opsizes[cc_opclass(aTHX_ o)];
886 RETVAL = (char *)PL_op_name[o->op_type];
896 SV *sv = sv_newmortal();
898 sv_setpvn(sv, "PL_ppaddr[OP_", 13);
899 sv_catpv(sv, PL_op_name[o->op_type]);
900 for (i=13; (STRLEN)i < SvCUR(sv); ++i)
901 SvPVX(sv)[i] = toUPPER(SvPVX(sv)[i]);
917 #if PERL_VERSION >= 9
939 #if PERL_VERSION >= 9
951 SP = oplist(aTHX_ o, SP);
953 #define UNOP_first(o) o->op_first
955 MODULE = B PACKAGE = B::UNOP PREFIX = UNOP_
961 #define BINOP_last(o) o->op_last
963 MODULE = B PACKAGE = B::BINOP PREFIX = BINOP_
969 #define LOGOP_other(o) o->op_other
971 MODULE = B PACKAGE = B::LOGOP PREFIX = LOGOP_
977 MODULE = B PACKAGE = B::LISTOP PREFIX = LISTOP_
986 for (kid = o->op_first; kid; kid = kid->op_sibling)
992 #define PMOP_pmnext(o) o->op_pmnext
993 #define PMOP_pmregexp(o) PM_GETRE(o)
995 #define PMOP_pmoffset(o) o->op_pmoffset
996 #define PMOP_pmstashpv(o) PmopSTASHPV(o);
998 #define PMOP_pmstash(o) PmopSTASH(o);
1000 #define PMOP_pmflags(o) o->op_pmflags
1002 MODULE = B PACKAGE = B::PMOP PREFIX = PMOP_
1004 #if PERL_VERSION <= 8
1011 ST(0) = sv_newmortal();
1012 root = o->op_pmreplroot;
1013 /* OP_PUSHRE stores an SV* instead of an OP* in op_pmreplroot */
1014 if (o->op_type == OP_PUSHRE) {
1015 # ifdef USE_ITHREADS
1016 sv_setiv(ST(0), INT2PTR(PADOFFSET,root) );
1018 sv_setiv(newSVrv(ST(0), root ?
1019 svclassnames[SvTYPE((SV*)root)] : "B::SV"),
1024 sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), PTR2IV(root));
1033 ST(0) = sv_newmortal();
1034 if (o->op_type == OP_PUSHRE) {
1035 # ifdef USE_ITHREADS
1036 sv_setiv(ST(0), o->op_pmreplrootu.op_pmtargetoff);
1038 GV *const target = o->op_pmreplrootu.op_pmtargetgv;
1039 sv_setiv(newSVrv(ST(0), target ?
1040 svclassnames[SvTYPE((SV*)target)] : "B::SV"),
1045 OP *const root = o->op_pmreplrootu.op_pmreplroot;
1046 sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)),
1056 #if PERL_VERSION < 9
1086 #if PERL_VERSION < 9
1101 REGEXP * rx = NO_INIT
1103 ST(0) = sv_newmortal();
1106 sv_setpvn(ST(0), RX_PRECOMP(rx), RX_PRELEN(rx));
1108 #if PERL_VERSION >= 9
1113 REGEXP * rx = NO_INIT
1115 ST(0) = sv_newmortal();
1118 sv_setuv(ST(0), RX_EXTFLAGS(rx));
1122 #define SVOP_sv(o) cSVOPo->op_sv
1123 #define SVOP_gv(o) ((GV*)cSVOPo->op_sv)
1125 MODULE = B PACKAGE = B::SVOP PREFIX = SVOP_
1135 #define PADOP_padix(o) o->op_padix
1136 #define PADOP_sv(o) (o->op_padix ? PAD_SVl(o->op_padix) : Nullsv)
1137 #define PADOP_gv(o) ((o->op_padix \
1138 && SvTYPE(PAD_SVl(o->op_padix)) == SVt_PVGV) \
1139 ? (GV*)PAD_SVl(o->op_padix) : (GV *)NULL)
1141 MODULE = B PACKAGE = B::PADOP PREFIX = PADOP_
1155 MODULE = B PACKAGE = B::PVOP PREFIX = PVOP_
1162 * OP_TRANS uses op_pv to point to a table of 256 or >=258 shorts
1163 * whereas other PVOPs point to a null terminated string.
1165 if (o->op_type == OP_TRANS &&
1166 (o->op_private & OPpTRANS_COMPLEMENT) &&
1167 !(o->op_private & OPpTRANS_DELETE))
1169 const short* const tbl = (short*)o->op_pv;
1170 const short entries = 257 + tbl[256];
1171 ST(0) = sv_2mortal(newSVpv(o->op_pv, entries * sizeof(short)));
1173 else if (o->op_type == OP_TRANS) {
1174 ST(0) = sv_2mortal(newSVpv(o->op_pv, 256 * sizeof(short)));
1177 ST(0) = sv_2mortal(newSVpv(o->op_pv, 0));
1179 #define LOOP_redoop(o) o->op_redoop
1180 #define LOOP_nextop(o) o->op_nextop
1181 #define LOOP_lastop(o) o->op_lastop
1183 MODULE = B PACKAGE = B::LOOP PREFIX = LOOP_
1198 #define COP_label(o) CopLABEL(o)
1199 #define COP_stashpv(o) CopSTASHPV(o)
1200 #define COP_stash(o) CopSTASH(o)
1201 #define COP_file(o) CopFILE(o)
1202 #define COP_filegv(o) CopFILEGV(o)
1203 #define COP_cop_seq(o) o->cop_seq
1204 #define COP_arybase(o) CopARYBASE_get(o)
1205 #define COP_line(o) CopLINE(o)
1206 #define COP_hints(o) CopHINTS_get(o)
1207 #if PERL_VERSION < 9
1208 # define COP_warnings(o) o->cop_warnings
1209 # define COP_io(o) o->cop_io
1212 MODULE = B PACKAGE = B::COP PREFIX = COP_
1214 #if PERL_VERSION >= 11
1257 #if PERL_VERSION >= 9
1263 ST(0) = make_warnings_object(aTHX_ sv_newmortal(), o->cop_warnings);
1270 ST(0) = make_cop_io_object(aTHX_ sv_newmortal(), o);
1277 RETVAL = o->cop_hints_hash;
1297 MODULE = B PACKAGE = B::SV
1303 #define object_2svref(sv) sv
1310 MODULE = B PACKAGE = B::SV PREFIX = Sv
1332 MODULE = B PACKAGE = B::IV PREFIX = Sv
1347 MODULE = B PACKAGE = B::IV
1349 #define needs64bits(sv) ((I32)SvIVX(sv) != SvIVX(sv))
1359 if (sizeof(IV) == 8) {
1361 const IV iv = SvIVX(sv);
1363 * The following way of spelling 32 is to stop compilers on
1364 * 32-bit architectures from moaning about the shift count
1365 * being >= the width of the type. Such architectures don't
1366 * reach this code anyway (unless sizeof(IV) > 8 but then
1367 * everything else breaks too so I'm not fussed at the moment).
1370 wp[0] = htonl(((UV)iv) >> (sizeof(UV)*4));
1372 wp[0] = htonl(((U32)iv) >> (sizeof(UV)*4));
1374 wp[1] = htonl(iv & 0xffffffff);
1375 ST(0) = sv_2mortal(newSVpvn((char *)wp, 8));
1377 U32 w = htonl((U32)SvIVX(sv));
1378 ST(0) = sv_2mortal(newSVpvn((char *)&w, 4));
1382 #if PERL_VERSION >= 11
1392 croak( "argument is not SvROK" );
1399 MODULE = B PACKAGE = B::NV PREFIX = Sv
1410 COP_SEQ_RANGE_LOW(sv)
1414 COP_SEQ_RANGE_HIGH(sv)
1418 PARENT_PAD_INDEX(sv)
1422 PARENT_FAKELEX_FLAGS(sv)
1425 #if PERL_VERSION < 11
1427 MODULE = B PACKAGE = B::RV PREFIX = Sv
1435 MODULE = B PACKAGE = B::PV PREFIX = Sv
1449 croak( "argument is not SvROK" );
1458 ST(0) = sv_newmortal();
1460 /* FIXME - we need a better way for B to identify PVs that are
1461 in the pads as variable names. */
1462 if((SvLEN(sv) && SvCUR(sv) >= SvLEN(sv))) {
1463 /* It claims to be longer than the space allocated for it -
1464 presuambly it's a variable name in the pad */
1465 sv_setpv(ST(0), SvPV_nolen_const(sv));
1467 sv_setpvn(ST(0), SvPVX_const(sv), SvCUR(sv));
1469 SvFLAGS(ST(0)) |= SvUTF8(sv);
1472 /* XXX for backward compatibility, but should fail */
1473 /* croak( "argument is not SvPOK" ); */
1474 sv_setpvn(ST(0), NULL, 0);
1477 # This used to read 257. I think that that was buggy - should have been 258.
1478 # (The "\0", the flags byte, and 256 for the table. Not that anything
1479 # anywhere calls this method. NWC.
1484 ST(0) = sv_newmortal();
1485 sv_setpvn(ST(0), SvPVX_const(sv),
1486 SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0));
1497 MODULE = B PACKAGE = B::PVMG PREFIX = Sv
1502 MAGIC * mg = NO_INIT
1504 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
1505 XPUSHs(make_mg_object(aTHX_ sv_newmortal(), mg));
1507 MODULE = B PACKAGE = B::PVMG
1513 MODULE = B PACKAGE = B::REGEXP
1515 #if PERL_VERSION >= 11
1521 /* FIXME - can we code this method more efficiently? */
1522 RETVAL = PTR2IV(sv);
1530 RETVAL = newSVpvn( RX_PRECOMP(sv), RX_PRELEN(sv) );
1536 #define MgMOREMAGIC(mg) mg->mg_moremagic
1537 #define MgPRIVATE(mg) mg->mg_private
1538 #define MgTYPE(mg) mg->mg_type
1539 #define MgFLAGS(mg) mg->mg_flags
1540 #define MgOBJ(mg) mg->mg_obj
1541 #define MgLENGTH(mg) mg->mg_len
1542 #define MgREGEX(mg) PTR2IV(mg->mg_obj)
1544 MODULE = B PACKAGE = B::MAGIC PREFIX = Mg
1550 if( MgMOREMAGIC(mg) ) {
1551 RETVAL = MgMOREMAGIC(mg);
1579 if(mg->mg_type == PERL_MAGIC_qr) {
1580 RETVAL = MgREGEX(mg);
1583 croak( "REGEX is only meaningful on r-magic" );
1592 if (mg->mg_type == PERL_MAGIC_qr) {
1593 REGEXP* rx = (REGEXP*)mg->mg_obj;
1596 RETVAL = newSVpvn( RX_PRECOMP(rx), RX_PRELEN(rx) );
1599 croak( "precomp is only meaningful on r-magic" );
1612 ST(0) = sv_newmortal();
1614 if (mg->mg_len >= 0){
1615 sv_setpvn(ST(0), mg->mg_ptr, mg->mg_len);
1616 } else if (mg->mg_len == HEf_SVKEY) {
1617 ST(0) = make_sv_object(aTHX_
1618 sv_newmortal(), (SV*)mg->mg_ptr);
1622 MODULE = B PACKAGE = B::PVLV PREFIX = Lv
1640 MODULE = B PACKAGE = B::BM PREFIX = Bm
1657 STRLEN len = NO_INIT
1658 char * str = NO_INIT
1660 str = SvPV(sv, len);
1661 /* Boyer-Moore table is just after string and its safety-margin \0 */
1662 ST(0) = sv_2mortal(newSVpvn(str + len + PERL_FBM_TABLE_OFFSET, 256));
1664 MODULE = B PACKAGE = B::GV PREFIX = Gv
1670 ST(0) = sv_2mortal(newSVpvn(GvNAME(gv), GvNAMELEN(gv)));
1676 RETVAL = GvGP(gv) == Null(GP*);
1684 #if PERL_VERSION >= 9
1685 RETVAL = isGV_with_GP(gv) ? TRUE : FALSE;
1687 RETVAL = TRUE; /* In 5.8 and earlier they all are. */
1712 RETVAL = (SV*)GvFORM(gv);
1748 MODULE = B PACKAGE = B::GV
1758 MODULE = B PACKAGE = B::IO PREFIX = Io
1800 #if PERL_VERSION <= 8
1815 if( strEQ( name, "stdin" ) ) {
1816 handle = PerlIO_stdin();
1818 else if( strEQ( name, "stdout" ) ) {
1819 handle = PerlIO_stdout();
1821 else if( strEQ( name, "stderr" ) ) {
1822 handle = PerlIO_stderr();
1825 croak( "Invalid value '%s'", name );
1827 RETVAL = handle == IoIFP(io);
1831 MODULE = B PACKAGE = B::IO
1841 MODULE = B PACKAGE = B::AV PREFIX = Av
1851 #if PERL_VERSION < 9
1854 #define AvOFF(av) ((XPVAV*)SvANY(av))->xof_off
1866 if (AvFILL(av) >= 0) {
1867 SV **svp = AvARRAY(av);
1869 for (i = 0; i <= AvFILL(av); i++)
1870 XPUSHs(make_sv_object(aTHX_ sv_newmortal(), svp[i]));
1878 if (idx >= 0 && AvFILL(av) >= 0 && idx <= AvFILL(av))
1879 XPUSHs(make_sv_object(aTHX_ sv_newmortal(), (AvARRAY(av)[idx])));
1881 XPUSHs(make_sv_object(aTHX_ sv_newmortal(), NULL));
1883 #if PERL_VERSION < 9
1885 MODULE = B PACKAGE = B::AV
1893 MODULE = B PACKAGE = B::FM PREFIX = Fm
1899 MODULE = B PACKAGE = B::CV PREFIX = Cv
1913 RETVAL = CvISXSUB(cv) ? NULL : CvSTART(cv);
1921 RETVAL = CvISXSUB(cv) ? NULL : CvROOT(cv);
1953 ST(0) = sv_2mortal(newSViv(CvISXSUB(cv) ? PTR2IV(CvXSUB(cv)) : 0));
1960 ST(0) = CvCONST(cv) ?
1961 make_sv_object(aTHX_ sv_newmortal(),(SV *)CvXSUBANY(cv).any_ptr) :
1962 sv_2mortal(newSViv(CvISXSUB(cv) ? CvXSUBANY(cv).any_iv : 0));
1964 MODULE = B PACKAGE = B::CV
1970 MODULE = B PACKAGE = B::CV PREFIX = cv_
1977 MODULE = B PACKAGE = B::HV PREFIX = Hv
1999 #if PERL_VERSION < 9
2011 if (HvKEYS(hv) > 0) {
2015 (void)hv_iterinit(hv);
2016 EXTEND(sp, HvKEYS(hv) * 2);
2017 while ((sv = hv_iternextsv(hv, &key, &len))) {
2019 PUSHs(make_sv_object(aTHX_ sv_newmortal(), sv));
2023 MODULE = B PACKAGE = B::HE PREFIX = He
2037 MODULE = B PACKAGE = B::RHE PREFIX = RHE_
2039 #if PERL_VERSION >= 9
2045 RETVAL = newRV( (SV*)Perl_refcounted_he_chain_2hv(aTHX_ h) );