The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

dXCPT XCPT_TRY_START XCPT_TRY_END XCPT_CATCH XCPT_RETHROW

#ifdef dJMPENV

# ifndef dXCPT # define dXCPT dJMPENV; int rEtV = 0 # define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) # define XCPT_TRY_END JMPENV_POP; # define XCPT_CATCH if (rEtV != 0) # define XCPT_RETHROW JMPENV_JUMP(rEtV) # endif

#else

# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 # define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) # define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); # define XCPT_CATCH if (rEtV != 0) # define XCPT_RETHROW Siglongjmp(top_env, rEtV)

#endif

static void throws_exception(int throw_e) { if (throw_e) croak("boo\n"); }

static int exception(int throw_e) { dTHR; dXCPT; SV *caught = get_sv("Devel::PPPort::exception_caught", 0);

  XCPT_TRY_START {
    throws_exception(throw_e);
  } XCPT_TRY_END

  XCPT_CATCH
  {
    sv_setiv(caught, 1);
    XCPT_RETHROW;
  }

  sv_setiv(caught, 0);

  return 42;
}

int exception(throw_e) int throw_e OUTPUT: RETVAL

my $rv;

$Devel::PPPort::exception_caught = undef;

$rv = eval { &Devel::PPPort::exception(0) }; ok($@, ''); ok(defined $rv); ok($rv, 42); ok($Devel::PPPort::exception_caught, 0);

$Devel::PPPort::exception_caught = undef;

$rv = eval { &Devel::PPPort::exception(1) }; ok($@, "boo\n"); ok(not defined $rv); ok($Devel::PPPort::exception_caught, 1);

5 POD Errors

The following errors were encountered while parsing the POD:

Around line 18:

Unknown directive: =provides

Around line 26:

Unknown directive: =implementation

Around line 48:

Unknown directive: =xsmisc

Around line 77:

Unknown directive: =xsubs

Around line 85:

Unknown directive: =tests