This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add C macros for UTF-8 for BOM and REPLACEMENT CHARACTER
[perl5.git] / inline.h
... / ...
CommitLineData
1/* inline.h
2 *
3 * Copyright (C) 2012 by Larry Wall and others
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 * This file is a home for static inline functions that cannot go in other
9 * headers files, because they depend on proto.h (included after most other
10 * headers) or struct definitions.
11 *
12 * Each section names the header file that the functions "belong" to.
13 */
14
15/* ------------------------------- av.h ------------------------------- */
16
17PERL_STATIC_INLINE SSize_t
18S_av_top_index(pTHX_ AV *av)
19{
20 PERL_ARGS_ASSERT_AV_TOP_INDEX;
21 assert(SvTYPE(av) == SVt_PVAV);
22
23 return AvFILL(av);
24}
25
26/* ------------------------------- cv.h ------------------------------- */
27
28PERL_STATIC_INLINE GV *
29S_CvGV(pTHX_ CV *sv)
30{
31 return CvNAMED(sv)
32 ? Perl_cvgv_from_hek(aTHX_ sv)
33 : ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_gv_u.xcv_gv;
34}
35
36PERL_STATIC_INLINE I32 *
37S_CvDEPTHp(const CV * const sv)
38{
39 assert(SvTYPE(sv) == SVt_PVCV || SvTYPE(sv) == SVt_PVFM);
40 return &((XPVCV*)SvANY(sv))->xcv_depth;
41}
42
43/*
44 CvPROTO returns the prototype as stored, which is not necessarily what
45 the interpreter should be using. Specifically, the interpreter assumes
46 that spaces have been stripped, which has been the case if the prototype
47 was added by toke.c, but is generally not the case if it was added elsewhere.
48 Since we can't enforce the spacelessness at assignment time, this routine
49 provides a temporary copy at parse time with spaces removed.
50 I<orig> is the start of the original buffer, I<len> is the length of the
51 prototype and will be updated when this returns.
52 */
53
54#ifdef PERL_CORE
55PERL_STATIC_INLINE char *
56S_strip_spaces(pTHX_ const char * orig, STRLEN * const len)
57{
58 SV * tmpsv;
59 char * tmps;
60 tmpsv = newSVpvn_flags(orig, *len, SVs_TEMP);
61 tmps = SvPVX(tmpsv);
62 while ((*len)--) {
63 if (!isSPACE(*orig))
64 *tmps++ = *orig;
65 orig++;
66 }
67 *tmps = '\0';
68 *len = tmps - SvPVX(tmpsv);
69 return SvPVX(tmpsv);
70}
71#endif
72
73/* ------------------------------- mg.h ------------------------------- */
74
75#if defined(PERL_CORE) || defined(PERL_EXT)
76/* assumes get-magic and stringification have already occurred */
77PERL_STATIC_INLINE STRLEN
78S_MgBYTEPOS(pTHX_ MAGIC *mg, SV *sv, const char *s, STRLEN len)
79{
80 assert(mg->mg_type == PERL_MAGIC_regex_global);
81 assert(mg->mg_len != -1);
82 if (mg->mg_flags & MGf_BYTES || !DO_UTF8(sv))
83 return (STRLEN)mg->mg_len;
84 else {
85 const STRLEN pos = (STRLEN)mg->mg_len;
86 /* Without this check, we may read past the end of the buffer: */
87 if (pos > sv_or_pv_len_utf8(sv, s, len)) return len+1;
88 return sv_or_pv_pos_u2b(sv, s, pos, NULL);
89 }
90}
91#endif
92
93/* ------------------------------- pad.h ------------------------------ */
94
95#if defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C)
96PERL_STATIC_INLINE bool
97PadnameIN_SCOPE(const PADNAME * const pn, const U32 seq)
98{
99 /* is seq within the range _LOW to _HIGH ?
100 * This is complicated by the fact that PL_cop_seqmax
101 * may have wrapped around at some point */
102 if (COP_SEQ_RANGE_LOW(pn) == PERL_PADSEQ_INTRO)
103 return FALSE; /* not yet introduced */
104
105 if (COP_SEQ_RANGE_HIGH(pn) == PERL_PADSEQ_INTRO) {
106 /* in compiling scope */
107 if (
108 (seq > COP_SEQ_RANGE_LOW(pn))
109 ? (seq - COP_SEQ_RANGE_LOW(pn) < (U32_MAX >> 1))
110 : (COP_SEQ_RANGE_LOW(pn) - seq > (U32_MAX >> 1))
111 )
112 return TRUE;
113 }
114 else if (
115 (COP_SEQ_RANGE_LOW(pn) > COP_SEQ_RANGE_HIGH(pn))
116 ?
117 ( seq > COP_SEQ_RANGE_LOW(pn)
118 || seq <= COP_SEQ_RANGE_HIGH(pn))
119
120 : ( seq > COP_SEQ_RANGE_LOW(pn)
121 && seq <= COP_SEQ_RANGE_HIGH(pn))
122 )
123 return TRUE;
124 return FALSE;
125}
126#endif
127
128/* ------------------------------- pp.h ------------------------------- */
129
130PERL_STATIC_INLINE I32
131S_TOPMARK(pTHX)
132{
133 DEBUG_s(DEBUG_v(PerlIO_printf(Perl_debug_log,
134 "MARK top %p %"IVdf"\n",
135 PL_markstack_ptr,
136 (IV)*PL_markstack_ptr)));
137 return *PL_markstack_ptr;
138}
139
140PERL_STATIC_INLINE I32
141S_POPMARK(pTHX)
142{
143 DEBUG_s(DEBUG_v(PerlIO_printf(Perl_debug_log,
144 "MARK pop %p %"IVdf"\n",
145 (PL_markstack_ptr-1),
146 (IV)*(PL_markstack_ptr-1))));
147 assert((PL_markstack_ptr > PL_markstack) || !"MARK underflow");
148 return *PL_markstack_ptr--;
149}
150
151/* ----------------------------- regexp.h ----------------------------- */
152
153PERL_STATIC_INLINE struct regexp *
154S_ReANY(const REGEXP * const re)
155{
156 assert(isREGEXP(re));
157 return re->sv_u.svu_rx;
158}
159
160/* ------------------------------- sv.h ------------------------------- */
161
162PERL_STATIC_INLINE SV *
163S_SvREFCNT_inc(SV *sv)
164{
165 if (LIKELY(sv != NULL))
166 SvREFCNT(sv)++;
167 return sv;
168}
169PERL_STATIC_INLINE SV *
170S_SvREFCNT_inc_NN(SV *sv)
171{
172 SvREFCNT(sv)++;
173 return sv;
174}
175PERL_STATIC_INLINE void
176S_SvREFCNT_inc_void(SV *sv)
177{
178 if (LIKELY(sv != NULL))
179 SvREFCNT(sv)++;
180}
181PERL_STATIC_INLINE void
182S_SvREFCNT_dec(pTHX_ SV *sv)
183{
184 if (LIKELY(sv != NULL)) {
185 U32 rc = SvREFCNT(sv);
186 if (LIKELY(rc > 1))
187 SvREFCNT(sv) = rc - 1;
188 else
189 Perl_sv_free2(aTHX_ sv, rc);
190 }
191}
192
193PERL_STATIC_INLINE void
194S_SvREFCNT_dec_NN(pTHX_ SV *sv)
195{
196 U32 rc = SvREFCNT(sv);
197 if (LIKELY(rc > 1))
198 SvREFCNT(sv) = rc - 1;
199 else
200 Perl_sv_free2(aTHX_ sv, rc);
201}
202
203PERL_STATIC_INLINE void
204SvAMAGIC_on(SV *sv)
205{
206 assert(SvROK(sv));
207 if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv)));
208}
209PERL_STATIC_INLINE void
210SvAMAGIC_off(SV *sv)
211{
212 if (SvROK(sv) && SvOBJECT(SvRV(sv)))
213 HvAMAGIC_off(SvSTASH(SvRV(sv)));
214}
215
216PERL_STATIC_INLINE U32
217S_SvPADSTALE_on(SV *sv)
218{
219 assert(!(SvFLAGS(sv) & SVs_PADTMP));
220 return SvFLAGS(sv) |= SVs_PADSTALE;
221}
222PERL_STATIC_INLINE U32
223S_SvPADSTALE_off(SV *sv)
224{
225 assert(!(SvFLAGS(sv) & SVs_PADTMP));
226 return SvFLAGS(sv) &= ~SVs_PADSTALE;
227}
228#if defined(PERL_CORE) || defined (PERL_EXT)
229PERL_STATIC_INLINE STRLEN
230S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
231{
232 PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B;
233 if (SvGAMAGIC(sv)) {
234 U8 *hopped = utf8_hop((U8 *)pv, pos);
235 if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped);
236 return (STRLEN)(hopped - (U8 *)pv);
237 }
238 return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN);
239}
240#endif
241
242/* ------------------------------- handy.h ------------------------------- */
243
244/* saves machine code for a common noreturn idiom typically used in Newx*() */
245#ifdef GCC_DIAG_PRAGMA
246GCC_DIAG_IGNORE(-Wunused-function) /* Intentionally left semicolonless. */
247#endif
248static void
249S_croak_memory_wrap(void)
250{
251 Perl_croak_nocontext("%s",PL_memory_wrap);
252}
253#ifdef GCC_DIAG_PRAGMA
254GCC_DIAG_RESTORE /* Intentionally left semicolonless. */
255#endif
256
257/* ------------------------------- utf8.h ------------------------------- */
258
259/*
260=head1 Unicode Support
261*/
262
263PERL_STATIC_INLINE void
264S_append_utf8_from_native_byte(const U8 byte, U8** dest)
265{
266 /* Takes an input 'byte' (Latin1 or EBCDIC) and appends it to the UTF-8
267 * encoded string at '*dest', updating '*dest' to include it */
268
269 PERL_ARGS_ASSERT_APPEND_UTF8_FROM_NATIVE_BYTE;
270
271 if (NATIVE_BYTE_IS_INVARIANT(byte))
272 *(*dest)++ = byte;
273 else {
274 *(*dest)++ = UTF8_EIGHT_BIT_HI(byte);
275 *(*dest)++ = UTF8_EIGHT_BIT_LO(byte);
276 }
277}
278
279/*
280=for apidoc valid_utf8_to_uvchr
281Like L</utf8_to_uvchr_buf>(), but should only be called when it is known that
282the next character in the input UTF-8 string C<s> is well-formed (I<e.g.>,
283it passes C<L</isUTF8_CHAR>>. Surrogates, non-character code points, and
284non-Unicode code points are allowed.
285
286=cut
287
288 */
289
290PERL_STATIC_INLINE UV
291Perl_valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen)
292{
293 UV expectlen = UTF8SKIP(s);
294 const U8* send = s + expectlen;
295 UV uv = *s;
296
297 PERL_ARGS_ASSERT_VALID_UTF8_TO_UVCHR;
298
299 if (retlen) {
300 *retlen = expectlen;
301 }
302
303 /* An invariant is trivially returned */
304 if (expectlen == 1) {
305 return uv;
306 }
307
308 /* Remove the leading bits that indicate the number of bytes, leaving just
309 * the bits that are part of the value */
310 uv = NATIVE_UTF8_TO_I8(uv) & UTF_START_MASK(expectlen);
311
312 /* Now, loop through the remaining bytes, accumulating each into the
313 * working total as we go. (I khw tried unrolling the loop for up to 4
314 * bytes, but there was no performance improvement) */
315 for (++s; s < send; s++) {
316 uv = UTF8_ACCUMULATE(uv, *s);
317 }
318
319 return UNI_TO_NATIVE(uv);
320
321}
322
323/*
324=for apidoc is_utf8_invariant_string
325
326Returns true iff the first C<len> bytes of the string C<s> are the same
327regardless of the UTF-8 encoding of the string (or UTF-EBCDIC encoding on
328EBCDIC machines). That is, if they are UTF-8 invariant. On ASCII-ish
329machines, all the ASCII characters and only the ASCII characters fit this
330definition. On EBCDIC machines, the ASCII-range characters are invariant, but
331so also are the C1 controls and C<\c?> (which isn't in the ASCII range on
332EBCDIC).
333
334If C<len> is 0, it will be calculated using C<strlen(s)>, (which means if you
335use this option, that C<s> can't have embedded C<NUL> characters and has to
336have a terminating C<NUL> byte).
337
338See also L</is_utf8_string>(), L</is_utf8_string_loclen>(), and
339L</is_utf8_string_loc>().
340
341=cut
342*/
343
344PERL_STATIC_INLINE bool
345S_is_utf8_invariant_string(const U8* const s, const STRLEN len)
346{
347 const U8* const send = s + (len ? len : strlen((const char *)s));
348 const U8* x = s;
349
350 PERL_ARGS_ASSERT_IS_UTF8_INVARIANT_STRING;
351
352 for (; x < send; ++x) {
353 if (!UTF8_IS_INVARIANT(*x))
354 return FALSE;
355 }
356
357 return TRUE;
358}
359
360/*
361=for apidoc is_utf8_string
362
363Returns true if the first C<len> bytes of string C<s> form a valid
364UTF-8 string, false otherwise. If C<len> is 0, it will be calculated
365using C<strlen(s)> (which means if you use this option, that C<s> can't have
366embedded C<NUL> characters and has to have a terminating C<NUL> byte). Note
367that all characters being ASCII constitute 'a valid UTF-8 string'.
368
369See also L</is_utf8_invariant_string>(), L</is_utf8_string_loclen>(), and
370L</is_utf8_string_loc>().
371
372=cut
373*/
374
375bool
376Perl_is_utf8_string(const U8 *s, STRLEN len)
377{
378 /* This is now marked pure in embed.fnc, because isUTF8_CHAR now is pure.
379 * Be aware of possible changes to that */
380
381 const U8* const send = s + (len ? len : strlen((const char *)s));
382 const U8* x = s;
383
384 PERL_ARGS_ASSERT_IS_UTF8_STRING;
385
386 while (x < send) {
387 STRLEN len = isUTF8_CHAR(x, send);
388 if (UNLIKELY(! len)) {
389 return FALSE;
390 }
391 x += len;
392 }
393
394 return TRUE;
395}
396
397/*
398Implemented as a macro in utf8.h
399
400=for apidoc is_utf8_string_loc
401
402Like L</is_utf8_string> but stores the location of the failure (in the
403case of "utf8ness failure") or the location C<s>+C<len> (in the case of
404"utf8ness success") in the C<ep>.
405
406See also L</is_utf8_string_loclen>() and L</is_utf8_string>().
407
408=for apidoc is_utf8_string_loclen
409
410Like L</is_utf8_string>() but stores the location of the failure (in the
411case of "utf8ness failure") or the location C<s>+C<len> (in the case of
412"utf8ness success") in the C<ep>, and the number of UTF-8
413encoded characters in the C<el>.
414
415See also L</is_utf8_string_loc>() and L</is_utf8_string>().
416
417=cut
418*/
419
420bool
421Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el)
422{
423 const U8* const send = s + (len ? len : strlen((const char *)s));
424 const U8* x = s;
425 STRLEN outlen = 0;
426
427 PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN;
428
429 while (x < send) {
430 STRLEN len = isUTF8_CHAR(x, send);
431 if (UNLIKELY(! len)) {
432 break;
433 }
434 x += len;
435 outlen++;
436 }
437
438 if (el)
439 *el = outlen;
440
441 if (ep) {
442 *ep = x;
443 }
444
445 return (x == send);
446}
447
448/*
449=for apidoc utf8_distance
450
451Returns the number of UTF-8 characters between the UTF-8 pointers C<a>
452and C<b>.
453
454WARNING: use only if you *know* that the pointers point inside the
455same UTF-8 buffer.
456
457=cut
458*/
459
460PERL_STATIC_INLINE IV
461Perl_utf8_distance(pTHX_ const U8 *a, const U8 *b)
462{
463 PERL_ARGS_ASSERT_UTF8_DISTANCE;
464
465 return (a < b) ? -1 * (IV) utf8_length(a, b) : (IV) utf8_length(b, a);
466}
467
468/*
469=for apidoc utf8_hop
470
471Return the UTF-8 pointer C<s> displaced by C<off> characters, either
472forward or backward.
473
474WARNING: do not use the following unless you *know* C<off> is within
475the UTF-8 data pointed to by C<s> *and* that on entry C<s> is aligned
476on the first byte of character or just after the last byte of a character.
477
478=cut
479*/
480
481PERL_STATIC_INLINE U8 *
482Perl_utf8_hop(const U8 *s, SSize_t off)
483{
484 PERL_ARGS_ASSERT_UTF8_HOP;
485
486 /* Note: cannot use UTF8_IS_...() too eagerly here since e.g
487 * the bitops (especially ~) can create illegal UTF-8.
488 * In other words: in Perl UTF-8 is not just for Unicode. */
489
490 if (off >= 0) {
491 while (off--)
492 s += UTF8SKIP(s);
493 }
494 else {
495 while (off++) {
496 s--;
497 while (UTF8_IS_CONTINUATION(*s))
498 s--;
499 }
500 }
501 return (U8 *)s;
502}
503
504/*
505
506=for apidoc is_utf8_valid_partial_char
507
508Returns 1 if the first few bytes of the string starting at C<s> and
509looking no further than S<C<e - 1>> are legal initial bytes of
510well-formed UTF-8; otherwise it returns 0.
511
512This is useful when some fixed-length buffer is being tested for being
513well-formed UTF-8, but the final few bytes in it are fewer than necessary to
514fully determine what code point they might mean. (Presumably when the buffer
515is refreshed with the next chunk of data, the new first bytes will complete the
516partial code point.) This function is used to verify that the final bytes in
517the current buffer are in fact the legal beginning of some code point, so that
518if they aren't, the failure can be signalled without having to wait for the
519next read.
520
521If the bytes terminated at S<C<e - 1>> are a full character (or more), 0 is
522returned.
523
524=cut
525*/
526bool
527S_is_utf8_valid_partial_char(const U8 * const s, const U8 * const e)
528{
529
530 PERL_ARGS_ASSERT_IS_UTF8_VALID_PARTIAL_CHAR;
531
532 if (s >= e || s + UTF8SKIP(s) >= e) {
533 return FALSE;
534 }
535
536 return cBOOL(_is_utf8_char_slow(s, e - s));
537}
538
539/* ------------------------------- perl.h ----------------------------- */
540
541/*
542=head1 Miscellaneous Functions
543
544=for apidoc AiR|bool|is_safe_syscall|const char *pv|STRLEN len|const char *what|const char *op_name
545
546Test that the given C<pv> doesn't contain any internal C<NUL> characters.
547If it does, set C<errno> to C<ENOENT>, optionally warn, and return FALSE.
548
549Return TRUE if the name is safe.
550
551Used by the C<IS_SAFE_SYSCALL()> macro.
552
553=cut
554*/
555
556PERL_STATIC_INLINE bool
557S_is_safe_syscall(pTHX_ const char *pv, STRLEN len, const char *what, const char *op_name) {
558 /* While the Windows CE API provides only UCS-16 (or UTF-16) APIs
559 * perl itself uses xce*() functions which accept 8-bit strings.
560 */
561
562 PERL_ARGS_ASSERT_IS_SAFE_SYSCALL;
563
564 if (len > 1) {
565 char *null_at;
566 if (UNLIKELY((null_at = (char *)memchr(pv, 0, len-1)) != NULL)) {
567 SETERRNO(ENOENT, LIB_INVARG);
568 Perl_ck_warner(aTHX_ packWARN(WARN_SYSCALLS),
569 "Invalid \\0 character in %s for %s: %s\\0%s",
570 what, op_name, pv, null_at+1);
571 return FALSE;
572 }
573 }
574
575 return TRUE;
576}
577
578/*
579
580Return true if the supplied filename has a newline character
581immediately before the first (hopefully only) NUL.
582
583My original look at this incorrectly used the len from SvPV(), but
584that's incorrect, since we allow for a NUL in pv[len-1].
585
586So instead, strlen() and work from there.
587
588This allow for the user reading a filename, forgetting to chomp it,
589then calling:
590
591 open my $foo, "$file\0";
592
593*/
594
595#ifdef PERL_CORE
596
597PERL_STATIC_INLINE bool
598S_should_warn_nl(const char *pv) {
599 STRLEN len;
600
601 PERL_ARGS_ASSERT_SHOULD_WARN_NL;
602
603 len = strlen(pv);
604
605 return len > 0 && pv[len-1] == '\n';
606}
607
608#endif
609
610/* ------------------ pp.c, regcomp.c, toke.c, universal.c ------------ */
611
612#define MAX_CHARSET_NAME_LENGTH 2
613
614PERL_STATIC_INLINE const char *
615get_regex_charset_name(const U32 flags, STRLEN* const lenp)
616{
617 /* Returns a string that corresponds to the name of the regex character set
618 * given by 'flags', and *lenp is set the length of that string, which
619 * cannot exceed MAX_CHARSET_NAME_LENGTH characters */
620
621 *lenp = 1;
622 switch (get_regex_charset(flags)) {
623 case REGEX_DEPENDS_CHARSET: return DEPENDS_PAT_MODS;
624 case REGEX_LOCALE_CHARSET: return LOCALE_PAT_MODS;
625 case REGEX_UNICODE_CHARSET: return UNICODE_PAT_MODS;
626 case REGEX_ASCII_RESTRICTED_CHARSET: return ASCII_RESTRICT_PAT_MODS;
627 case REGEX_ASCII_MORE_RESTRICTED_CHARSET:
628 *lenp = 2;
629 return ASCII_MORE_RESTRICT_PAT_MODS;
630 }
631 /* The NOT_REACHED; hides an assert() which has a rather complex
632 * definition in perl.h. */
633 NOT_REACHED; /* NOTREACHED */
634 return "?"; /* Unknown */
635}
636
637/*
638
639Return false if any get magic is on the SV other than taint magic.
640
641*/
642
643PERL_STATIC_INLINE bool
644S_sv_only_taint_gmagic(SV *sv) {
645 MAGIC *mg = SvMAGIC(sv);
646
647 PERL_ARGS_ASSERT_SV_ONLY_TAINT_GMAGIC;
648
649 while (mg) {
650 if (mg->mg_type != PERL_MAGIC_taint
651 && !(mg->mg_flags & MGf_GSKIP)
652 && mg->mg_virtual->svt_get) {
653 return FALSE;
654 }
655 mg = mg->mg_moremagic;
656 }
657
658 return TRUE;
659}
660
661/* ------------------ cop.h ------------------------------------------- */
662
663
664/* Enter a block. Push a new base context and return its address. */
665
666PERL_STATIC_INLINE PERL_CONTEXT *
667S_cx_pushblock(pTHX_ U8 type, U8 gimme, SV** sp, I32 saveix)
668{
669 PERL_CONTEXT * cx;
670
671 PERL_ARGS_ASSERT_CX_PUSHBLOCK;
672
673 CXINC;
674 cx = CX_CUR();
675 cx->cx_type = type;
676 cx->blk_gimme = gimme;
677 cx->blk_oldsaveix = saveix;
678 cx->blk_oldsp = (I32)(sp - PL_stack_base);
679 cx->blk_oldcop = PL_curcop;
680 cx->blk_oldmarksp = (I32)(PL_markstack_ptr - PL_markstack);
681 cx->blk_oldscopesp = PL_scopestack_ix;
682 cx->blk_oldpm = PL_curpm;
683 cx->blk_old_tmpsfloor = PL_tmps_floor;
684
685 PL_tmps_floor = PL_tmps_ix;
686 CX_DEBUG(cx, "PUSH");
687 return cx;
688}
689
690
691/* Exit a block (RETURN and LAST). */
692
693PERL_STATIC_INLINE void
694S_cx_popblock(pTHX_ PERL_CONTEXT *cx)
695{
696 PERL_ARGS_ASSERT_CX_POPBLOCK;
697
698 CX_DEBUG(cx, "POP");
699 /* these 3 are common to cx_popblock and cx_topblock */
700 PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp;
701 PL_scopestack_ix = cx->blk_oldscopesp;
702 PL_curpm = cx->blk_oldpm;
703
704 /* LEAVE_SCOPE() should have made this true. /(?{})/ cheats
705 * and leaves a CX entry lying around for repeated use, so
706 * skip for multicall */ \
707 assert( (CxTYPE(cx) == CXt_SUB && CxMULTICALL(cx))
708 || PL_savestack_ix == cx->blk_oldsaveix);
709 PL_curcop = cx->blk_oldcop;
710 PL_tmps_floor = cx->blk_old_tmpsfloor;
711}
712
713/* Continue a block elsewhere (e.g. NEXT, REDO, GOTO).
714 * Whereas cx_popblock() restores the state to the point just before
715 * cx_pushblock() was called, cx_topblock() restores it to the point just
716 * *after* cx_pushblock() was called. */
717
718PERL_STATIC_INLINE void
719S_cx_topblock(pTHX_ PERL_CONTEXT *cx)
720{
721 PERL_ARGS_ASSERT_CX_TOPBLOCK;
722
723 CX_DEBUG(cx, "TOP");
724 /* these 3 are common to cx_popblock and cx_topblock */
725 PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp;
726 PL_scopestack_ix = cx->blk_oldscopesp;
727 PL_curpm = cx->blk_oldpm;
728
729 PL_stack_sp = PL_stack_base + cx->blk_oldsp;
730}
731
732
733PERL_STATIC_INLINE void
734S_cx_pushsub(pTHX_ PERL_CONTEXT *cx, CV *cv, OP *retop, bool hasargs)
735{
736 U8 phlags = CX_PUSHSUB_GET_LVALUE_MASK(Perl_was_lvalue_sub);
737
738 PERL_ARGS_ASSERT_CX_PUSHSUB;
739
740 PERL_DTRACE_PROBE_ENTRY(cv);
741 cx->blk_sub.cv = cv;
742 cx->blk_sub.olddepth = CvDEPTH(cv);
743 cx->blk_sub.prevcomppad = PL_comppad;
744 cx->cx_type |= (hasargs) ? CXp_HASARGS : 0;
745 cx->blk_sub.retop = retop;
746 SvREFCNT_inc_simple_void_NN(cv);
747 cx->blk_u16 = PL_op->op_private & (phlags|OPpDEREF);
748}
749
750
751/* subsets of cx_popsub() */
752
753PERL_STATIC_INLINE void
754S_cx_popsub_common(pTHX_ PERL_CONTEXT *cx)
755{
756 CV *cv;
757
758 PERL_ARGS_ASSERT_CX_POPSUB_COMMON;
759 assert(CxTYPE(cx) == CXt_SUB);
760
761 PL_comppad = cx->blk_sub.prevcomppad;
762 PL_curpad = LIKELY(PL_comppad) ? AvARRAY(PL_comppad) : NULL;
763 cv = cx->blk_sub.cv;
764 CvDEPTH(cv) = cx->blk_sub.olddepth;
765 cx->blk_sub.cv = NULL;
766 SvREFCNT_dec(cv);
767}
768
769
770/* handle the @_ part of leaving a sub */
771
772PERL_STATIC_INLINE void
773S_cx_popsub_args(pTHX_ PERL_CONTEXT *cx)
774{
775 AV *av;
776
777 PERL_ARGS_ASSERT_CX_POPSUB_ARGS;
778 assert(CxTYPE(cx) == CXt_SUB);
779 assert(AvARRAY(MUTABLE_AV(
780 PadlistARRAY(CvPADLIST(cx->blk_sub.cv))[
781 CvDEPTH(cx->blk_sub.cv)])) == PL_curpad);
782
783 CX_POP_SAVEARRAY(cx);
784 av = MUTABLE_AV(PAD_SVl(0));
785 if (UNLIKELY(AvREAL(av)))
786 /* abandon @_ if it got reified */
787 clear_defarray(av, 0);
788 else {
789 CLEAR_ARGARRAY(av);
790 }
791}
792
793
794PERL_STATIC_INLINE void
795S_cx_popsub(pTHX_ PERL_CONTEXT *cx)
796{
797 PERL_ARGS_ASSERT_CX_POPSUB;
798 assert(CxTYPE(cx) == CXt_SUB);
799
800 PERL_DTRACE_PROBE_RETURN(cx->blk_sub.cv);
801
802 if (CxHASARGS(cx))
803 cx_popsub_args(cx);
804 cx_popsub_common(cx);
805}
806
807
808PERL_STATIC_INLINE void
809S_cx_pushformat(pTHX_ PERL_CONTEXT *cx, CV *cv, OP *retop, GV *gv)
810{
811 PERL_ARGS_ASSERT_CX_PUSHFORMAT;
812
813 cx->blk_format.cv = cv;
814 cx->blk_format.retop = retop;
815 cx->blk_format.gv = gv;
816 cx->blk_format.dfoutgv = PL_defoutgv;
817 cx->blk_format.prevcomppad = PL_comppad;
818 cx->blk_u16 = 0;
819
820 SvREFCNT_inc_simple_void_NN(cv);
821 CvDEPTH(cv)++;
822 SvREFCNT_inc_void(cx->blk_format.dfoutgv);
823}
824
825
826PERL_STATIC_INLINE void
827S_cx_popformat(pTHX_ PERL_CONTEXT *cx)
828{
829 CV *cv;
830 GV *dfout;
831
832 PERL_ARGS_ASSERT_CX_POPFORMAT;
833 assert(CxTYPE(cx) == CXt_FORMAT);
834
835 dfout = cx->blk_format.dfoutgv;
836 setdefout(dfout);
837 cx->blk_format.dfoutgv = NULL;
838 SvREFCNT_dec_NN(dfout);
839
840 PL_comppad = cx->blk_format.prevcomppad;
841 PL_curpad = LIKELY(PL_comppad) ? AvARRAY(PL_comppad) : NULL;
842 cv = cx->blk_format.cv;
843 cx->blk_format.cv = NULL;
844 --CvDEPTH(cv);
845 SvREFCNT_dec_NN(cv);
846}
847
848
849PERL_STATIC_INLINE void
850S_cx_pusheval(pTHX_ PERL_CONTEXT *cx, OP *retop, SV *namesv)
851{
852 PERL_ARGS_ASSERT_CX_PUSHEVAL;
853
854 cx->blk_eval.retop = retop;
855 cx->blk_eval.old_namesv = namesv;
856 cx->blk_eval.old_eval_root = PL_eval_root;
857 cx->blk_eval.cur_text = PL_parser ? PL_parser->linestr : NULL;
858 cx->blk_eval.cv = NULL; /* later set by doeval_compile() */
859 cx->blk_eval.cur_top_env = PL_top_env;
860
861 assert(!(PL_in_eval & ~ 0x7F));
862 assert(!(PL_op->op_type & ~0x1FF));
863 cx->blk_u16 = (PL_in_eval & 0x7F) | ((U16)PL_op->op_type << 7);
864}
865
866
867PERL_STATIC_INLINE void
868S_cx_popeval(pTHX_ PERL_CONTEXT *cx)
869{
870 SV *sv;
871
872 PERL_ARGS_ASSERT_CX_POPEVAL;
873 assert(CxTYPE(cx) == CXt_EVAL);
874
875 PL_in_eval = CxOLD_IN_EVAL(cx);
876 PL_eval_root = cx->blk_eval.old_eval_root;
877 sv = cx->blk_eval.cur_text;
878 if (sv && SvSCREAM(sv)) {
879 cx->blk_eval.cur_text = NULL;
880 SvREFCNT_dec_NN(sv);
881 }
882
883 sv = cx->blk_eval.old_namesv;
884 if (sv) {
885 cx->blk_eval.old_namesv = NULL;
886 SvREFCNT_dec_NN(sv);
887 }
888}
889
890
891/* push a plain loop, i.e.
892 * { block }
893 * while (cond) { block }
894 * for (init;cond;continue) { block }
895 * This loop can be last/redo'ed etc.
896 */
897
898PERL_STATIC_INLINE void
899S_cx_pushloop_plain(pTHX_ PERL_CONTEXT *cx)
900{
901 PERL_ARGS_ASSERT_CX_PUSHLOOP_PLAIN;
902 cx->blk_loop.my_op = cLOOP;
903}
904
905
906/* push a true for loop, i.e.
907 * for var (list) { block }
908 */
909
910PERL_STATIC_INLINE void
911S_cx_pushloop_for(pTHX_ PERL_CONTEXT *cx, void *itervarp, SV* itersave)
912{
913 PERL_ARGS_ASSERT_CX_PUSHLOOP_FOR;
914
915 /* this one line is common with cx_pushloop_plain */
916 cx->blk_loop.my_op = cLOOP;
917
918 cx->blk_loop.itervar_u.svp = (SV**)itervarp;
919 cx->blk_loop.itersave = itersave;
920#ifdef USE_ITHREADS
921 cx->blk_loop.oldcomppad = PL_comppad;
922#endif
923}
924
925
926/* pop all loop types, including plain */
927
928PERL_STATIC_INLINE void
929S_cx_poploop(pTHX_ PERL_CONTEXT *cx)
930{
931 PERL_ARGS_ASSERT_CX_POPLOOP;
932
933 assert(CxTYPE_is_LOOP(cx));
934 if ( CxTYPE(cx) == CXt_LOOP_ARY
935 || CxTYPE(cx) == CXt_LOOP_LAZYSV)
936 {
937 /* Free ary or cur. This assumes that state_u.ary.ary
938 * aligns with state_u.lazysv.cur. See cx_dup() */
939 SV *sv = cx->blk_loop.state_u.lazysv.cur;
940 cx->blk_loop.state_u.lazysv.cur = NULL;
941 SvREFCNT_dec_NN(sv);
942 if (CxTYPE(cx) == CXt_LOOP_LAZYSV) {
943 sv = cx->blk_loop.state_u.lazysv.end;
944 cx->blk_loop.state_u.lazysv.end = NULL;
945 SvREFCNT_dec_NN(sv);
946 }
947 }
948 if (cx->cx_type & (CXp_FOR_PAD|CXp_FOR_GV)) {
949 SV *cursv;
950 SV **svp = (cx)->blk_loop.itervar_u.svp;
951 if ((cx->cx_type & CXp_FOR_GV))
952 svp = &GvSV((GV*)svp);
953 cursv = *svp;
954 *svp = cx->blk_loop.itersave;
955 cx->blk_loop.itersave = NULL;
956 SvREFCNT_dec(cursv);
957 }
958}
959
960
961PERL_STATIC_INLINE void
962S_cx_pushwhen(pTHX_ PERL_CONTEXT *cx)
963{
964 PERL_ARGS_ASSERT_CX_PUSHWHEN;
965
966 cx->blk_givwhen.leave_op = cLOGOP->op_other;
967}
968
969
970PERL_STATIC_INLINE void
971S_cx_popwhen(pTHX_ PERL_CONTEXT *cx)
972{
973 PERL_ARGS_ASSERT_CX_POPWHEN;
974 assert(CxTYPE(cx) == CXt_WHEN);
975
976 PERL_UNUSED_ARG(cx);
977 PERL_UNUSED_CONTEXT;
978 /* currently NOOP */
979}
980
981
982PERL_STATIC_INLINE void
983S_cx_pushgiven(pTHX_ PERL_CONTEXT *cx, SV *orig_defsv)
984{
985 PERL_ARGS_ASSERT_CX_PUSHGIVEN;
986
987 cx->blk_givwhen.leave_op = cLOGOP->op_other;
988 cx->blk_givwhen.defsv_save = orig_defsv;
989}
990
991
992PERL_STATIC_INLINE void
993S_cx_popgiven(pTHX_ PERL_CONTEXT *cx)
994{
995 SV *sv;
996
997 PERL_ARGS_ASSERT_CX_POPGIVEN;
998 assert(CxTYPE(cx) == CXt_GIVEN);
999
1000 sv = GvSV(PL_defgv);
1001 GvSV(PL_defgv) = cx->blk_givwhen.defsv_save;
1002 cx->blk_givwhen.defsv_save = NULL;
1003 SvREFCNT_dec(sv);
1004}
1005
1006/*
1007 * ex: set ts=8 sts=4 sw=4 et:
1008 */