mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
unexpect break/next/redo/retry should raise LocalJumpError
This commit is contained in:
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user