summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/codegen.c38
-rw-r--r--test/t/exception.rb36
2 files changed, 58 insertions, 16 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 20799f9ae..117588b6e 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -834,28 +834,34 @@ codegen(codegen_scope *s, node *tree, int val)
push();
while (n2) {
node *n3 = n2->car;
+ node *n4 = n3->car;
if (pos1) dispatch(s, pos1);
- if (n3->car) {
- node *n4 = n3->car;
-
- pos2 = 0;
- while (n4) {
+ pos2 = 0;
+ do {
+ if (n4) {
codegen(s, n4->car, VAL);
- genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
+ }
+ else {
+ genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern(s->mrb, "StandardError"))));
push();
- genop(s, MKOP_A(OP_LOADNIL, cursp()));
- pop(); pop();
- genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "===")), 1));
- tmp = new_label(s);
- genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
- pos2 = tmp;
+ }
+ genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
+ push();
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
+ pop(); pop();
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern(s->mrb, "===")), 1));
+ tmp = new_label(s);
+ genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
+ pos2 = tmp;
+ if (n4) {
n4 = n4->cdr;
}
- pos1 = new_label(s);
- genop(s, MKOP_Bx(OP_JMP, 0));
- dispatch_linked(s, pos2);
- }
+ } while (n4);
+ pos1 = new_label(s);
+ genop(s, MKOP_Bx(OP_JMP, 0));
+ dispatch_linked(s, pos2);
+
pop();
if (n3->cdr->car) {
gen_assignment(s, n3->cdr->car, exc, NOVAL);
diff --git a/test/t/exception.rb b/test/t/exception.rb
index 6b46314d0..d68ed8bd7 100644
--- a/test/t/exception.rb
+++ b/test/t/exception.rb
@@ -193,3 +193,39 @@ assert('Exception 10') do
7+7
end == 12
end
+
+assert('Exception 11') do
+ a = :ok
+ begin
+ begin
+ raise Exception
+ rescue
+ a = :ng
+ end
+ rescue Exception
+ end
+ a == :ok
+end
+
+assert('Exception 12') do
+ a = :ok
+ begin
+ raise Exception rescue a = :ng
+ rescue Exception
+ end
+ a == :ok
+end
+
+assert('Exception 13') do
+ a = :ng
+ begin
+ raise StandardError
+ rescue TypeError, ArgumentError
+ a = :ng
+ rescue
+ a = :ok
+ else
+ a = :ng
+ end
+ a == :ok
+end