summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-10-20 03:59:13 +0900
committerYukihiro Matsumoto <[email protected]>2012-10-20 03:59:13 +0900
commit89a18e4f22de80b836f9d6c3167d71b7078a31bb (patch)
treee16221399143312f3974d48d269c9bcc300195ce
parent9bb6f0b3314d438e93ec79ae763ac57a559284bc (diff)
downloadmruby-89a18e4f22de80b836f9d6c3167d71b7078a31bb.tar.gz
mruby-89a18e4f22de80b836f9d6c3167d71b7078a31bb.zip
unexpect break/next/redo/retry should raise LocalJumpError
-rw-r--r--src/codegen.c2
-rw-r--r--src/vm.c8
-rw-r--r--test/t/localjumperror.rb7
-rw-r--r--test/t/runtimeerror.rb10
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
diff --git a/src/vm.c b/src/vm.c
index a779565be..a68d089cc 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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