diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-10-20 03:59:13 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-10-20 03:59:13 +0900 |
| commit | 89a18e4f22de80b836f9d6c3167d71b7078a31bb (patch) | |
| tree | e16221399143312f3974d48d269c9bcc300195ce | |
| parent | 9bb6f0b3314d438e93ec79ae763ac57a559284bc (diff) | |
| download | mruby-89a18e4f22de80b836f9d6c3167d71b7078a31bb.tar.gz mruby-89a18e4f22de80b836f9d6c3167d71b7078a31bb.zip | |
unexpect break/next/redo/retry should raise LocalJumpError
| -rw-r--r-- | src/codegen.c | 2 | ||||
| -rw-r--r-- | src/vm.c | 8 | ||||
| -rw-r--r-- | test/t/localjumperror.rb | 7 | ||||
| -rw-r--r-- | test/t/runtimeerror.rb | 10 |
4 files changed, 15 insertions, 12 deletions
diff --git a/src/codegen.c b/src/codegen.c index 19a5835fa..2482209cc 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -911,7 +911,7 @@ raise_error(codegen_scope *s, const char *msg) { int idx = new_lit(s, mrb_str_new_cstr(s->mrb, msg)); - genop(s, MKOP_ABx(OP_ERR, 0, idx)); + genop(s, MKOP_ABx(OP_ERR, 1, idx)); } static double @@ -1817,8 +1817,14 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) CASE(OP_ERR) { /* Bx raise RuntimeError with message Lit(Bx) */ mrb_value msg = pool[GETARG_Bx(i)]; - mrb_value exc = mrb_exc_new3(mrb, E_RUNTIME_ERROR, msg); + mrb_value exc; + if (GETARG_A(i) == 0) { + exc = mrb_exc_new3(mrb, E_RUNTIME_ERROR, msg); + } + else { + exc = mrb_exc_new3(mrb, E_LOCALJUMP_ERROR, msg); + } mrb->exc = (struct RObject*)mrb_object(exc); goto L_RAISE; } diff --git a/test/t/localjumperror.rb b/test/t/localjumperror.rb index 9d1df9594..ebcec0670 100644 --- a/test/t/localjumperror.rb +++ b/test/t/localjumperror.rb @@ -2,7 +2,12 @@ # LocalJumpError ISO Test assert('LocalJumoError', '15.2.25') do - LocalJumpError.class == Class + begin + # this will cause an exception due to the wrong location + retry + rescue => e1 + end + LocalJumpError.class == Class and e1.class == LocalJumpError end # TODO 15.2.25.2.1 LocalJumpError#exit_value diff --git a/test/t/runtimeerror.rb b/test/t/runtimeerror.rb index 9157293cd..3e0636186 100644 --- a/test/t/runtimeerror.rb +++ b/test/t/runtimeerror.rb @@ -2,13 +2,5 @@ # RuntimeError ISO Test assert('RuntimeError', '15.2.28') do - e2 = nil - begin - # this will cause an exception due to the wrong location - retry - rescue => e1 - e2 = e1 - end - - RuntimeError.class == Class and e2.class == RuntimeError + RuntimeError.class == Class end |
