|
2 | 2 |
|
3 | 3 | # Tests for try and catch
|
4 | 4 |
|
5 |
| -plan(32); |
| 5 | +plan(43); |
6 | 6 |
|
7 | 7 | sub oops($msg = "oops!") { # throw an exception
|
8 | 8 | nqp::die($msg);
|
@@ -241,3 +241,68 @@ ok($result_str ~ '' eq '', "we get correct return value from a try that catches
|
241 | 241 | }
|
242 | 242 | nqp::handle(block(), 'CATCH', catch());
|
243 | 243 | }
|
| 244 | + |
| 245 | +sub THROW(int $type, $arg) { |
| 246 | + my $ex := nqp::newexception(); |
| 247 | + nqp::setpayload($ex, $arg); |
| 248 | + nqp::setextype($ex, $type); |
| 249 | + nqp::throw($ex); |
| 250 | + $arg; |
| 251 | +} |
| 252 | + |
| 253 | +my $next_payload; |
| 254 | +my $redo_payload; |
| 255 | +my $last_payload; |
| 256 | +my $return_payload; |
| 257 | +my $take_payload; |
| 258 | +my $warn_payload; |
| 259 | +my $succeed_payload; |
| 260 | +my $proceed_payload; |
| 261 | +my $emit_payload; |
| 262 | +my $done_payload; |
| 263 | + |
| 264 | +sub handle($throws) { |
| 265 | + nqp::handle( |
| 266 | + $throws(), |
| 267 | + 'NEXT', $next_payload := nqp::getpayload(nqp::exception()), |
| 268 | + 'REDO', $redo_payload := nqp::getpayload(nqp::exception()), |
| 269 | + 'LAST', $last_payload := nqp::getpayload(nqp::exception()), |
| 270 | + 'RETURN', $return_payload := nqp::getpayload(nqp::exception()), |
| 271 | + 'TAKE', $take_payload := nqp::getpayload(nqp::exception()), |
| 272 | + 'WARN', $warn_payload := nqp::getpayload(nqp::exception()), |
| 273 | + 'SUCCEED', $succeed_payload := nqp::getpayload(nqp::exception()), |
| 274 | + 'PROCEED', $proceed_payload := nqp::getpayload(nqp::exception()), |
| 275 | + 'EMIT', $emit_payload := nqp::getpayload(nqp::exception()), |
| 276 | + 'DONE', $done_payload := nqp::getpayload(nqp::exception()), |
| 277 | + ); |
| 278 | +} |
| 279 | + |
| 280 | +handle(-> { THROW(nqp::const::CONTROL_NEXT, 'next'); }); |
| 281 | +handle(-> { THROW(nqp::const::CONTROL_REDO, 'redo'); }); |
| 282 | +handle(-> { THROW(nqp::const::CONTROL_LAST, 'last'); }); |
| 283 | +handle(-> { THROW(nqp::const::CONTROL_RETURN, 'return'); }); |
| 284 | +handle(-> { THROW(nqp::const::CONTROL_TAKE, 'take'); }); |
| 285 | +handle(-> { THROW(nqp::const::CONTROL_WARN, 'warn'); }); |
| 286 | +handle(-> { THROW(nqp::const::CONTROL_SUCCEED, 'succeed'); }); |
| 287 | +handle(-> { THROW(nqp::const::CONTROL_PROCEED, 'proceed'); }); |
| 288 | +handle(-> { THROW(nqp::const::CONTROL_EMIT, 'emit'); }); |
| 289 | +handle(-> { THROW(nqp::const::CONTROL_DONE, 'done'); }); |
| 290 | + |
| 291 | +is($next_payload, 'next', 'caught NEXT exception'); |
| 292 | +is($redo_payload, 'redo', 'caught REDO exception'); |
| 293 | +is($last_payload, 'last', 'caught LAST exception'); |
| 294 | +is($return_payload, 'return', 'caught RETURN exception'); |
| 295 | +is($take_payload, 'take', 'caught TAKE exception'); |
| 296 | +is($warn_payload, 'warn', 'caught WARN exception'); |
| 297 | +is($succeed_payload, 'succeed', 'caught SUCCEED exception'); |
| 298 | +is($proceed_payload, 'proceed', 'caught PROCEED exception'); |
| 299 | +is($emit_payload, 'emit', 'caught EMIT exception'); |
| 300 | +is($done_payload, 'done', 'caught DONE exception'); |
| 301 | + |
| 302 | +my $control_payload; |
| 303 | +{ |
| 304 | + THROW(nqp::const::CONTROL_NEXT, 'fancy payload'); |
| 305 | + CONTROL { $control_payload := $!; } |
| 306 | +} |
| 307 | + |
| 308 | +is(nqp::getpayload($control_payload), 'fancy payload', 'CONTROL block works'); |
0 commit comments