1 ################################################################################
3 ## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
4 ## Version 2.x, Copyright (C) 2001, Paul Marquess.
5 ## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
7 ## This program is free software; you can redistribute it and/or
8 ## modify it under the same terms as Perl itself.
10 ################################################################################
27 PERL_USE_GCC_BRACE_GROUPS
39 __UNDEFINED__ cBOOL(cbool) ((cbool) ? (bool)1 : (bool)0)
40 __UNDEFINED__ OpHAS_SIBLING(o) (cBOOL((o)->op_sibling))
41 __UNDEFINED__ OpSIBLING(o) (0 + (o)->op_sibling)
42 __UNDEFINED__ OpMORESIB_set(o, sib) ((o)->op_sibling = (sib))
43 __UNDEFINED__ OpLASTSIB_set(o, parent) ((o)->op_sibling = NULL)
44 __UNDEFINED__ OpMAYBESIB_set(o, sib, parent) ((o)->op_sibling = (sib))
45 __UNDEFINED__ HEf_SVKEY -2
47 #if defined(DEBUGGING) && !defined(__COVERITY__)
48 __UNDEFINED__ __ASSERT_(statement) assert(statement),
50 __UNDEFINED__ __ASSERT_(statement)
53 __UNDEFINED__ SvRX(rv) (SvROK((rv)) ? (SvMAGICAL(SvRV((rv))) ? (mg_find(SvRV((rv)), PERL_MAGIC_qr) ? mg_find(SvRV((rv)), PERL_MAGIC_qr)->mg_obj : NULL) : NULL) : NULL)
54 __UNDEFINED__ SvRXOK(sv) (!!SvRX(sv))
56 #ifndef PERL_UNUSED_DECL
58 # if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
59 # define PERL_UNUSED_DECL
61 # define PERL_UNUSED_DECL __attribute__((unused))
64 # define PERL_UNUSED_DECL
68 #ifndef PERL_UNUSED_ARG
69 # if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
71 # define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
73 # define PERL_UNUSED_ARG(x) ((void)x)
77 #ifndef PERL_UNUSED_VAR
78 # define PERL_UNUSED_VAR(x) ((void)x)
81 #ifndef PERL_UNUSED_CONTEXT
83 # define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
85 # define PERL_UNUSED_CONTEXT
89 #ifndef PERL_UNUSED_RESULT
90 # if defined(__GNUC__) && defined(HASATTRIBUTE_WARN_UNUSED_RESULT)
91 # define PERL_UNUSED_RESULT(v) STMT_START { __typeof__(v) z = (v); (void)sizeof(z); } STMT_END
93 # define PERL_UNUSED_RESULT(v) ((void)(v))
97 __UNDEFINED__ NOOP /*EMPTY*/(void)0
98 __UNDEFINED__ dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
101 # if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
102 # define NVTYPE long double
104 # define NVTYPE double
110 # if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
112 # define INT2PTR(any,d) (any)(d)
114 # if PTRSIZE == LONGSIZE
115 # define PTRV unsigned long
117 # define PTRV unsigned
119 # define INT2PTR(any,d) (any)(PTRV)(d)
124 # if PTRSIZE == LONGSIZE
125 # define PTR2ul(p) (unsigned long)(p)
127 # define PTR2ul(p) INT2PTR(unsigned long,p)
131 __UNDEFINED__ PTR2nat(p) (PTRV)(p)
132 __UNDEFINED__ NUM2PTR(any,d) (any)PTR2nat(d)
133 __UNDEFINED__ PTR2IV(p) INT2PTR(IV,p)
134 __UNDEFINED__ PTR2UV(p) INT2PTR(UV,p)
135 __UNDEFINED__ PTR2NV(p) NUM2PTR(NV,p)
137 #undef START_EXTERN_C
141 # define START_EXTERN_C extern "C" {
142 # define END_EXTERN_C }
143 # define EXTERN_C extern "C"
145 # define START_EXTERN_C
146 # define END_EXTERN_C
147 # define EXTERN_C extern
150 #if { VERSION < 5.004 } || defined(PERL_GCC_PEDANTIC)
151 # ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
152 __UNDEF_NOT_PROVIDED__ PERL_GCC_BRACE_GROUPS_FORBIDDEN
156 #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
157 # ifndef PERL_USE_GCC_BRACE_GROUPS
158 # define PERL_USE_GCC_BRACE_GROUPS
164 #ifdef PERL_USE_GCC_BRACE_GROUPS
165 # define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
168 # if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
169 # define STMT_START if (1)
170 # define STMT_END else (void)0
172 # define STMT_START do
173 # define STMT_END while (0)
177 __UNDEFINED__ boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
179 /* DEFSV appears first in 5.004_56 */
180 __UNDEFINED__ DEFSV GvSV(PL_defgv)
181 __UNDEFINED__ SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
182 __UNDEFINED__ DEFSV_set(sv) (DEFSV = (sv))
184 /* Older perls (<=5.003) lack AvFILLp */
185 __UNDEFINED__ AvFILLp AvFILL
187 __UNDEFINED__ av_tindex AvFILL
188 __UNDEFINED__ av_top_index AvFILL
190 __UNDEFINED__ ERRSV get_sv("@",FALSE)
193 * This function's backport doesn't support the length parameter, but
194 * rather ignores it. Portability can only be ensured if the length
195 * parameter is used for speed reasons, but the length can always be
196 * correctly computed from the string argument.
199 __UNDEFINED__ gv_stashpvn(str,len,create) gv_stashpv(str,create)
202 __UNDEFINED__ get_cv perl_get_cv
203 __UNDEFINED__ get_sv perl_get_sv
204 __UNDEFINED__ get_av perl_get_av
205 __UNDEFINED__ get_hv perl_get_hv
208 __UNDEFINED__ dUNDERBAR dNOOP
209 __UNDEFINED__ UNDERBAR DEFSV
211 __UNDEFINED__ dAX I32 ax = MARK - PL_stack_base + 1
212 __UNDEFINED__ dITEMS I32 items = SP - MARK
214 __UNDEFINED__ dXSTARG SV * targ = sv_newmortal()
216 __UNDEFINED__ dAXMARK I32 ax = POPMARK; \
217 register SV ** const mark = PL_stack_base + ax++
220 __UNDEFINED__ XSprePUSH (sp = PL_stack_base + ax - 1)
222 #if { VERSION < 5.005 }
224 # define XSRETURN(off) \
226 PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
231 __UNDEFINED__ XSPROTO(name) void name(pTHX_ CV* cv)
232 __UNDEFINED__ SVfARG(p) ((void*)(p))
234 __UNDEFINED__ PERL_ABS(x) ((x) < 0 ? -(x) : (x))
236 __UNDEFINED__ dVAR dNOOP
238 __UNDEFINED__ SVf "_"
240 __UNDEFINED__ CPERLscope(x) x
242 __UNDEFINED__ PERL_HASH(hash,str,len) \
244 const char *s_PeRlHaSh = str; \
245 I32 i_PeRlHaSh = len; \
246 U32 hash_PeRlHaSh = 0; \
247 while (i_PeRlHaSh--) \
248 hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
249 (hash) = hash_PeRlHaSh; \
252 #ifndef PERLIO_FUNCS_DECL
253 # ifdef PERLIO_FUNCS_CONST
254 # define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
255 # define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
257 # define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
258 # define PERLIO_FUNCS_CAST(funcs) (funcs)
262 /* provide these typedefs for older perls */
263 #if { VERSION < 5.9.3 }
266 typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto);
268 typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
271 typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
278 # define WIDEST_UTYPE U64TYPE
280 # define WIDEST_UTYPE Quad_t
283 # define WIDEST_UTYPE U32
287 /* On versions without this, only ASCII is supported */
288 #ifdef NATIVE_TO_ASCII
289 __UNDEFINED__ NATIVE_TO_LATIN1(c) NATIVE_TO_ASCII(c)
291 __UNDEFINED__ NATIVE_TO_LATIN1(c) (c)
294 #ifdef ASCII_TO_NATIVE
295 __UNDEFINED__ LATIN1_TO_NATIVE(c) ASCII_TO_NATIVE(c)
297 __UNDEFINED__ LATIN1_TO_NATIVE(c) (c)
300 /* Warning: LATIN1_TO_NATIVE, NATIVE_TO_LATIN1
301 EBCDIC is not supported on versions earlier than 5.7.1
306 /* This is the first version where these macros are fully correct on EBCDIC
307 * platforms. Relying on * the C library functions, as earlier releases did,
308 * causes problems with * locales */
309 # if { VERSION < 5.22.0 }
319 # undef isALPHANUMERIC
320 # undef isALPHANUMERIC_A
321 # undef isALPHANUMERIC_L1
366 # undef isWORDCHAR_L1
372 __UNDEFINED__ isASCII(c) (isCNTRL(c) || isPRINT(c))
374 /* The below is accurate for all EBCDIC code pages supported by
375 * all the versions of Perl overridden by this */
376 __UNDEFINED__ isCNTRL(c) ( (c) == '\0' || (c) == '\a' || (c) == '\b' \
377 || (c) == '\f' || (c) == '\n' || (c) == '\r' \
378 || (c) == '\t' || (c) == '\v' \
379 || ((c) <= 3 && (c) >= 1) /* SOH, STX, ETX */ \
380 || (c) == 7 /* U+7F DEL */ \
381 || ((c) <= 0x13 && (c) >= 0x0E) /* SO, SI */ \
383 || (c) == 0x18 /* U+18 CAN */ \
384 || (c) == 0x19 /* U+19 EOM */ \
385 || ((c) <= 0x1F && (c) >= 0x1C) /* [FGRU]S */ \
386 || (c) == 0x26 /* U+17 ETB */ \
387 || (c) == 0x27 /* U+1B ESC */ \
388 || (c) == 0x2D /* U+05 ENQ */ \
389 || (c) == 0x2E /* U+06 ACK */ \
390 || (c) == 0x32 /* U+16 SYN */ \
391 || (c) == 0x37 /* U+04 EOT */ \
392 || (c) == 0x3C /* U+14 DC4 */ \
393 || (c) == 0x3D /* U+15 NAK */ \
394 || (c) == 0x3F /* U+1A SUB */ \
397 #if '^' == 106 /* EBCDIC POSIX-BC */
398 # define D_PPP_OUTLIER_CONTROL 0x5F
399 #else /* EBCDIC 1047 037 */
400 # define D_PPP_OUTLIER_CONTROL 0xFF
403 /* The controls are everything below blank, plus one outlier */
404 __UNDEFINED__ isCNTRL_L1(c) ((WIDEST_UTYPE) (c) < ' ' \
405 || (WIDEST_UTYPE) (c) == D_PPP_OUTLIER_CONTROL)
406 /* The ordering of the tests in this and isUPPER are to exclude most characters
408 __UNDEFINED__ isLOWER(c) ( (c) >= 'a' && (c) <= 'z' \
410 || ((c) >= 'j' && (c) <= 'r') \
412 __UNDEFINED__ isUPPER(c) ( (c) >= 'A' && (c) <= 'Z' \
414 || ((c) >= 'J' && (c) <= 'R') \
417 #else /* Above is EBCDIC; below is ASCII */
419 # if { VERSION < 5.4.0 }
420 /* The implementation of these in older perl versions can give wrong results if
421 * the C program locale is set to other than the C locale */
436 # if { VERSION < 5.8.0 } /* earlier perls omitted DEL */
440 # if { VERSION < 5.10.0 }
441 /* earlier perls included all of the isSPACE() characters, which is wrong. The
442 * version provided by Devel::PPPort always overrides an existing buggy
448 # if { VERSION < 5.14.0 }
449 /* earlier perls always returned true if the parameter was a signed char */
454 # if { VERSION < 5.17.8 } /* earlier perls didn't include PILCROW, SECTION SIGN */
458 # if { VERSION < 5.13.7 } /* khw didn't investigate why this failed */
462 # if { VERSION < 5.20.0 } /* earlier perls didn't include \v */
469 __UNDEFINED__ isASCII(c) ((WIDEST_UTYPE) (c) <= 127)
470 __UNDEFINED__ isCNTRL(c) ((WIDEST_UTYPE) (c) < ' ' || (c) == 127)
471 __UNDEFINED__ isCNTRL_L1(c) (isCNTRL(c) || ( (WIDEST_UTYPE) (c) <= 0x9F \
472 && (WIDEST_UTYPE) (c) >= 0x80))
473 __UNDEFINED__ isLOWER(c) ((c) >= 'a' && (c) <= 'z')
474 __UNDEFINED__ isUPPER(c) ((c) <= 'Z' && (c) >= 'A')
476 #endif /* Below are definitions common to EBCDIC and ASCII */
478 __UNDEFINED__ isASCII_L1(c) isASCII(c)
479 __UNDEFINED__ isALNUM(c) isWORDCHAR(c)
480 __UNDEFINED__ isALNUMC(c) isALPHANUMERIC(c)
481 __UNDEFINED__ isALNUMC_L1(c) isALPHANUMERIC_L1(c)
482 __UNDEFINED__ isALPHA(c) (isUPPER(c) || isLOWER(c))
483 __UNDEFINED__ isALPHA_L1(c) (isUPPER_L1(c) || isLOWER_L1(c))
484 __UNDEFINED__ isALPHANUMERIC(c) (isALPHA(c) || isDIGIT(c))
485 __UNDEFINED__ isALPHANUMERIC_L1(c) (isALPHA_L1(c) || isDIGIT(c))
486 __UNDEFINED__ isBLANK(c) ((c) == ' ' || (c) == '\t')
487 __UNDEFINED__ isBLANK_L1(c) ( isBLANK(c) \
488 || ( (WIDEST_UTYPE) (c) < 256 \
489 && NATIVE_TO_LATIN1((U8) c) == 0xA0))
490 __UNDEFINED__ isDIGIT(c) ((c) <= '9' && (c) >= '0')
491 __UNDEFINED__ isDIGIT_L1(c) isDIGIT(c)
492 __UNDEFINED__ isGRAPH(c) (isWORDCHAR(c) || isPUNCT(c))
493 __UNDEFINED__ isGRAPH_L1(c) (isPRINT_L1(c) && (c) != ' ')
494 __UNDEFINED__ isIDCONT(c) isWORDCHAR(c)
495 __UNDEFINED__ isIDCONT_L1(c) isWORDCHAR_L1(c)
496 __UNDEFINED__ isIDFIRST(c) (isALPHA(c) || (c) == '_')
497 __UNDEFINED__ isIDFIRST_L1(c) (isALPHA_L1(c) || NATIVE_TO_LATIN1(c) == '_')
498 __UNDEFINED__ isLOWER_L1(c) ( isLOWER(c) \
499 || ( (WIDEST_UTYPE) (c) < 256 \
500 && ( ( NATIVE_TO_LATIN1((U8) c) >= 0xDF \
501 && NATIVE_TO_LATIN1((U8) c) != 0xF7) \
502 || NATIVE_TO_LATIN1((U8) c) == 0xAA \
503 || NATIVE_TO_LATIN1((U8) c) == 0xBA \
504 || NATIVE_TO_LATIN1((U8) c) == 0xB5)))
505 __UNDEFINED__ isOCTAL(c) (((WIDEST_UTYPE)((c)) & ~7) == '0')
506 __UNDEFINED__ isOCTAL_L1(c) isOCTAL(c)
507 __UNDEFINED__ isPRINT(c) (isGRAPH(c) || (c) == ' ')
508 __UNDEFINED__ isPRINT_L1(c) ((WIDEST_UTYPE) (c) < 256 && ! isCNTRL_L1(c))
509 __UNDEFINED__ isPSXSPC(c) isSPACE(c)
510 __UNDEFINED__ isPSXSPC_L1(c) isSPACE_L1(c)
511 __UNDEFINED__ isPUNCT(c) ( (c) == '-' || (c) == '!' || (c) == '"' \
512 || (c) == '#' || (c) == '$' || (c) == '%' \
513 || (c) == '&' || (c) == '\'' || (c) == '(' \
514 || (c) == ')' || (c) == '*' || (c) == '+' \
515 || (c) == ',' || (c) == '.' || (c) == '/' \
516 || (c) == ':' || (c) == ';' || (c) == '<' \
517 || (c) == '=' || (c) == '>' || (c) == '?' \
518 || (c) == '@' || (c) == '[' || (c) == '\\' \
519 || (c) == ']' || (c) == '^' || (c) == '_' \
520 || (c) == '`' || (c) == '{' || (c) == '|' \
521 || (c) == '}' || (c) == '~')
522 __UNDEFINED__ isPUNCT_L1(c) ( isPUNCT(c) \
523 || ( (WIDEST_UTYPE) (c) < 256 \
524 && ( NATIVE_TO_LATIN1((U8) c) == 0xA1 \
525 || NATIVE_TO_LATIN1((U8) c) == 0xA7 \
526 || NATIVE_TO_LATIN1((U8) c) == 0xAB \
527 || NATIVE_TO_LATIN1((U8) c) == 0xB6 \
528 || NATIVE_TO_LATIN1((U8) c) == 0xB7 \
529 || NATIVE_TO_LATIN1((U8) c) == 0xBB \
530 || NATIVE_TO_LATIN1((U8) c) == 0xBF)))
531 __UNDEFINED__ isSPACE(c) ( isBLANK(c) || (c) == '\n' || (c) == '\r' \
532 || (c) == '\v' || (c) == '\f')
533 __UNDEFINED__ isSPACE_L1(c) ( isSPACE(c) \
534 || ( (WIDEST_UTYPE) (c) < 256 \
535 && ( NATIVE_TO_LATIN1((U8) c) == 0x85 \
536 || NATIVE_TO_LATIN1((U8) c) == 0xA0)))
537 __UNDEFINED__ isUPPER_L1(c) ( isUPPER(c) \
538 || ( (WIDEST_UTYPE) (c) < 256 \
539 && ( NATIVE_TO_LATIN1((U8) c) >= 0xC0 \
540 && NATIVE_TO_LATIN1((U8) c) <= 0xDE \
541 && NATIVE_TO_LATIN1((U8) c) != 0xD7)))
542 __UNDEFINED__ isWORDCHAR(c) (isALPHANUMERIC(c) || (c) == '_')
543 __UNDEFINED__ isWORDCHAR_L1(c) (isIDFIRST_L1(c) || isDIGIT(c))
544 __UNDEFINED__ isXDIGIT(c) ( isDIGIT(c) \
545 || ((c) >= 'a' && (c) <= 'f') \
546 || ((c) >= 'A' && (c) <= 'F'))
547 __UNDEFINED__ isXDIGIT_L1(c) isXDIGIT(c)
549 __UNDEFINED__ isALNUM_A(c) isALNUM(c)
550 __UNDEFINED__ isALNUMC_A(c) isALNUMC(c)
551 __UNDEFINED__ isALPHA_A(c) isALPHA(c)
552 __UNDEFINED__ isALPHANUMERIC_A(c) isALPHANUMERIC(c)
553 __UNDEFINED__ isASCII_A(c) isASCII(c)
554 __UNDEFINED__ isBLANK_A(c) isBLANK(c)
555 __UNDEFINED__ isCNTRL_A(c) isCNTRL(c)
556 __UNDEFINED__ isDIGIT_A(c) isDIGIT(c)
557 __UNDEFINED__ isGRAPH_A(c) isGRAPH(c)
558 __UNDEFINED__ isIDCONT_A(c) isIDCONT(c)
559 __UNDEFINED__ isIDFIRST_A(c) isIDFIRST(c)
560 __UNDEFINED__ isLOWER_A(c) isLOWER(c)
561 __UNDEFINED__ isOCTAL_A(c) isOCTAL(c)
562 __UNDEFINED__ isPRINT_A(c) isPRINT(c)
563 __UNDEFINED__ isPSXSPC_A(c) isPSXSPC(c)
564 __UNDEFINED__ isPUNCT_A(c) isPUNCT(c)
565 __UNDEFINED__ isSPACE_A(c) isSPACE(c)
566 __UNDEFINED__ isUPPER_A(c) isUPPER(c)
567 __UNDEFINED__ isWORDCHAR_A(c) isWORDCHAR(c)
568 __UNDEFINED__ isXDIGIT_A(c) isXDIGIT(c)
570 /* Until we figure out how to support this in older perls... */
571 #if { VERSION >= 5.8.0 }
573 __UNDEFINED__ HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \
574 SvUTF8(HeKEY_sv(he)) : \
579 __UNDEFINED__ C_ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0]))
580 __UNDEFINED__ C_ARRAY_END(a) ((a) + C_ARRAY_LENGTH(a))
582 __UNDEFINED__ LIKELY(x) (x)
583 __UNDEFINED__ UNLIKELY(x) (x)
586 #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
587 # define MUTABLE_PTR(p) ({ void *_p = (p); _p; })
589 # define MUTABLE_PTR(p) ((void *) (p))
593 __UNDEFINED__ MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p))
597 typedef XSPROTO(XSPROTO_test_t);
598 typedef XSPROTO_test_t *XSPROTO_test_t_ptr;
600 XS(XS_Devel__PPPort_dXSTARG); /* prototype */
601 XS(XS_Devel__PPPort_dXSTARG)
609 iv = SvIV(ST(0)) + 1;
614 XS(XS_Devel__PPPort_dAXMARK); /* prototype */
615 XS(XS_Devel__PPPort_dAXMARK)
624 iv = SvIV(ST(0)) - 1;
632 XSPROTO_test_t_ptr p = &XS_Devel__PPPort_dXSTARG;
633 newXS("Devel::PPPort::dXSTARG", *p, file);
635 newXS("Devel::PPPort::dAXMARK", XS_Devel__PPPort_dAXMARK, file);
650 x = newOP(OP_PUSHMARK, 0);
652 /* No siblings yet! */
653 if (OpHAS_SIBLING(x) || OpSIBLING(x)) {
654 failures++; warn("Op should not have had a sib");
661 for (i = 0; i < 2; i++) {
662 OP *newsib = newOP(OP_PUSHMARK, 0);
663 OpMORESIB_set(kid, newsib);
665 kid = OpSIBLING(kid);
668 middlekid = OpSIBLING(x);
670 /* Should now have a sibling */
671 if (! OpHAS_SIBLING(x) || ! OpSIBLING(x) ) {
672 failures++; warn("Op should have had a sib after moresib_set");
675 /* Count the siblings */
676 for (kid = OpSIBLING(x); kid; kid = OpSIBLING(kid)) {
681 failures++; warn("Kid had %d sibs, expected 2", count);
684 if (OpHAS_SIBLING(lastkid) || OpSIBLING(lastkid)) {
685 failures++; warn("Last kid should not have a sib");
688 /* Really sets the parent, and says 'no more siblings' */
689 OpLASTSIB_set(x, lastkid);
691 if (OpHAS_SIBLING(x) || OpSIBLING(x)) {
692 failures++; warn("OpLASTSIB_set failed?");
695 /* Restore the kid */
696 OpMORESIB_set(x, lastkid);
698 /* Try to remove it again */
699 OpLASTSIB_set(x, NULL);
701 if (OpHAS_SIBLING(x) || OpSIBLING(x)) {
702 failures++; warn("OpLASTSIB_set with NULL failed?");
705 /* Try to restore with maybesib_set */
706 OpMAYBESIB_set(x, lastkid, NULL);
708 if (! OpHAS_SIBLING(x) || ! OpSIBLING(x) ) {
709 failures++; warn("Op should have had a sib after maybesibset");
734 RETVAL += PTR2nat(p) != 0 ? 1 : 0;
735 RETVAL += PTR2ul(p) != 0UL ? 2 : 0;
736 RETVAL += PTR2UV(p) != (UV) 0 ? 4 : 0;
737 RETVAL += PTR2IV(p) != (IV) 0 ? 8 : 0;
738 RETVAL += PTR2NV(p) != (NV) 0 ? 16 : 0;
739 RETVAL += p > NUM2PTR(int *, 0) ? 32 : 0;
745 gv_stashpvn(name, create)
749 RETVAL = gv_stashpvn(name, strlen(name), create) != NULL;
758 RETVAL = get_sv(name, create) != NULL;
767 RETVAL = get_av(name, create) != NULL;
776 RETVAL = get_hv(name, create) != NULL;
785 RETVAL = get_cv(name, create) != NULL;
805 RETVAL = newSVsv(boolSV(value));
812 RETVAL = newSVsv(DEFSV);
819 XPUSHs(sv_mortalcopy(DEFSV));
822 DEFSV_set(newSVpvs("DEFSV"));
823 XPUSHs(sv_mortalcopy(DEFSV));
824 /* Yes, this leaks the above scalar; 5.005 with threads for some reason */
825 /* frees it upon LEAVE, thus mortalizing it causes "attempt to free..." */
826 /* sv_2mortal(DEFSV); */
828 XPUSHs(sv_mortalcopy(DEFSV));
834 RETVAL = SvTRUEx(ERRSV);
843 RETVAL = newSVsv(UNDERBAR);
866 #if { VERSION >= 5.004 }
867 x = sv_2mortal(newSVpvf("[%" SVf "]", SVfARG(x)));
873 Perl_ppaddr_t(string)
878 lower = PL_ppaddr[OP_LC];
879 mXPUSHs(newSVpv(string, 0));
882 (void)*(lower)(aTHXR);
887 #if { VERSION >= 5.8.0 }
890 check_HeUTF8(utf8_key)
900 key = SvPV(utf8_key, klen);
901 if (SvUTF8(utf8_key)) klen *= -1;
902 hv_store(hash, key, klen, newSVpvs("string"), 0);
904 ent = hv_iternext(hash);
906 mXPUSHp((HeUTF8(ent) == 0 ? "norm" : "utf8"), 4);
915 int x[] = { 10, 11, 12, 13 };
917 mXPUSHi(C_ARRAY_LENGTH(x)); /* 4 */
918 mXPUSHi(*(C_ARRAY_END(x)-1)); /* 13 */
924 RETVAL = isBLANK(ord);
932 RETVAL = isBLANK_A(ord);
940 RETVAL = isBLANK_L1(ord);
948 RETVAL = isUPPER(ord);
956 RETVAL = isUPPER_A(ord);
964 RETVAL = isUPPER_L1(ord);
972 RETVAL = isLOWER(ord);
980 RETVAL = isLOWER_A(ord);
988 RETVAL = isLOWER_L1(ord);
996 RETVAL = isALPHA(ord);
1004 RETVAL = isALPHA_A(ord);
1012 RETVAL = isALPHA_L1(ord);
1020 RETVAL = isWORDCHAR(ord);
1028 RETVAL = isWORDCHAR_A(ord);
1036 RETVAL = isWORDCHAR_L1(ord);
1044 RETVAL = isALPHANUMERIC(ord);
1049 isALPHANUMERIC_A(ord)
1052 RETVAL = isALPHANUMERIC_A(ord);
1060 RETVAL = isALNUM(ord);
1068 RETVAL = isALNUM_A(ord);
1076 RETVAL = isDIGIT(ord);
1084 RETVAL = isDIGIT_A(ord);
1092 RETVAL = isOCTAL(ord);
1100 RETVAL = isOCTAL_A(ord);
1108 RETVAL = isIDFIRST(ord);
1116 RETVAL = isIDFIRST_A(ord);
1124 RETVAL = isIDCONT(ord);
1132 RETVAL = isIDCONT_A(ord);
1140 RETVAL = isSPACE(ord);
1148 RETVAL = isSPACE_A(ord);
1156 RETVAL = isASCII(ord);
1164 RETVAL = isASCII_A(ord);
1172 RETVAL = isCNTRL(ord);
1180 RETVAL = isCNTRL_A(ord);
1188 RETVAL = isPRINT(ord);
1196 RETVAL = isPRINT_A(ord);
1204 RETVAL = isGRAPH(ord);
1212 RETVAL = isGRAPH_A(ord);
1220 RETVAL = isPUNCT(ord);
1228 RETVAL = isPUNCT_A(ord);
1236 RETVAL = isXDIGIT(ord);
1244 RETVAL = isXDIGIT_A(ord);
1252 RETVAL = isPSXSPC(ord);
1260 RETVAL = isPSXSPC_A(ord);
1265 isALPHANUMERIC_L1(ord)
1268 RETVAL = isALPHANUMERIC_L1(ord);
1276 RETVAL = isALNUMC_L1(ord);
1284 RETVAL = isDIGIT_L1(ord);
1292 RETVAL = isOCTAL_L1(ord);
1300 RETVAL = isIDFIRST_L1(ord);
1308 RETVAL = isIDCONT_L1(ord);
1316 RETVAL = isSPACE_L1(ord);
1324 RETVAL = isASCII_L1(ord);
1332 RETVAL = isCNTRL_L1(ord);
1340 RETVAL = isPRINT_L1(ord);
1348 RETVAL = isGRAPH_L1(ord);
1356 RETVAL = isPUNCT_L1(ord);
1364 RETVAL = isXDIGIT_L1(ord);
1372 RETVAL = isPSXSPC_L1(ord);
1380 RETVAL = av_tindex((AV*)SvRV(av));
1388 RETVAL = av_top_index((AV*)SvRV(av));
1394 use vars qw($my_sv @my_av %my_hv);
1396 ok(&Devel::PPPort::boolSV(1));
1397 ok(!&Devel::PPPort::boolSV(0));
1400 ok(&Devel::PPPort::DEFSV(), "Fred");
1401 ok(&Devel::PPPort::UNDERBAR(), "Fred");
1403 if ("$]" >= 5.009002 && "$]" < 5.023 && "$]" < 5.023004) {
1405 no warnings "deprecated";
1406 no if $^V > v5.17.9, warnings => "experimental::lexical_topic";
1408 ok(&Devel::PPPort::DEFSV(), "Fred");
1409 ok(&Devel::PPPort::UNDERBAR(), "Tony");
1417 my @r = &Devel::PPPort::DEFSV_modify();
1424 ok(&Devel::PPPort::DEFSV(), "Fred");
1427 ok(!&Devel::PPPort::ERRSV());
1428 eval { cannot_call_this_one() };
1429 ok(&Devel::PPPort::ERRSV());
1431 ok(&Devel::PPPort::gv_stashpvn('Devel::PPPort', 0));
1432 ok(!&Devel::PPPort::gv_stashpvn('does::not::exist', 0));
1433 ok(&Devel::PPPort::gv_stashpvn('does::not::exist', 1));
1436 ok(&Devel::PPPort::get_sv('my_sv', 0));
1437 ok(!&Devel::PPPort::get_sv('not_my_sv', 0));
1438 ok(&Devel::PPPort::get_sv('not_my_sv', 1));
1441 ok(&Devel::PPPort::get_av('my_av', 0));
1442 ok(!&Devel::PPPort::get_av('not_my_av', 0));
1443 ok(&Devel::PPPort::get_av('not_my_av', 1));
1446 ok(&Devel::PPPort::get_hv('my_hv', 0));
1447 ok(!&Devel::PPPort::get_hv('not_my_hv', 0));
1448 ok(&Devel::PPPort::get_hv('not_my_hv', 1));
1451 ok(&Devel::PPPort::get_cv('my_cv', 0));
1452 ok(!&Devel::PPPort::get_cv('not_my_cv', 0));
1453 ok(&Devel::PPPort::get_cv('not_my_cv', 1));
1455 ok(Devel::PPPort::dXSTARG(42), 43);
1456 ok(Devel::PPPort::dAXMARK(4711), 4710);
1458 ok(Devel::PPPort::prepush(), 42);
1460 ok(join(':', Devel::PPPort::xsreturn(0)), 'test1');
1461 ok(join(':', Devel::PPPort::xsreturn(1)), 'test1:test2');
1463 ok(Devel::PPPort::PERL_ABS(42), 42);
1464 ok(Devel::PPPort::PERL_ABS(-13), 13);
1466 ok(Devel::PPPort::SVf(42), "$]" >= 5.004 ? '[42]' : '42');
1467 ok(Devel::PPPort::SVf('abc'), "$]" >= 5.004 ? '[abc]' : 'abc');
1469 ok(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
1471 ok(&Devel::PPPort::ptrtests(), 63);
1473 ok(&Devel::PPPort::OpSIBLING_tests(), 0);
1475 if ("$]" >= 5.009000) {
1477 ok(&Devel::PPPort::check_HeUTF8("hello"), "norm");
1478 ok(&Devel::PPPort::check_HeUTF8("\N{U+263a}"), "utf8");
1485 @r = &Devel::PPPort::check_c_array();
1489 ok(!Devel::PPPort::SvRXOK(""));
1490 ok(!Devel::PPPort::SvRXOK(bless [], "Regexp"));
1493 skip 'no qr// objects in this perl', 0;
1494 skip 'no qr// objects in this perl', 0;
1496 my $qr = eval 'qr/./';
1497 ok(Devel::PPPort::SvRXOK($qr));
1498 ok(Devel::PPPort::SvRXOK(bless $qr, "Surprise"));
1501 ok( Devel::PPPort::isBLANK(ord(" ")));
1502 ok(! Devel::PPPort::isBLANK(ord("\n")));
1504 ok( Devel::PPPort::isBLANK_A(ord("\t")));
1505 ok(! Devel::PPPort::isBLANK_A(ord("\r")));
1507 ok( Devel::PPPort::isBLANK_L1(ord("\t")));
1508 ok(! Devel::PPPort::isBLANK_L1(ord("\r")));
1510 ok( Devel::PPPort::isUPPER(ord("A")));
1511 ok(! Devel::PPPort::isUPPER(ord("a")));
1513 ok( Devel::PPPort::isUPPER_A(ord("Z")));
1515 # One of these two is uppercase in EBCDIC; the other in Latin1, but neither are
1517 ok(! Devel::PPPort::isUPPER_A(0xDC));
1518 ok(! Devel::PPPort::isUPPER_A(0xFC));
1520 ok(Devel::PPPort::isUPPER_L1(0xDC) || Devel::PPPort::isUPPER_L1(0xFC));
1521 ok(! (Devel::PPPort::isUPPER_L1(0xDC) && Devel::PPPort::isUPPER_L1(0xFC)));
1523 ok( Devel::PPPort::isLOWER(ord("b")));
1524 ok(! Devel::PPPort::isLOWER(ord("B")));
1526 ok( Devel::PPPort::isLOWER_A(ord("y")));
1528 # One of these two is lowercase in EBCDIC; the other in Latin1, but neither are
1530 ok(! Devel::PPPort::isLOWER_A(0xDC));
1531 ok(! Devel::PPPort::isLOWER_A(0xFC));
1533 ok(Devel::PPPort::isLOWER_L1(0xDC) || Devel::PPPort::isLOWER_L1(0xFC));
1534 ok(! Devel::PPPort::isLOWER_L1(0xDC) && Devel::PPPort::isLOWER_L1(0xFC));
1536 ok( Devel::PPPort::isALPHA(ord("C")));
1537 ok(! Devel::PPPort::isALPHA(ord("1")));
1539 ok( Devel::PPPort::isALPHA_A(ord("x")));
1540 ok(! Devel::PPPort::isALPHA_A(0xDC));
1542 ok( Devel::PPPort::isALPHA_L1(ord("y")));
1543 ok( Devel::PPPort::isALPHA_L1(0xDC));
1544 ok(! Devel::PPPort::isALPHA_L1(0xB6));
1546 ok( Devel::PPPort::isWORDCHAR(ord("_")));
1547 ok(! Devel::PPPort::isWORDCHAR(ord("@")));
1549 ok( Devel::PPPort::isWORDCHAR_A(ord("2")));
1550 ok(! Devel::PPPort::isWORDCHAR_A(0xFC));
1552 ok( Devel::PPPort::isWORDCHAR_L1(ord("2")));
1553 ok( Devel::PPPort::isWORDCHAR_L1(0xFC));
1554 ok(! Devel::PPPort::isWORDCHAR_L1(0xB6));
1556 ok( Devel::PPPort::isALPHANUMERIC(ord("4")));
1557 ok(! Devel::PPPort::isALPHANUMERIC(ord("_")));
1559 ok( Devel::PPPort::isALPHANUMERIC_A(ord("l")));
1560 ok(! Devel::PPPort::isALPHANUMERIC_A(0xDC));
1562 ok( Devel::PPPort::isALPHANUMERIC_L1(ord("l")));
1563 ok( Devel::PPPort::isALPHANUMERIC_L1(0xDC));
1564 ok(! Devel::PPPort::isALPHANUMERIC_L1(0xB6));
1566 ok( Devel::PPPort::isALNUM(ord("c")));
1567 ok(! Devel::PPPort::isALNUM(ord("}")));
1569 ok( Devel::PPPort::isALNUM_A(ord("5")));
1570 ok(! Devel::PPPort::isALNUM_A(0xFC));
1572 ok( Devel::PPPort::isALNUMC_L1(ord("5")));
1573 ok( Devel::PPPort::isALNUMC_L1(0xFC));
1574 ok(! Devel::PPPort::isALNUMC_L1(0xB6));
1576 ok( Devel::PPPort::isDIGIT(ord("6")));
1577 ok(! Devel::PPPort::isDIGIT(ord("_")));
1579 ok( Devel::PPPort::isDIGIT_A(ord("7")));
1580 ok(! Devel::PPPort::isDIGIT_A(0xDC));
1582 ok( Devel::PPPort::isDIGIT_L1(ord("5")));
1583 ok(! Devel::PPPort::isDIGIT_L1(0xDC));
1585 ok( Devel::PPPort::isOCTAL(ord("7")));
1586 ok(! Devel::PPPort::isOCTAL(ord("8")));
1588 ok( Devel::PPPort::isOCTAL_A(ord("0")));
1589 ok(! Devel::PPPort::isOCTAL_A(ord("9")));
1591 ok( Devel::PPPort::isOCTAL_L1(ord("2")));
1592 ok(! Devel::PPPort::isOCTAL_L1(ord("8")));
1594 ok( Devel::PPPort::isIDFIRST(ord("D")));
1595 ok(! Devel::PPPort::isIDFIRST(ord("1")));
1597 ok( Devel::PPPort::isIDFIRST_A(ord("_")));
1598 ok(! Devel::PPPort::isIDFIRST_A(0xFC));
1600 ok( Devel::PPPort::isIDFIRST_L1(ord("_")));
1601 ok( Devel::PPPort::isIDFIRST_L1(0xFC));
1602 ok(! Devel::PPPort::isIDFIRST_L1(0xB6));
1604 ok( Devel::PPPort::isIDCONT(ord("e")));
1605 ok(! Devel::PPPort::isIDCONT(ord("@")));
1607 ok( Devel::PPPort::isIDCONT_A(ord("2")));
1608 ok(! Devel::PPPort::isIDCONT_A(0xDC));
1610 ok( Devel::PPPort::isIDCONT_L1(ord("4")));
1611 ok( Devel::PPPort::isIDCONT_L1(0xDC));
1612 ok(! Devel::PPPort::isIDCONT_L1(0xB6));
1614 ok( Devel::PPPort::isSPACE(ord(" ")));
1615 ok(! Devel::PPPort::isSPACE(ord("_")));
1617 ok( Devel::PPPort::isSPACE_A(ord("\cK")));
1618 ok(! Devel::PPPort::isSPACE_A(ord("F")));
1620 ok( Devel::PPPort::isSPACE_L1(ord("\cK")));
1621 ok(! Devel::PPPort::isSPACE_L1(ord("g")));
1623 # This stresses the edge for ASCII machines, but happens to work on EBCDIC as
1625 ok( Devel::PPPort::isASCII(0x7F));
1626 ok(! Devel::PPPort::isASCII(0x80));
1628 ok( Devel::PPPort::isASCII_A(ord("9")));
1629 ok( Devel::PPPort::isASCII_L1(ord("9")));
1631 # B6 is the PARAGRAPH SIGN in ASCII and EBCDIC
1632 ok(! Devel::PPPort::isASCII_A(0xB6));
1633 ok(! Devel::PPPort::isASCII_L1(0xB6));
1635 ok( Devel::PPPort::isCNTRL(ord("\e")));
1636 ok(! Devel::PPPort::isCNTRL(ord(" ")));
1638 ok( Devel::PPPort::isCNTRL_A(ord("\a")));
1639 ok(! Devel::PPPort::isCNTRL_A(0xB6));
1641 ok( Devel::PPPort::isCNTRL_L1(ord("\a")));
1642 ok( Devel::PPPort::isCNTRL_L1(ord(" ") - 1));
1643 ok(! Devel::PPPort::isCNTRL_L1(0xB6));
1644 if (ord('A') == 65) {
1645 ok(Devel::PPPort::isCNTRL_L1(0x80));
1647 elsif (ord('^') == 106) {
1648 ok(Devel::PPPort::isCNTRL_L1(0x5F));
1651 ok(Devel::PPPort::isCNTRL_L1(0xFF));
1654 ok( Devel::PPPort::isPRINT(ord(" ")));
1655 ok(! Devel::PPPort::isPRINT(ord("\n")));
1657 ok( Devel::PPPort::isPRINT_A(ord("G")));
1658 ok(! Devel::PPPort::isPRINT_A(0xB6));
1660 ok( Devel::PPPort::isPRINT_L1(ord("~")));
1661 ok( Devel::PPPort::isPRINT_L1(0xB6));
1662 ok(! Devel::PPPort::isPRINT_L1(ord("\r")));
1664 ok( Devel::PPPort::isGRAPH(ord("h")));
1665 ok(! Devel::PPPort::isGRAPH(ord(" ")));
1667 ok( Devel::PPPort::isGRAPH_A(ord("i")));
1668 ok(! Devel::PPPort::isGRAPH_A(0xB6));
1670 ok( Devel::PPPort::isGRAPH_L1(ord("j")));
1671 ok( Devel::PPPort::isGRAPH_L1(0xB6));
1672 ok(! Devel::PPPort::isGRAPH_L1(4));
1674 ok( Devel::PPPort::isPUNCT(ord("#")));
1675 ok(! Devel::PPPort::isPUNCT(ord(" ")));
1677 ok( Devel::PPPort::isPUNCT_A(ord("*")));
1678 ok(! Devel::PPPort::isPUNCT_A(0xB6));
1680 ok( Devel::PPPort::isPUNCT_L1(ord("+")));
1681 ok( Devel::PPPort::isPUNCT_L1(0xB6));
1683 ok( Devel::PPPort::isXDIGIT(ord("A")));
1684 ok(! Devel::PPPort::isXDIGIT(ord("_")));
1686 ok( Devel::PPPort::isXDIGIT_A(ord("9")));
1687 ok(! Devel::PPPort::isXDIGIT_A(0xDC));
1689 ok( Devel::PPPort::isXDIGIT_L1(ord("9")));
1690 ok(! Devel::PPPort::isXDIGIT_L1(0xFF));
1692 ok( Devel::PPPort::isPSXSPC(ord(" ")));
1693 ok(! Devel::PPPort::isPSXSPC(ord("k")));
1695 ok( Devel::PPPort::isPSXSPC_A(ord("\cK")));
1696 ok(! Devel::PPPort::isPSXSPC_A(0xFC));
1698 ok( Devel::PPPort::isPSXSPC_L1(ord("\cK")));
1699 ok(! Devel::PPPort::isPSXSPC_L1(0xFC));
1701 ok(&Devel::PPPort::av_top_index([1,2,3]), 2);
1702 ok(&Devel::PPPort::av_tindex([1,2,3,4]), 3);