xref: /openbsd-src/gnu/usr.bin/perl/t/op/catch.t (revision f2a19305cfc49ea4d1a5feb55cd6c283c6f1e031)
15759b3d2Safresh1#!perl
25759b3d2Safresh1
3*f2a19305Safresh1# Test that exception catching is set up early enough when executing
4*f2a19305Safresh1# pp_entereval() etc. There used to be a gap where an exception could
5*f2a19305Safresh1# be raised before perl was ready to catch it.
6*f2a19305Safresh1#
7*f2a19305Safresh1# RT #105930: eval 'UNITCHECK{die}' crashes inside FETCH
8*f2a19305Safresh1
95759b3d2Safresh1BEGIN {
105759b3d2Safresh1    chdir 't' if -d 't';
115759b3d2Safresh1    require './test.pl';
125759b3d2Safresh1    set_up_inc('../lib');
135759b3d2Safresh1}
145759b3d2Safresh1
155759b3d2Safresh1use warnings;
165759b3d2Safresh1use strict;
175759b3d2Safresh1
185759b3d2Safresh1plan 12;
195759b3d2Safresh1
205759b3d2Safresh1{
215759b3d2Safresh1    package EvalOnFetch;
225759b3d2Safresh1    sub TIESCALAR { bless \(my $z = $_[1]), $_[0] }
235759b3d2Safresh1    sub FETCH { eval ${$_[0]} // "died" }
245759b3d2Safresh1}
255759b3d2Safresh1
265759b3d2Safresh1tie my $begindie, "EvalOnFetch", "BEGIN { die } 123";
275759b3d2Safresh1is "$begindie", "died";
285759b3d2Safresh1tie my $unitcheckdie, "EvalOnFetch", "UNITCHECK { die } 123";
295759b3d2Safresh1is "$unitcheckdie", "died";
305759b3d2Safresh1tie my $rundie, "EvalOnFetch", "die; 123";
315759b3d2Safresh1is "$rundie", "died";
325759b3d2Safresh1tie my $runok, "EvalOnFetch", "123";
335759b3d2Safresh1is "$runok", 123;
345759b3d2Safresh1
355759b3d2Safresh1eval { undef };
365759b3d2Safresh1is eval "BEGIN { die } 123", undef;
375759b3d2Safresh1is eval "UNITCHECK { die } 123", undef;
385759b3d2Safresh1is eval "die; 123", undef;
395759b3d2Safresh1is eval "123", 123;
405759b3d2Safresh1
415759b3d2Safresh1{
425759b3d2Safresh1    package TryOnFetch;
435759b3d2Safresh1    sub TIESCALAR { bless \(my $z = $_[1]), $_[0] }
445759b3d2Safresh1    sub FETCH { eval { ${$_[0]} ? die : undef; 123 } // "died" }
455759b3d2Safresh1}
465759b3d2Safresh1
475759b3d2Safresh1tie my $trydie, "TryOnFetch", 1;
485759b3d2Safresh1is "$trydie", "died";
495759b3d2Safresh1tie my $tryok, "TryOnFetch", 0;
505759b3d2Safresh1is "$tryok", 123;
515759b3d2Safresh1
525759b3d2Safresh1eval { undef };
535759b3d2Safresh1is do { eval { die; 123 } }, undef;
545759b3d2Safresh1is do { eval { undef; 123 } }, 123;
555759b3d2Safresh1
565759b3d2Safresh11;
57