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