Replace all remaining accesses to COP's cop_label with CopLABEL().
[p5sagit/p5-mst-13.2.git] / ext / B / B.xs
CommitLineData
a8a597b2 1/* B.xs
2 *
3 * Copyright (c) 1996 Malcolm Beattie
4 *
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.
7 *
8 */
9
c5be433b 10#define PERL_NO_GET_CONTEXT
a8a597b2 11#include "EXTERN.h"
12#include "perl.h"
13#include "XSUB.h"
a8a597b2 14
51aa15f3 15#ifdef PerlIO
16typedef PerlIO * InputStream;
17#else
18typedef FILE * InputStream;
19#endif
20
21
27da23d5 22static const char* const svclassnames[] = {
a8a597b2 23 "B::NULL",
cecf5685 24#if PERL_VERSION >= 9
25 "B::BIND",
26#endif
1cb9cd50 27 "B::IV",
b53eecb4 28 "B::NV",
4df7f6af 29#if PERL_VERSION <= 10
30 "B::RV",
31#endif
a8a597b2 32 "B::PV",
33 "B::PVIV",
34 "B::PVNV",
35 "B::PVMG",
cecf5685 36#if PERL_VERSION <= 8
a8a597b2 37 "B::BM",
cecf5685 38#endif
4df7f6af 39#if PERL_VERSION >= 11
5c35adbb 40 "B::REGEXP",
4df7f6af 41#endif
7252851f 42#if PERL_VERSION >= 9
4ce457a6 43 "B::GV",
7252851f 44#endif
a8a597b2 45 "B::PVLV",
46 "B::AV",
47 "B::HV",
48 "B::CV",
7252851f 49#if PERL_VERSION <= 8
50 "B::GV",
51#endif
a8a597b2 52 "B::FM",
53 "B::IO",
54};
55
56typedef enum {
57 OPc_NULL, /* 0 */
58 OPc_BASEOP, /* 1 */
59 OPc_UNOP, /* 2 */
60 OPc_BINOP, /* 3 */
61 OPc_LOGOP, /* 4 */
1a67a97c 62 OPc_LISTOP, /* 5 */
63 OPc_PMOP, /* 6 */
64 OPc_SVOP, /* 7 */
7934575e 65 OPc_PADOP, /* 8 */
1a67a97c 66 OPc_PVOP, /* 9 */
651aa52e 67 OPc_LOOP, /* 10 */
68 OPc_COP /* 11 */
a8a597b2 69} opclass;
70
27da23d5 71static const char* const opclassnames[] = {
a8a597b2 72 "B::NULL",
73 "B::OP",
74 "B::UNOP",
75 "B::BINOP",
76 "B::LOGOP",
a8a597b2 77 "B::LISTOP",
78 "B::PMOP",
79 "B::SVOP",
7934575e 80 "B::PADOP",
a8a597b2 81 "B::PVOP",
a8a597b2 82 "B::LOOP",
83 "B::COP"
84};
85
27da23d5 86static const size_t opsizes[] = {
651aa52e 87 0,
88 sizeof(OP),
89 sizeof(UNOP),
90 sizeof(BINOP),
91 sizeof(LOGOP),
92 sizeof(LISTOP),
93 sizeof(PMOP),
94 sizeof(SVOP),
95 sizeof(PADOP),
96 sizeof(PVOP),
97 sizeof(LOOP),
98 sizeof(COP)
99};
100
df3728a2 101#define MY_CXT_KEY "B::_guts" XS_VERSION
a8a597b2 102
89ca4ac7 103typedef struct {
104 int x_walkoptree_debug; /* Flag for walkoptree debug hook */
b326da91 105 SV * x_specialsv_list[7];
89ca4ac7 106} my_cxt_t;
107
108START_MY_CXT
109
110#define walkoptree_debug (MY_CXT.x_walkoptree_debug)
111#define specialsv_list (MY_CXT.x_specialsv_list)
e8edd1e6 112
a8a597b2 113static opclass
5d7488b2 114cc_opclass(pTHX_ const OP *o)
a8a597b2 115{
116 if (!o)
117 return OPc_NULL;
118
119 if (o->op_type == 0)
120 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
121
122 if (o->op_type == OP_SASSIGN)
123 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPc_UNOP : OPc_BINOP);
124
c60fdceb 125 if (o->op_type == OP_AELEMFAST) {
126 if (o->op_flags & OPf_SPECIAL)
127 return OPc_BASEOP;
128 else
129#ifdef USE_ITHREADS
130 return OPc_PADOP;
131#else
132 return OPc_SVOP;
133#endif
134 }
135
18228111 136#ifdef USE_ITHREADS
31b49ad4 137 if (o->op_type == OP_GV || o->op_type == OP_GVSV ||
c60fdceb 138 o->op_type == OP_RCATLINE)
18228111 139 return OPc_PADOP;
140#endif
141
22c35a8c 142 switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
a8a597b2 143 case OA_BASEOP:
144 return OPc_BASEOP;
145
146 case OA_UNOP:
147 return OPc_UNOP;
148
149 case OA_BINOP:
150 return OPc_BINOP;
151
152 case OA_LOGOP:
153 return OPc_LOGOP;
154
a8a597b2 155 case OA_LISTOP:
156 return OPc_LISTOP;
157
158 case OA_PMOP:
159 return OPc_PMOP;
160
161 case OA_SVOP:
162 return OPc_SVOP;
163
7934575e 164 case OA_PADOP:
165 return OPc_PADOP;
a8a597b2 166
293d3ffa 167 case OA_PVOP_OR_SVOP:
168 /*
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).
174 */
175 return (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
176 ? OPc_SVOP : OPc_PVOP;
a8a597b2 177
178 case OA_LOOP:
179 return OPc_LOOP;
180
181 case OA_COP:
182 return OPc_COP;
183
184 case OA_BASEOP_OR_UNOP:
185 /*
186 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
45f6cd40 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.
a8a597b2 191 */
45f6cd40 192 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
a8a597b2 193
194 case OA_FILESTATOP:
195 /*
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
7934575e 202 * an SVOP (and op_sv is the GV for the filehandle argument).
a8a597b2 203 */
204 return ((o->op_flags & OPf_KIDS) ? OPc_UNOP :
93865851 205#ifdef USE_ITHREADS
206 (o->op_flags & OPf_REF) ? OPc_PADOP : OPc_BASEOP);
207#else
7934575e 208 (o->op_flags & OPf_REF) ? OPc_SVOP : OPc_BASEOP);
93865851 209#endif
a8a597b2 210 case OA_LOOPEXOP:
211 /*
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
218 * get set.
219 */
220 if (o->op_flags & OPf_STACKED)
221 return OPc_UNOP;
222 else if (o->op_flags & OPf_SPECIAL)
223 return OPc_BASEOP;
224 else
225 return OPc_PVOP;
226 }
227 warn("can't determine class of operator %s, assuming BASEOP\n",
22c35a8c 228 PL_op_name[o->op_type]);
a8a597b2 229 return OPc_BASEOP;
230}
231
232static char *
5d7488b2 233cc_opclassname(pTHX_ const OP *o)
a8a597b2 234{
27da23d5 235 return (char *)opclassnames[cc_opclass(aTHX_ o)];
a8a597b2 236}
237
238static SV *
cea2e8a9 239make_sv_object(pTHX_ SV *arg, SV *sv)
a8a597b2 240{
27da23d5 241 const char *type = 0;
a8a597b2 242 IV iv;
89ca4ac7 243 dMY_CXT;
a8a597b2 244
e8edd1e6 245 for (iv = 0; iv < sizeof(specialsv_list)/sizeof(SV*); iv++) {
246 if (sv == specialsv_list[iv]) {
a8a597b2 247 type = "B::SPECIAL";
248 break;
249 }
250 }
251 if (!type) {
252 type = svclassnames[SvTYPE(sv)];
56431972 253 iv = PTR2IV(sv);
a8a597b2 254 }
255 sv_setiv(newSVrv(arg, type), iv);
256 return arg;
257}
258
e412117e 259#if PERL_VERSION >= 9
a8a597b2 260static SV *
8e01d9a6 261make_temp_object(pTHX_ SV *arg, SV *temp)
262{
263 SV *target;
264 const char *const type = svclassnames[SvTYPE(temp)];
265 const IV iv = PTR2IV(temp);
266
267 target = newSVrv(arg, type);
268 sv_setiv(target, iv);
269
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
275 our reference. */
276 SvREFCNT_dec(temp);
277 return arg;
278}
279
280static SV *
5c3c3f81 281make_warnings_object(pTHX_ SV *arg, STRLEN *warnings)
282{
283 const char *type = 0;
284 dMY_CXT;
285 IV iv = sizeof(specialsv_list)/sizeof(SV*);
286
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 */
290
291 while (iv--) {
292 if ((SV*)warnings == specialsv_list[iv]) {
293 type = "B::SPECIAL";
294 break;
295 }
296 }
297 if (type) {
298 sv_setiv(newSVrv(arg, type), iv);
8e01d9a6 299 return arg;
5c3c3f81 300 } else {
301 /* B assumes that warnings are a regular SV. Seems easier to keep it
302 happy by making them into a regular SV. */
8e01d9a6 303 return make_temp_object(aTHX_ arg,
304 newSVpvn((char *)(warnings + 1), *warnings));
305 }
306}
307
308static SV *
309make_cop_io_object(pTHX_ SV *arg, COP *cop)
310{
8b850bd5 311 SV *const value = newSV(0);
312
33972ad6 313 Perl_emulate_cop_io(aTHX_ cop, value);
8b850bd5 314
315 if(SvOK(value)) {
8e01d9a6 316 return make_temp_object(aTHX_ arg, newSVsv(value));
317 } else {
8b850bd5 318 SvREFCNT_dec(value);
8e01d9a6 319 return make_sv_object(aTHX_ arg, NULL);
5c3c3f81 320 }
5c3c3f81 321}
e412117e 322#endif
5c3c3f81 323
324static SV *
cea2e8a9 325make_mg_object(pTHX_ SV *arg, MAGIC *mg)
a8a597b2 326{
56431972 327 sv_setiv(newSVrv(arg, "B::MAGIC"), PTR2IV(mg));
a8a597b2 328 return arg;
329}
330
331static SV *
52ad86de 332cstring(pTHX_ SV *sv, bool perlstyle)
a8a597b2 333{
79cb57f6 334 SV *sstr = newSVpvn("", 0);
a8a597b2 335
336 if (!SvOK(sv))
337 sv_setpvn(sstr, "0", 1);
5d7488b2 338 else if (perlstyle && SvUTF8(sv)) {
d79a7a3d 339 SV *tmpsv = sv_newmortal(); /* Temporary SV to feed sv_uni_display */
5d7488b2 340 const STRLEN len = SvCUR(sv);
341 const char *s = sv_uni_display(tmpsv, sv, 8*len, UNI_DISPLAY_QQ);
c69006e4 342 sv_setpvn(sstr,"\"",1);
d79a7a3d 343 while (*s)
344 {
345 if (*s == '"')
5d7488b2 346 sv_catpvn(sstr, "\\\"", 2);
d79a7a3d 347 else if (*s == '$')
5d7488b2 348 sv_catpvn(sstr, "\\$", 2);
d79a7a3d 349 else if (*s == '@')
5d7488b2 350 sv_catpvn(sstr, "\\@", 2);
d79a7a3d 351 else if (*s == '\\')
352 {
353 if (strchr("nrftax\\",*(s+1)))
354 sv_catpvn(sstr, s++, 2);
355 else
5d7488b2 356 sv_catpvn(sstr, "\\\\", 2);
d79a7a3d 357 }
358 else /* should always be printable */
359 sv_catpvn(sstr, s, 1);
360 ++s;
361 }
362 sv_catpv(sstr, "\"");
363 return sstr;
364 }
a8a597b2 365 else
366 {
367 /* XXX Optimise? */
5d7488b2 368 STRLEN len;
369 const char *s = SvPV(sv, len);
a8a597b2 370 sv_catpv(sstr, "\"");
371 for (; len; len--, s++)
372 {
373 /* At least try a little for readability */
374 if (*s == '"')
375 sv_catpv(sstr, "\\\"");
376 else if (*s == '\\')
377 sv_catpv(sstr, "\\\\");
b326da91 378 /* trigraphs - bleagh */
5d7488b2 379 else if (!perlstyle && *s == '?' && len>=3 && s[1] == '?') {
380 char escbuff[5]; /* to fit backslash, 3 octals + trailing \0 */
b326da91 381 sprintf(escbuff, "\\%03o", '?');
382 sv_catpv(sstr, escbuff);
383 }
52ad86de 384 else if (perlstyle && *s == '$')
385 sv_catpv(sstr, "\\$");
386 else if (perlstyle && *s == '@')
387 sv_catpv(sstr, "\\@");
ce561ef2 388#ifdef EBCDIC
389 else if (isPRINT(*s))
390#else
391 else if (*s >= ' ' && *s < 127)
392#endif /* EBCDIC */
a8a597b2 393 sv_catpvn(sstr, s, 1);
394 else if (*s == '\n')
395 sv_catpv(sstr, "\\n");
396 else if (*s == '\r')
397 sv_catpv(sstr, "\\r");
398 else if (*s == '\t')
399 sv_catpv(sstr, "\\t");
400 else if (*s == '\a')
401 sv_catpv(sstr, "\\a");
402 else if (*s == '\b')
403 sv_catpv(sstr, "\\b");
404 else if (*s == '\f')
405 sv_catpv(sstr, "\\f");
52ad86de 406 else if (!perlstyle && *s == '\v')
a8a597b2 407 sv_catpv(sstr, "\\v");
408 else
409 {
a8a597b2 410 /* Don't want promotion of a signed -1 char in sprintf args */
5d7488b2 411 char escbuff[5]; /* to fit backslash, 3 octals + trailing \0 */
412 const unsigned char c = (unsigned char) *s;
a8a597b2 413 sprintf(escbuff, "\\%03o", c);
414 sv_catpv(sstr, escbuff);
415 }
416 /* XXX Add line breaks if string is long */
417 }
418 sv_catpv(sstr, "\"");
419 }
420 return sstr;
421}
422
423static SV *
cea2e8a9 424cchar(pTHX_ SV *sv)
a8a597b2 425{
79cb57f6 426 SV *sstr = newSVpvn("'", 1);
5d7488b2 427 const char *s = SvPV_nolen(sv);
a8a597b2 428
429 if (*s == '\'')
5d7488b2 430 sv_catpvn(sstr, "\\'", 2);
a8a597b2 431 else if (*s == '\\')
5d7488b2 432 sv_catpvn(sstr, "\\\\", 2);
ce561ef2 433#ifdef EBCDIC
133b4094 434 else if (isPRINT(*s))
ce561ef2 435#else
436 else if (*s >= ' ' && *s < 127)
437#endif /* EBCDIC */
a8a597b2 438 sv_catpvn(sstr, s, 1);
439 else if (*s == '\n')
5d7488b2 440 sv_catpvn(sstr, "\\n", 2);
a8a597b2 441 else if (*s == '\r')
5d7488b2 442 sv_catpvn(sstr, "\\r", 2);
a8a597b2 443 else if (*s == '\t')
5d7488b2 444 sv_catpvn(sstr, "\\t", 2);
a8a597b2 445 else if (*s == '\a')
5d7488b2 446 sv_catpvn(sstr, "\\a", 2);
a8a597b2 447 else if (*s == '\b')
5d7488b2 448 sv_catpvn(sstr, "\\b", 2);
a8a597b2 449 else if (*s == '\f')
5d7488b2 450 sv_catpvn(sstr, "\\f", 2);
a8a597b2 451 else if (*s == '\v')
5d7488b2 452 sv_catpvn(sstr, "\\v", 2);
a8a597b2 453 else
454 {
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);
461 }
5d7488b2 462 sv_catpvn(sstr, "'", 1);
a8a597b2 463 return sstr;
464}
465
8f3d514b 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
469#else
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
474#endif
475
5d7488b2 476static void
477walkoptree(pTHX_ SV *opsv, const char *method)
a8a597b2 478{
479 dSP;
f3be9b72 480 OP *o, *kid;
89ca4ac7 481 dMY_CXT;
482
a8a597b2 483 if (!SvROK(opsv))
484 croak("opsv is not a reference");
485 opsv = sv_mortalcopy(opsv);
56431972 486 o = INT2PTR(OP*,SvIV((SV*)SvRV(opsv)));
a8a597b2 487 if (walkoptree_debug) {
488 PUSHMARK(sp);
489 XPUSHs(opsv);
490 PUTBACK;
491 perl_call_method("walkoptree_debug", G_DISCARD);
492 }
493 PUSHMARK(sp);
494 XPUSHs(opsv);
495 PUTBACK;
496 perl_call_method(method, G_DISCARD);
497 if (o && (o->op_flags & OPf_KIDS)) {
a8a597b2 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. */
56431972 500 sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ kid)), PTR2IV(kid));
cea2e8a9 501 walkoptree(aTHX_ opsv, method);
a8a597b2 502 }
503 }
5464c149 504 if (o && (cc_opclass(aTHX_ o) == OPc_PMOP) && o->op_type != OP_PUSHRE
8f3d514b 505 && (kid = PMOP_pmreplroot(cPMOPo)))
f3be9b72 506 {
5464c149 507 sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ kid)), PTR2IV(kid));
f3be9b72 508 walkoptree(aTHX_ opsv, method);
509 }
a8a597b2 510}
511
5d7488b2 512static SV **
1df34986 513oplist(pTHX_ OP *o, SV **SP)
514{
515 for(; o; o = o->op_next) {
516 SV *opsv;
7252851f 517#if PERL_VERSION >= 9
518 if (o->op_opt == 0)
1df34986 519 break;
2814eb74 520 o->op_opt = 0;
7252851f 521#else
522 if (o->op_seq == 0)
523 break;
524 o->op_seq = 0;
525#endif
1df34986 526 opsv = sv_newmortal();
527 sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ (OP*)o)), PTR2IV(o));
528 XPUSHs(opsv);
529 switch (o->op_type) {
530 case OP_SUBST:
8f3d514b 531 SP = oplist(aTHX_ PMOP_pmreplstart(cPMOPo), SP);
1df34986 532 continue;
533 case OP_SORT:
f66c782a 534 if (o->op_flags & OPf_STACKED && o->op_flags & OPf_SPECIAL) {
1df34986 535 OP *kid = cLISTOPo->op_first->op_sibling; /* pass pushmark */
536 kid = kUNOP->op_first; /* pass rv2gv */
537 kid = kUNOP->op_first; /* pass leave */
f66c782a 538 SP = oplist(aTHX_ kid->op_next, SP);
1df34986 539 }
540 continue;
541 }
542 switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
543 case OA_LOGOP:
544 SP = oplist(aTHX_ cLOGOPo->op_other, SP);
545 break;
546 case OA_LOOP:
547 SP = oplist(aTHX_ cLOOPo->op_lastop, SP);
548 SP = oplist(aTHX_ cLOOPo->op_nextop, SP);
549 SP = oplist(aTHX_ cLOOPo->op_redoop, SP);
550 break;
551 }
552 }
553 return SP;
554}
555
a8a597b2 556typedef OP *B__OP;
557typedef UNOP *B__UNOP;
558typedef BINOP *B__BINOP;
559typedef LOGOP *B__LOGOP;
a8a597b2 560typedef LISTOP *B__LISTOP;
561typedef PMOP *B__PMOP;
562typedef SVOP *B__SVOP;
7934575e 563typedef PADOP *B__PADOP;
a8a597b2 564typedef PVOP *B__PVOP;
565typedef LOOP *B__LOOP;
566typedef COP *B__COP;
567
568typedef SV *B__SV;
569typedef SV *B__IV;
570typedef SV *B__PV;
571typedef SV *B__NV;
572typedef SV *B__PVMG;
5c35adbb 573#if PERL_VERSION >= 11
574typedef SV *B__REGEXP;
575#endif
a8a597b2 576typedef SV *B__PVLV;
577typedef SV *B__BM;
578typedef SV *B__RV;
1df34986 579typedef SV *B__FM;
a8a597b2 580typedef AV *B__AV;
581typedef HV *B__HV;
582typedef CV *B__CV;
583typedef GV *B__GV;
584typedef IO *B__IO;
585
586typedef MAGIC *B__MAGIC;
fd9f6265 587typedef HE *B__HE;
e412117e 588#if PERL_VERSION >= 9
fd9f6265 589typedef struct refcounted_he *B__RHE;
e412117e 590#endif
a8a597b2 591
592MODULE = B PACKAGE = B PREFIX = B_
593
594PROTOTYPES: DISABLE
595
596BOOT:
4c1f658f 597{
da51bb9b 598 HV *stash = gv_stashpvn("B", 1, GV_ADD);
4c1f658f 599 AV *export_ok = perl_get_av("B::EXPORT_OK",TRUE);
89ca4ac7 600 MY_CXT_INIT;
e8edd1e6 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;
5c3c3f81 605 specialsv_list[4] = (SV *) pWARN_ALL;
606 specialsv_list[5] = (SV *) pWARN_NONE;
607 specialsv_list[6] = (SV *) pWARN_STD;
f5ba1307 608#if PERL_VERSION <= 8
e6663653 609# define OPpPAD_STATE 0
7252851f 610#endif
4c1f658f 611#include "defsubs.h"
612}
a8a597b2 613
3280af22 614#define B_main_cv() PL_main_cv
31d7d75a 615#define B_init_av() PL_initav
651aa52e 616#define B_inc_gv() PL_incgv
ece599bd 617#define B_check_av() PL_checkav_save
e6663653 618#if PERL_VERSION > 8
619# define B_unitcheck_av() PL_unitcheckav_save
620#else
621# define B_unitcheck_av() NULL
622#endif
059a8bb7 623#define B_begin_av() PL_beginav_save
624#define B_end_av() PL_endav
3280af22 625#define B_main_root() PL_main_root
626#define B_main_start() PL_main_start
56eca212 627#define B_amagic_generation() PL_amagic_generation
5ce57cc0 628#define B_sub_generation() PL_sub_generation
651aa52e 629#define B_defstash() PL_defstash
630#define B_curstash() PL_curstash
631#define B_dowarn() PL_dowarn
3280af22 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
1df34986 636#define B_formfeed() PL_formfeed
9d2bbe64 637#ifdef USE_ITHREADS
638#define B_regex_padav() PL_regex_padav
639#endif
a8a597b2 640
31d7d75a 641B::AV
642B_init_av()
643
059a8bb7 644B::AV
ece599bd 645B_check_av()
646
e412117e 647#if PERL_VERSION >= 9
648
ece599bd 649B::AV
676456c2 650B_unitcheck_av()
651
e412117e 652#endif
653
676456c2 654B::AV
059a8bb7 655B_begin_av()
656
657B::AV
658B_end_av()
659
651aa52e 660B::GV
661B_inc_gv()
662
9d2bbe64 663#ifdef USE_ITHREADS
664
665B::AV
666B_regex_padav()
667
668#endif
669
a8a597b2 670B::CV
671B_main_cv()
672
673B::OP
674B_main_root()
675
676B::OP
677B_main_start()
678
56eca212 679long
680B_amagic_generation()
681
5ce57cc0 682long
683B_sub_generation()
684
a8a597b2 685B::AV
686B_comppadlist()
687
688B::SV
689B_sv_undef()
690
691B::SV
692B_sv_yes()
693
694B::SV
695B_sv_no()
696
651aa52e 697B::HV
698B_curstash()
699
700B::HV
701B_defstash()
a8a597b2 702
651aa52e 703U8
704B_dowarn()
705
1df34986 706B::SV
707B_formfeed()
708
651aa52e 709void
710B_warnhook()
711 CODE:
712 ST(0) = make_sv_object(aTHX_ sv_newmortal(), PL_warnhook);
713
714void
715B_diehook()
716 CODE:
717 ST(0) = make_sv_object(aTHX_ sv_newmortal(), PL_diehook);
718
719MODULE = B PACKAGE = B
a8a597b2 720
721void
722walkoptree(opsv, method)
723 SV * opsv
5d7488b2 724 const char * method
cea2e8a9 725 CODE:
726 walkoptree(aTHX_ opsv, method);
a8a597b2 727
728int
729walkoptree_debug(...)
730 CODE:
89ca4ac7 731 dMY_CXT;
a8a597b2 732 RETVAL = walkoptree_debug;
733 if (items > 0 && SvTRUE(ST(1)))
734 walkoptree_debug = 1;
735 OUTPUT:
736 RETVAL
737
56431972 738#define address(sv) PTR2IV(sv)
a8a597b2 739
740IV
741address(sv)
742 SV * sv
743
744B::SV
745svref_2object(sv)
746 SV * sv
747 CODE:
748 if (!SvROK(sv))
749 croak("argument is not a reference");
750 RETVAL = (SV*)SvRV(sv);
751 OUTPUT:
0cc1d052 752 RETVAL
753
754void
755opnumber(name)
5d7488b2 756const char * name
0cc1d052 757CODE:
758{
759 int i;
760 IV result = -1;
761 ST(0) = sv_newmortal();
762 if (strncmp(name,"pp_",3) == 0)
763 name += 3;
764 for (i = 0; i < PL_maxo; i++)
765 {
766 if (strcmp(name, PL_op_name[i]) == 0)
767 {
768 result = i;
769 break;
770 }
771 }
772 sv_setiv(ST(0),result);
773}
a8a597b2 774
775void
776ppname(opnum)
777 int opnum
778 CODE:
779 ST(0) = sv_newmortal();
3280af22 780 if (opnum >= 0 && opnum < PL_maxo) {
a8a597b2 781 sv_setpvn(ST(0), "pp_", 3);
22c35a8c 782 sv_catpv(ST(0), PL_op_name[opnum]);
a8a597b2 783 }
784
785void
786hash(sv)
787 SV * sv
788 CODE:
a8a597b2 789 STRLEN len;
790 U32 hash = 0;
faccc32b 791 char hexhash[19]; /* must fit "0xffffffffffffffff" plus trailing \0 */
5d7488b2 792 const char *s = SvPV(sv, len);
c32d3395 793 PERL_HASH(hash, s, len);
faccc32b 794 sprintf(hexhash, "0x%"UVxf, (UV)hash);
a8a597b2 795 ST(0) = sv_2mortal(newSVpv(hexhash, 0));
796
797#define cast_I32(foo) (I32)foo
798IV
799cast_I32(i)
800 IV i
801
802void
803minus_c()
804 CODE:
3280af22 805 PL_minus_c = TRUE;
a8a597b2 806
059a8bb7 807void
808save_BEGINs()
809 CODE:
aefff11f 810 PL_savebegin = TRUE;
059a8bb7 811
a8a597b2 812SV *
813cstring(sv)
814 SV * sv
cea2e8a9 815 CODE:
52ad86de 816 RETVAL = cstring(aTHX_ sv, 0);
817 OUTPUT:
818 RETVAL
819
820SV *
821perlstring(sv)
822 SV * sv
823 CODE:
824 RETVAL = cstring(aTHX_ sv, 1);
cea2e8a9 825 OUTPUT:
826 RETVAL
a8a597b2 827
828SV *
829cchar(sv)
830 SV * sv
cea2e8a9 831 CODE:
832 RETVAL = cchar(aTHX_ sv);
833 OUTPUT:
834 RETVAL
a8a597b2 835
836void
837threadsv_names()
838 PPCODE:
f5ba1307 839#if PERL_VERSION <= 8
840# ifdef USE_5005THREADS
841 int i;
5d7488b2 842 const STRLEN len = strlen(PL_threadsv_names);
f5ba1307 843
844 EXTEND(sp, len);
845 for (i = 0; i < len; i++)
846 PUSHs(sv_2mortal(newSVpvn(&PL_threadsv_names[i], 1)));
847# endif
848#endif
a8a597b2 849
850#define OP_next(o) o->op_next
851#define OP_sibling(o) o->op_sibling
27da23d5 852#define OP_desc(o) (char *)PL_op_desc[o->op_type]
a8a597b2 853#define OP_targ(o) o->op_targ
854#define OP_type(o) o->op_type
7252851f 855#if PERL_VERSION >= 9
856# define OP_opt(o) o->op_opt
7252851f 857#else
858# define OP_seq(o) o->op_seq
859#endif
a8a597b2 860#define OP_flags(o) o->op_flags
861#define OP_private(o) o->op_private
a60ba18b 862#define OP_spare(o) o->op_spare
a8a597b2 863
864MODULE = B PACKAGE = B::OP PREFIX = OP_
865
651aa52e 866size_t
867OP_size(o)
868 B::OP o
869 CODE:
870 RETVAL = opsizes[cc_opclass(aTHX_ o)];
871 OUTPUT:
872 RETVAL
873
a8a597b2 874B::OP
875OP_next(o)
876 B::OP o
877
878B::OP
879OP_sibling(o)
880 B::OP o
881
882char *
3f872cb9 883OP_name(o)
884 B::OP o
885 CODE:
27da23d5 886 RETVAL = (char *)PL_op_name[o->op_type];
8063af02 887 OUTPUT:
888 RETVAL
3f872cb9 889
890
8063af02 891void
a8a597b2 892OP_ppaddr(o)
893 B::OP o
dc333d64 894 PREINIT:
895 int i;
896 SV *sv = sv_newmortal();
a8a597b2 897 CODE:
dc333d64 898 sv_setpvn(sv, "PL_ppaddr[OP_", 13);
899 sv_catpv(sv, PL_op_name[o->op_type]);
7c436af3 900 for (i=13; (STRLEN)i < SvCUR(sv); ++i)
dc333d64 901 SvPVX(sv)[i] = toUPPER(SvPVX(sv)[i]);
902 sv_catpv(sv, "]");
903 ST(0) = sv;
a8a597b2 904
905char *
906OP_desc(o)
907 B::OP o
908
7934575e 909PADOFFSET
a8a597b2 910OP_targ(o)
911 B::OP o
912
913U16
914OP_type(o)
915 B::OP o
916
7252851f 917#if PERL_VERSION >= 9
918
0053d415 919U16
2814eb74 920OP_opt(o)
921 B::OP o
922
7252851f 923#else
924
925U16
926OP_seq(o)
927 B::OP o
928
929#endif
930
a8a597b2 931U8
932OP_flags(o)
933 B::OP o
934
935U8
936OP_private(o)
937 B::OP o
938
7252851f 939#if PERL_VERSION >= 9
940
0053d415 941U16
a60ba18b 942OP_spare(o)
943 B::OP o
944
7252851f 945#endif
946
1df34986 947void
948OP_oplist(o)
949 B::OP o
950 PPCODE:
951 SP = oplist(aTHX_ o, SP);
952
a8a597b2 953#define UNOP_first(o) o->op_first
954
955MODULE = B PACKAGE = B::UNOP PREFIX = UNOP_
956
957B::OP
958UNOP_first(o)
959 B::UNOP o
960
961#define BINOP_last(o) o->op_last
962
963MODULE = B PACKAGE = B::BINOP PREFIX = BINOP_
964
965B::OP
966BINOP_last(o)
967 B::BINOP o
968
969#define LOGOP_other(o) o->op_other
970
971MODULE = B PACKAGE = B::LOGOP PREFIX = LOGOP_
972
973B::OP
974LOGOP_other(o)
975 B::LOGOP o
976
a8a597b2 977MODULE = B PACKAGE = B::LISTOP PREFIX = LISTOP_
978
c03c2844 979U32
980LISTOP_children(o)
981 B::LISTOP o
982 OP * kid = NO_INIT
983 int i = NO_INIT
984 CODE:
c03c2844 985 i = 0;
986 for (kid = o->op_first; kid; kid = kid->op_sibling)
987 i++;
8063af02 988 RETVAL = i;
989 OUTPUT:
990 RETVAL
c03c2844 991
a8a597b2 992#define PMOP_pmnext(o) o->op_pmnext
aaa362c4 993#define PMOP_pmregexp(o) PM_GETRE(o)
9d2bbe64 994#ifdef USE_ITHREADS
995#define PMOP_pmoffset(o) o->op_pmoffset
29f2e912 996#define PMOP_pmstashpv(o) PmopSTASHPV(o);
651aa52e 997#else
29f2e912 998#define PMOP_pmstash(o) PmopSTASH(o);
9d2bbe64 999#endif
a8a597b2 1000#define PMOP_pmflags(o) o->op_pmflags
a8a597b2 1001
1002MODULE = B PACKAGE = B::PMOP PREFIX = PMOP_
1003
20e98b0f 1004#if PERL_VERSION <= 8
1005
a8a597b2 1006void
1007PMOP_pmreplroot(o)
1008 B::PMOP o
1009 OP * root = NO_INIT
1010 CODE:
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) {
20e98b0f 1015# ifdef USE_ITHREADS
9d2bbe64 1016 sv_setiv(ST(0), INT2PTR(PADOFFSET,root) );
20e98b0f 1017# else
a8a597b2 1018 sv_setiv(newSVrv(ST(0), root ?
1019 svclassnames[SvTYPE((SV*)root)] : "B::SV"),
56431972 1020 PTR2IV(root));
20e98b0f 1021# endif
a8a597b2 1022 }
1023 else {
56431972 1024 sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), PTR2IV(root));
a8a597b2 1025 }
1026
20e98b0f 1027#else
1028
1029void
1030PMOP_pmreplroot(o)
1031 B::PMOP o
1032 CODE:
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);
1037# else
1038 GV *const target = o->op_pmreplrootu.op_pmtargetgv;
1039 sv_setiv(newSVrv(ST(0), target ?
1040 svclassnames[SvTYPE((SV*)target)] : "B::SV"),
1041 PTR2IV(target));
1042# endif
1043 }
1044 else {
1045 OP *const root = o->op_pmreplrootu.op_pmreplroot;
1046 sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)),
1047 PTR2IV(root));
1048 }
1049
1050#endif
1051
a8a597b2 1052B::OP
1053PMOP_pmreplstart(o)
1054 B::PMOP o
1055
c2b1997a 1056#if PERL_VERSION < 9
1057
a8a597b2 1058B::PMOP
1059PMOP_pmnext(o)
1060 B::PMOP o
1061
c2b1997a 1062#endif
1063
9d2bbe64 1064#ifdef USE_ITHREADS
1065
1066IV
1067PMOP_pmoffset(o)
1068 B::PMOP o
1069
651aa52e 1070char*
1071PMOP_pmstashpv(o)
1072 B::PMOP o
1073
1074#else
1075
1076B::HV
1077PMOP_pmstash(o)
1078 B::PMOP o
1079
9d2bbe64 1080#endif
1081
6e21dc91 1082U32
a8a597b2 1083PMOP_pmflags(o)
1084 B::PMOP o
1085
7c1f70cb 1086#if PERL_VERSION < 9
1087
1088U32
1089PMOP_pmpermflags(o)
1090 B::PMOP o
1091
1092U8
1093PMOP_pmdynflags(o)
1094 B::PMOP o
1095
1096#endif
1097
a8a597b2 1098void
1099PMOP_precomp(o)
1100 B::PMOP o
1101 REGEXP * rx = NO_INIT
1102 CODE:
1103 ST(0) = sv_newmortal();
aaa362c4 1104 rx = PM_GETRE(o);
a8a597b2 1105 if (rx)
220fc49f 1106 sv_setpvn(ST(0), RX_PRECOMP(rx), RX_PRELEN(rx));
a8a597b2 1107
7c1f70cb 1108#if PERL_VERSION >= 9
1109
c737faaf 1110void
1111PMOP_reflags(o)
1112 B::PMOP o
1113 REGEXP * rx = NO_INIT
1114 CODE:
1115 ST(0) = sv_newmortal();
1116 rx = PM_GETRE(o);
1117 if (rx)
07bc277f 1118 sv_setuv(ST(0), RX_EXTFLAGS(rx));
c737faaf 1119
7c1f70cb 1120#endif
1121
ac33dcd1 1122#define SVOP_sv(o) cSVOPo->op_sv
1123#define SVOP_gv(o) ((GV*)cSVOPo->op_sv)
a8a597b2 1124
1125MODULE = B PACKAGE = B::SVOP PREFIX = SVOP_
1126
a8a597b2 1127B::SV
1128SVOP_sv(o)
1129 B::SVOP o
1130
f22444f5 1131B::GV
065a1863 1132SVOP_gv(o)
1133 B::SVOP o
1134
7934575e 1135#define PADOP_padix(o) o->op_padix
dd2155a4 1136#define PADOP_sv(o) (o->op_padix ? PAD_SVl(o->op_padix) : Nullsv)
7934575e 1137#define PADOP_gv(o) ((o->op_padix \
dd2155a4 1138 && SvTYPE(PAD_SVl(o->op_padix)) == SVt_PVGV) \
3ae1b226 1139 ? (GV*)PAD_SVl(o->op_padix) : (GV *)NULL)
a8a597b2 1140
7934575e 1141MODULE = B PACKAGE = B::PADOP PREFIX = PADOP_
1142
1143PADOFFSET
1144PADOP_padix(o)
1145 B::PADOP o
1146
1147B::SV
1148PADOP_sv(o)
1149 B::PADOP o
a8a597b2 1150
1151B::GV
7934575e 1152PADOP_gv(o)
1153 B::PADOP o
a8a597b2 1154
1155MODULE = B PACKAGE = B::PVOP PREFIX = PVOP_
1156
1157void
1158PVOP_pv(o)
1159 B::PVOP o
1160 CODE:
1161 /*
bec89253 1162 * OP_TRANS uses op_pv to point to a table of 256 or >=258 shorts
a8a597b2 1163 * whereas other PVOPs point to a null terminated string.
1164 */
bec89253 1165 if (o->op_type == OP_TRANS &&
1166 (o->op_private & OPpTRANS_COMPLEMENT) &&
1167 !(o->op_private & OPpTRANS_DELETE))
1168 {
5d7488b2 1169 const short* const tbl = (short*)o->op_pv;
1170 const short entries = 257 + tbl[256];
bec89253 1171 ST(0) = sv_2mortal(newSVpv(o->op_pv, entries * sizeof(short)));
1172 }
1173 else if (o->op_type == OP_TRANS) {
1174 ST(0) = sv_2mortal(newSVpv(o->op_pv, 256 * sizeof(short)));
1175 }
1176 else
1177 ST(0) = sv_2mortal(newSVpv(o->op_pv, 0));
a8a597b2 1178
1179#define LOOP_redoop(o) o->op_redoop
1180#define LOOP_nextop(o) o->op_nextop
1181#define LOOP_lastop(o) o->op_lastop
1182
1183MODULE = B PACKAGE = B::LOOP PREFIX = LOOP_
1184
1185
1186B::OP
1187LOOP_redoop(o)
1188 B::LOOP o
1189
1190B::OP
1191LOOP_nextop(o)
1192 B::LOOP o
1193
1194B::OP
1195LOOP_lastop(o)
1196 B::LOOP o
1197
4b65a919 1198#define COP_label(o) CopLABEL(o)
11faa288 1199#define COP_stashpv(o) CopSTASHPV(o)
1200#define COP_stash(o) CopSTASH(o)
57843af0 1201#define COP_file(o) CopFILE(o)
1df34986 1202#define COP_filegv(o) CopFILEGV(o)
a8a597b2 1203#define COP_cop_seq(o) o->cop_seq
fc15ae8f 1204#define COP_arybase(o) CopARYBASE_get(o)
57843af0 1205#define COP_line(o) CopLINE(o)
d5ec2987 1206#define COP_hints(o) CopHINTS_get(o)
e412117e 1207#if PERL_VERSION < 9
1208# define COP_warnings(o) o->cop_warnings
1209# define COP_io(o) o->cop_io
1210#endif
a8a597b2 1211
1212MODULE = B PACKAGE = B::COP PREFIX = COP_
1213
1214char *
1215COP_label(o)
1216 B::COP o
1217
11faa288 1218char *
1219COP_stashpv(o)
1220 B::COP o
1221
a8a597b2 1222B::HV
1223COP_stash(o)
1224 B::COP o
1225
57843af0 1226char *
1227COP_file(o)
a8a597b2 1228 B::COP o
1229
1df34986 1230B::GV
1231COP_filegv(o)
1232 B::COP o
1233
1234
a8a597b2 1235U32
1236COP_cop_seq(o)
1237 B::COP o
1238
1239I32
1240COP_arybase(o)
1241 B::COP o
1242
8bafa735 1243U32
a8a597b2 1244COP_line(o)
1245 B::COP o
1246
e412117e 1247#if PERL_VERSION >= 9
1248
5c3c3f81 1249void
b295d113 1250COP_warnings(o)
1251 B::COP o
5c3c3f81 1252 PPCODE:
1253 ST(0) = make_warnings_object(aTHX_ sv_newmortal(), o->cop_warnings);
1254 XSRETURN(1);
b295d113 1255
670f1322 1256void
6e6a1aef 1257COP_io(o)
1258 B::COP o
11bcd5da 1259 PPCODE:
8e01d9a6 1260 ST(0) = make_cop_io_object(aTHX_ sv_newmortal(), o);
11bcd5da 1261 XSRETURN(1);
6e6a1aef 1262
fd9f6265 1263B::RHE
1264COP_hints_hash(o)
1265 B::COP o
1266 CODE:
1267 RETVAL = o->cop_hints_hash;
1268 OUTPUT:
1269 RETVAL
1270
e412117e 1271#else
1272
1273B::SV
1274COP_warnings(o)
1275 B::COP o
1276
1277B::SV
1278COP_io(o)
1279 B::COP o
1280
1281#endif
1282
1283U32
1284COP_hints(o)
1285 B::COP o
1286
651aa52e 1287MODULE = B PACKAGE = B::SV
1288
1289U32
1290SvTYPE(sv)
1291 B::SV sv
1292
429a5ce7 1293#define object_2svref(sv) sv
1294#define SVREF SV *
1295
1296SVREF
1297object_2svref(sv)
1298 B::SV sv
1299
a8a597b2 1300MODULE = B PACKAGE = B::SV PREFIX = Sv
1301
1302U32
1303SvREFCNT(sv)
1304 B::SV sv
1305
1306U32
1307SvFLAGS(sv)
1308 B::SV sv
1309
651aa52e 1310U32
1311SvPOK(sv)
1312 B::SV sv
1313
1314U32
1315SvROK(sv)
1316 B::SV sv
1317
1318U32
1319SvMAGICAL(sv)
1320 B::SV sv
1321
a8a597b2 1322MODULE = B PACKAGE = B::IV PREFIX = Sv
1323
1324IV
1325SvIV(sv)
1326 B::IV sv
1327
1328IV
1329SvIVX(sv)
1330 B::IV sv
1331
0ca04487 1332UV
1333SvUVX(sv)
1334 B::IV sv
1335
1336
a8a597b2 1337MODULE = B PACKAGE = B::IV
1338
1339#define needs64bits(sv) ((I32)SvIVX(sv) != SvIVX(sv))
1340
1341int
1342needs64bits(sv)
1343 B::IV sv
1344
1345void
1346packiv(sv)
1347 B::IV sv
1348 CODE:
1349 if (sizeof(IV) == 8) {
1350 U32 wp[2];
5d7488b2 1351 const IV iv = SvIVX(sv);
a8a597b2 1352 /*
1353 * The following way of spelling 32 is to stop compilers on
1354 * 32-bit architectures from moaning about the shift count
1355 * being >= the width of the type. Such architectures don't
1356 * reach this code anyway (unless sizeof(IV) > 8 but then
1357 * everything else breaks too so I'm not fussed at the moment).
1358 */
42718184 1359#ifdef UV_IS_QUAD
1360 wp[0] = htonl(((UV)iv) >> (sizeof(UV)*4));
1361#else
1362 wp[0] = htonl(((U32)iv) >> (sizeof(UV)*4));
1363#endif
a8a597b2 1364 wp[1] = htonl(iv & 0xffffffff);
79cb57f6 1365 ST(0) = sv_2mortal(newSVpvn((char *)wp, 8));
a8a597b2 1366 } else {
1367 U32 w = htonl((U32)SvIVX(sv));
79cb57f6 1368 ST(0) = sv_2mortal(newSVpvn((char *)&w, 4));
a8a597b2 1369 }
1370
4df7f6af 1371
1372#if PERL_VERSION >= 11
1373
1374B::SV
1375RV(sv)
1376 B::IV sv
1377 CODE:
1378 if( SvROK(sv) ) {
1379 RETVAL = SvRV(sv);
1380 }
1381 else {
1382 croak( "argument is not SvROK" );
1383 }
1384 OUTPUT:
1385 RETVAL
1386
1387#endif
1388
a8a597b2 1389MODULE = B PACKAGE = B::NV PREFIX = Sv
1390
76ef7183 1391NV
a8a597b2 1392SvNV(sv)
1393 B::NV sv
1394
76ef7183 1395NV
a8a597b2 1396SvNVX(sv)
1397 B::NV sv
1398
809abb02 1399U32
1400COP_SEQ_RANGE_LOW(sv)
1401 B::NV sv
1402
1403U32
1404COP_SEQ_RANGE_HIGH(sv)
1405 B::NV sv
1406
1407U32
1408PARENT_PAD_INDEX(sv)
1409 B::NV sv
1410
1411U32
1412PARENT_FAKELEX_FLAGS(sv)
1413 B::NV sv
1414
4df7f6af 1415#if PERL_VERSION < 11
1416
a8a597b2 1417MODULE = B PACKAGE = B::RV PREFIX = Sv
1418
1419B::SV
1420SvRV(sv)
1421 B::RV sv
1422
4df7f6af 1423#endif
1424
a8a597b2 1425MODULE = B PACKAGE = B::PV PREFIX = Sv
1426
0b40bd6d 1427char*
1428SvPVX(sv)
1429 B::PV sv
1430
b326da91 1431B::SV
1432SvRV(sv)
1433 B::PV sv
1434 CODE:
1435 if( SvROK(sv) ) {
1436 RETVAL = SvRV(sv);
1437 }
1438 else {
1439 croak( "argument is not SvROK" );
1440 }
1441 OUTPUT:
1442 RETVAL
1443
a8a597b2 1444void
1445SvPV(sv)
1446 B::PV sv
1447 CODE:
b326da91 1448 ST(0) = sv_newmortal();
c0b20461 1449 if( SvPOK(sv) ) {
b55685ae 1450 /* FIXME - we need a better way for B to identify PVs that are
1451 in the pads as variable names. */
1452 if((SvLEN(sv) && SvCUR(sv) >= SvLEN(sv))) {
1453 /* It claims to be longer than the space allocated for it -
1454 presuambly it's a variable name in the pad */
1455 sv_setpv(ST(0), SvPV_nolen_const(sv));
1456 } else {
1457 sv_setpvn(ST(0), SvPVX_const(sv), SvCUR(sv));
1458 }
b326da91 1459 SvFLAGS(ST(0)) |= SvUTF8(sv);
1460 }
1461 else {
1462 /* XXX for backward compatibility, but should fail */
1463 /* croak( "argument is not SvPOK" ); */
1464 sv_setpvn(ST(0), NULL, 0);
1465 }
a8a597b2 1466
5a44e503 1467# This used to read 257. I think that that was buggy - should have been 258.
1468# (The "\0", the flags byte, and 256 for the table. Not that anything
1469# anywhere calls this method. NWC.
651aa52e 1470void
1471SvPVBM(sv)
1472 B::PV sv
1473 CODE:
1474 ST(0) = sv_newmortal();
aa07b2f6 1475 sv_setpvn(ST(0), SvPVX_const(sv),
5a44e503 1476 SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0));
651aa52e 1477
1478
445a12f6 1479STRLEN
1480SvLEN(sv)
1481 B::PV sv
1482
1483STRLEN
1484SvCUR(sv)
1485 B::PV sv
1486
a8a597b2 1487MODULE = B PACKAGE = B::PVMG PREFIX = Sv
1488
1489void
1490SvMAGIC(sv)
1491 B::PVMG sv
1492 MAGIC * mg = NO_INIT
1493 PPCODE:
1494 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic)
cea2e8a9 1495 XPUSHs(make_mg_object(aTHX_ sv_newmortal(), mg));
a8a597b2 1496
1497MODULE = B PACKAGE = B::PVMG
1498
1499B::HV
1500SvSTASH(sv)
1501 B::PVMG sv
1502
5c35adbb 1503MODULE = B PACKAGE = B::REGEXP
1504
1505#if PERL_VERSION >= 11
1506
1507IV
1508REGEX(sv)
07bc277f 1509 B::REGEXP sv
5c35adbb 1510 CODE:
288b8c02 1511 /* FIXME - can we code this method more efficiently? */
1512 RETVAL = PTR2IV(sv);
5c35adbb 1513 OUTPUT:
1514 RETVAL
1515
1516SV*
1517precomp(sv)
07bc277f 1518 B::REGEXP sv
5c35adbb 1519 CODE:
288b8c02 1520 RETVAL = newSVpvn( RX_PRECOMP(sv), RX_PRELEN(sv) );
5c35adbb 1521 OUTPUT:
1522 RETVAL
1523
1524#endif
1525
a8a597b2 1526#define MgMOREMAGIC(mg) mg->mg_moremagic
1527#define MgPRIVATE(mg) mg->mg_private
1528#define MgTYPE(mg) mg->mg_type
1529#define MgFLAGS(mg) mg->mg_flags
1530#define MgOBJ(mg) mg->mg_obj
88b39979 1531#define MgLENGTH(mg) mg->mg_len
bde7177d 1532#define MgREGEX(mg) PTR2IV(mg->mg_obj)
a8a597b2 1533
1534MODULE = B PACKAGE = B::MAGIC PREFIX = Mg
1535
1536B::MAGIC
1537MgMOREMAGIC(mg)
1538 B::MAGIC mg
c5f0f3aa 1539 CODE:
1540 if( MgMOREMAGIC(mg) ) {
1541 RETVAL = MgMOREMAGIC(mg);
1542 }
1543 else {
1544 XSRETURN_UNDEF;
1545 }
1546 OUTPUT:
1547 RETVAL
a8a597b2 1548
1549U16
1550MgPRIVATE(mg)
1551 B::MAGIC mg
1552
1553char
1554MgTYPE(mg)
1555 B::MAGIC mg
1556
1557U8
1558MgFLAGS(mg)
1559 B::MAGIC mg
1560
1561B::SV
1562MgOBJ(mg)
1563 B::MAGIC mg
b326da91 1564
9d2bbe64 1565IV
1566MgREGEX(mg)
1567 B::MAGIC mg
1568 CODE:
a8248b05 1569 if(mg->mg_type == PERL_MAGIC_qr) {
9d2bbe64 1570 RETVAL = MgREGEX(mg);
1571 }
1572 else {
1573 croak( "REGEX is only meaningful on r-magic" );
1574 }
1575 OUTPUT:
1576 RETVAL
1577
b326da91 1578SV*
1579precomp(mg)
1580 B::MAGIC mg
1581 CODE:
a8248b05 1582 if (mg->mg_type == PERL_MAGIC_qr) {
b326da91 1583 REGEXP* rx = (REGEXP*)mg->mg_obj;
ef35129c 1584 RETVAL = Nullsv;
b326da91 1585 if( rx )
220fc49f 1586 RETVAL = newSVpvn( RX_PRECOMP(rx), RX_PRELEN(rx) );
b326da91 1587 }
1588 else {
1589 croak( "precomp is only meaningful on r-magic" );
1590 }
1591 OUTPUT:
1592 RETVAL
a8a597b2 1593
88b39979 1594I32
1595MgLENGTH(mg)
1596 B::MAGIC mg
1597
a8a597b2 1598void
1599MgPTR(mg)
1600 B::MAGIC mg
1601 CODE:
1602 ST(0) = sv_newmortal();
88b39979 1603 if (mg->mg_ptr){
1604 if (mg->mg_len >= 0){
1605 sv_setpvn(ST(0), mg->mg_ptr, mg->mg_len);
651aa52e 1606 } else if (mg->mg_len == HEf_SVKEY) {
1607 ST(0) = make_sv_object(aTHX_
1608 sv_newmortal(), (SV*)mg->mg_ptr);
88b39979 1609 }
1610 }
a8a597b2 1611
1612MODULE = B PACKAGE = B::PVLV PREFIX = Lv
1613
1614U32
1615LvTARGOFF(sv)
1616 B::PVLV sv
1617
1618U32
1619LvTARGLEN(sv)
1620 B::PVLV sv
1621
1622char
1623LvTYPE(sv)
1624 B::PVLV sv
1625
1626B::SV
1627LvTARG(sv)
1628 B::PVLV sv
1629
1630MODULE = B PACKAGE = B::BM PREFIX = Bm
1631
1632I32
1633BmUSEFUL(sv)
1634 B::BM sv
1635
85c508c3 1636U32
a8a597b2 1637BmPREVIOUS(sv)
1638 B::BM sv
1639
1640U8
1641BmRARE(sv)
1642 B::BM sv
1643
1644void
1645BmTABLE(sv)
1646 B::BM sv
1647 STRLEN len = NO_INIT
1648 char * str = NO_INIT
1649 CODE:
1650 str = SvPV(sv, len);
1651 /* Boyer-Moore table is just after string and its safety-margin \0 */
5a44e503 1652 ST(0) = sv_2mortal(newSVpvn(str + len + PERL_FBM_TABLE_OFFSET, 256));
a8a597b2 1653
1654MODULE = B PACKAGE = B::GV PREFIX = Gv
1655
1656void
1657GvNAME(gv)
1658 B::GV gv
1659 CODE:
79cb57f6 1660 ST(0) = sv_2mortal(newSVpvn(GvNAME(gv), GvNAMELEN(gv)));
a8a597b2 1661
87d7fd28 1662bool
1663is_empty(gv)
1664 B::GV gv
1665 CODE:
1666 RETVAL = GvGP(gv) == Null(GP*);
1667 OUTPUT:
1668 RETVAL
1669
50786ba8 1670bool
1671isGV_with_GP(gv)
1672 B::GV gv
1673 CODE:
1674#if PERL_VERSION >= 9
1675 RETVAL = isGV_with_GP(gv) ? TRUE : FALSE;
1676#else
1677 RETVAL = TRUE; /* In 5.8 and earlier they all are. */
1678#endif
1679 OUTPUT:
1680 RETVAL
1681
651aa52e 1682void*
1683GvGP(gv)
1684 B::GV gv
1685
a8a597b2 1686B::HV
1687GvSTASH(gv)
1688 B::GV gv
1689
1690B::SV
1691GvSV(gv)
1692 B::GV gv
1693
1694B::IO
1695GvIO(gv)
1696 B::GV gv
1697
1df34986 1698B::FM
a8a597b2 1699GvFORM(gv)
1700 B::GV gv
1df34986 1701 CODE:
1702 RETVAL = (SV*)GvFORM(gv);
1703 OUTPUT:
1704 RETVAL
a8a597b2 1705
1706B::AV
1707GvAV(gv)
1708 B::GV gv
1709
1710B::HV
1711GvHV(gv)
1712 B::GV gv
1713
1714B::GV
1715GvEGV(gv)
1716 B::GV gv
1717
1718B::CV
1719GvCV(gv)
1720 B::GV gv
1721
1722U32
1723GvCVGEN(gv)
1724 B::GV gv
1725
8bafa735 1726U32
a8a597b2 1727GvLINE(gv)
1728 B::GV gv
1729
b195d487 1730char *
1731GvFILE(gv)
1732 B::GV gv
1733
a8a597b2 1734B::GV
1735GvFILEGV(gv)
1736 B::GV gv
1737
1738MODULE = B PACKAGE = B::GV
1739
1740U32
1741GvREFCNT(gv)
1742 B::GV gv
1743
1744U8
1745GvFLAGS(gv)
1746 B::GV gv
1747
1748MODULE = B PACKAGE = B::IO PREFIX = Io
1749
1750long
1751IoLINES(io)
1752 B::IO io
1753
1754long
1755IoPAGE(io)
1756 B::IO io
1757
1758long
1759IoPAGE_LEN(io)
1760 B::IO io
1761
1762long
1763IoLINES_LEFT(io)
1764 B::IO io
1765
1766char *
1767IoTOP_NAME(io)
1768 B::IO io
1769
1770B::GV
1771IoTOP_GV(io)
1772 B::IO io
1773
1774char *
1775IoFMT_NAME(io)
1776 B::IO io
1777
1778B::GV
1779IoFMT_GV(io)
1780 B::IO io
1781
1782char *
1783IoBOTTOM_NAME(io)
1784 B::IO io
1785
1786B::GV
1787IoBOTTOM_GV(io)
1788 B::IO io
1789
04071355 1790#if PERL_VERSION <= 8
1791
a8a597b2 1792short
1793IoSUBPROCESS(io)
1794 B::IO io
1795
04071355 1796#endif
1797
b326da91 1798bool
1799IsSTD(io,name)
1800 B::IO io
5d7488b2 1801 const char* name
b326da91 1802 PREINIT:
1803 PerlIO* handle = 0;
1804 CODE:
1805 if( strEQ( name, "stdin" ) ) {
1806 handle = PerlIO_stdin();
1807 }
1808 else if( strEQ( name, "stdout" ) ) {
1809 handle = PerlIO_stdout();
1810 }
1811 else if( strEQ( name, "stderr" ) ) {
1812 handle = PerlIO_stderr();
1813 }
1814 else {
1815 croak( "Invalid value '%s'", name );
1816 }
1817 RETVAL = handle == IoIFP(io);
1818 OUTPUT:
1819 RETVAL
1820
a8a597b2 1821MODULE = B PACKAGE = B::IO
1822
1823char
1824IoTYPE(io)
1825 B::IO io
1826
1827U8
1828IoFLAGS(io)
1829 B::IO io
1830
1831MODULE = B PACKAGE = B::AV PREFIX = Av
1832
1833SSize_t
1834AvFILL(av)
1835 B::AV av
1836
1837SSize_t
1838AvMAX(av)
1839 B::AV av
1840
edcc7c74 1841#if PERL_VERSION < 9
1842
1843
1844#define AvOFF(av) ((XPVAV*)SvANY(av))->xof_off
1845
1846IV
1847AvOFF(av)
1848 B::AV av
1849
1850#endif
1851
a8a597b2 1852void
1853AvARRAY(av)
1854 B::AV av
1855 PPCODE:
1856 if (AvFILL(av) >= 0) {
1857 SV **svp = AvARRAY(av);
1858 I32 i;
1859 for (i = 0; i <= AvFILL(av); i++)
cea2e8a9 1860 XPUSHs(make_sv_object(aTHX_ sv_newmortal(), svp[i]));
a8a597b2 1861 }
1862
429a5ce7 1863void
1864AvARRAYelt(av, idx)
1865 B::AV av
1866 int idx
1867 PPCODE:
1868 if (idx >= 0 && AvFILL(av) >= 0 && idx <= AvFILL(av))
1869 XPUSHs(make_sv_object(aTHX_ sv_newmortal(), (AvARRAY(av)[idx])));
1870 else
1871 XPUSHs(make_sv_object(aTHX_ sv_newmortal(), NULL));
1872
edcc7c74 1873#if PERL_VERSION < 9
1874
1875MODULE = B PACKAGE = B::AV
1876
1877U8
1878AvFLAGS(av)
1879 B::AV av
1880
1881#endif
1882
1df34986 1883MODULE = B PACKAGE = B::FM PREFIX = Fm
1884
1885IV
1886FmLINES(form)
1887 B::FM form
1888
a8a597b2 1889MODULE = B PACKAGE = B::CV PREFIX = Cv
1890
651aa52e 1891U32
1892CvCONST(cv)
1893 B::CV cv
1894
a8a597b2 1895B::HV
1896CvSTASH(cv)
1897 B::CV cv
1898
1899B::OP
1900CvSTART(cv)
1901 B::CV cv
bf53b3a5 1902 CODE:
1903 RETVAL = CvISXSUB(cv) ? NULL : CvSTART(cv);
1904 OUTPUT:
1905 RETVAL
a8a597b2 1906
1907B::OP
1908CvROOT(cv)
1909 B::CV cv
d04ba589 1910 CODE:
1911 RETVAL = CvISXSUB(cv) ? NULL : CvROOT(cv);
1912 OUTPUT:
1913 RETVAL
a8a597b2 1914
1915B::GV
1916CvGV(cv)
1917 B::CV cv
1918
57843af0 1919char *
1920CvFILE(cv)
1921 B::CV cv
1922
a8a597b2 1923long
1924CvDEPTH(cv)
1925 B::CV cv
1926
1927B::AV
1928CvPADLIST(cv)
1929 B::CV cv
1930
1931B::CV
1932CvOUTSIDE(cv)
1933 B::CV cv
1934
a3985cdc 1935U32
1936CvOUTSIDE_SEQ(cv)
1937 B::CV cv
1938
a8a597b2 1939void
1940CvXSUB(cv)
1941 B::CV cv
1942 CODE:
d04ba589 1943 ST(0) = sv_2mortal(newSViv(CvISXSUB(cv) ? PTR2IV(CvXSUB(cv)) : 0));
a8a597b2 1944
1945
1946void
1947CvXSUBANY(cv)
1948 B::CV cv
1949 CODE:
b326da91 1950 ST(0) = CvCONST(cv) ?
07409e01 1951 make_sv_object(aTHX_ sv_newmortal(),(SV *)CvXSUBANY(cv).any_ptr) :
bf53b3a5 1952 sv_2mortal(newSViv(CvISXSUB(cv) ? CvXSUBANY(cv).any_iv : 0));
a8a597b2 1953
5cfd8ad4 1954MODULE = B PACKAGE = B::CV
1955
6aaf4108 1956U16
5cfd8ad4 1957CvFLAGS(cv)
1958 B::CV cv
1959
de3f1649 1960MODULE = B PACKAGE = B::CV PREFIX = cv_
1961
1962B::SV
1963cv_const_sv(cv)
1964 B::CV cv
1965
5cfd8ad4 1966
a8a597b2 1967MODULE = B PACKAGE = B::HV PREFIX = Hv
1968
1969STRLEN
1970HvFILL(hv)
1971 B::HV hv
1972
1973STRLEN
1974HvMAX(hv)
1975 B::HV hv
1976
1977I32
1978HvKEYS(hv)
1979 B::HV hv
1980
1981I32
1982HvRITER(hv)
1983 B::HV hv
1984
1985char *
1986HvNAME(hv)
1987 B::HV hv
1988
edcc7c74 1989#if PERL_VERSION < 9
1990
1991B::PMOP
1992HvPMROOT(hv)
1993 B::HV hv
1994
1995#endif
1996
a8a597b2 1997void
1998HvARRAY(hv)
1999 B::HV hv
2000 PPCODE:
2001 if (HvKEYS(hv) > 0) {
2002 SV *sv;
2003 char *key;
2004 I32 len;
2005 (void)hv_iterinit(hv);
2006 EXTEND(sp, HvKEYS(hv) * 2);
8063af02 2007 while ((sv = hv_iternextsv(hv, &key, &len))) {
22f1178f 2008 mPUSHp(key, len);
cea2e8a9 2009 PUSHs(make_sv_object(aTHX_ sv_newmortal(), sv));
a8a597b2 2010 }
2011 }
fd9f6265 2012
2013MODULE = B PACKAGE = B::HE PREFIX = He
2014
2015B::SV
2016HeVAL(he)
2017 B::HE he
2018
2019U32
2020HeHASH(he)
2021 B::HE he
2022
2023B::SV
2024HeSVKEY_force(he)
2025 B::HE he
2026
2027MODULE = B PACKAGE = B::RHE PREFIX = RHE_
2028
e412117e 2029#if PERL_VERSION >= 9
2030
fd9f6265 2031SV*
2032RHE_HASH(h)
2033 B::RHE h
2034 CODE:
38d45822 2035 RETVAL = newRV( (SV*)Perl_refcounted_he_chain_2hv(aTHX_ h) );
fd9f6265 2036 OUTPUT:
2037 RETVAL
e412117e 2038
2039#endif