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