1################################################################################ 2## 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. 6## 7## This program is free software; you can redistribute it and/or 8## modify it under the same terms as Perl itself. 9## 10################################################################################ 11 12=provides 13 14dXCPT 15XCPT_TRY_START 16XCPT_TRY_END 17XCPT_CATCH 18XCPT_RETHROW 19 20=implementation 21 22#ifdef NO_XSLOCKS 23# ifdef dJMPENV 24# define dXCPT dJMPENV; int rEtV = 0 25# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) 26# define XCPT_TRY_END JMPENV_POP; 27# define XCPT_CATCH if (rEtV != 0) 28# define XCPT_RETHROW JMPENV_JUMP(rEtV) 29# else 30# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 31# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) 32# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); 33# define XCPT_CATCH if (rEtV != 0) 34# define XCPT_RETHROW Siglongjmp(top_env, rEtV) 35# endif 36#endif 37 38=xsmisc 39 40/* defined in module3.c */ 41int exception(int throw_e); 42 43=xsubs 44 45int 46exception(throw_e) 47 int throw_e 48 OUTPUT: 49 RETVAL 50 51=tests plan => 7 52 53my $rv; 54 55$Devel::PPPort::exception_caught = undef; 56 57$rv = eval { &Devel::PPPort::exception(0) }; 58is($@, ''); 59ok(defined $rv); 60is($rv, 42); 61is($Devel::PPPort::exception_caught, 0); 62 63$Devel::PPPort::exception_caught = undef; 64 65$rv = eval { &Devel::PPPort::exception(1) }; 66is($@, "boo\n"); 67ok(not defined $rv); 68is($Devel::PPPort::exception_caught, 1); 69