summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/vm.c2
-rw-r--r--test/t/exception.rb27
-rw-r--r--tools/mrbc/mrbc.c8
3 files changed, 33 insertions, 4 deletions
diff --git a/src/vm.c b/src/vm.c
index 9224c7a40..e3c53d4a2 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1219,9 +1219,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
while (ci[0].ridx == ci[-1].ridx) {
cipop(mrb);
ci = mrb->ci;
+ mrb->stack = mrb->stbase + ci[1].stackidx;
if (ci[1].acc < 0 && prev_jmp) {
mrb->jmp = prev_jmp;
- mrb->stack = mrb->stbase + ci[1].stackidx;
longjmp(*(jmp_buf*)mrb->jmp, 1);
}
while (eidx > mrb->ci->eidx) {
diff --git a/test/t/exception.rb b/test/t/exception.rb
index d43ce8833..5d46d4632 100644
--- a/test/t/exception.rb
+++ b/test/t/exception.rb
@@ -315,6 +315,33 @@ assert('Exception 18') do
end == 3
end
+assert('Exception 19') do
+ class Class4Exception19
+ def a
+ r = @e = false
+ begin
+ b
+ rescue TypeError
+ r = self.z
+ end
+ [ r, @e ]
+ end
+
+ def b
+ begin
+ 1 * "b"
+ ensure
+ @e = self.z
+ end
+ end
+
+ def z
+ true
+ end
+ end
+ Class4Exception19.new.a == [true, true]
+end
+
assert('Exception#inspect without message') do
Exception.new.inspect
end
diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c
index 4e17d6890..4803b5db7 100644
--- a/tools/mrbc/mrbc.c
+++ b/tools/mrbc/mrbc.c
@@ -8,6 +8,7 @@
#define RITEBIN_EXT ".mrb"
#define C_EXT ".c"
+
void mrb_show_version(mrb_state *);
void mrb_show_copyright(mrb_state *);
void parser_dump(mrb_state*, struct mrb_ast_node*, int);
@@ -31,7 +32,7 @@ usage(const char *name)
"switches:",
"-c check syntax only",
"-o<outfile> place the output into <outfile>",
- "-v print version number, then trun on verbose mode",
+ "-v print version number, then turn on verbose mode",
"-g produce debugging information",
"-B<symbol> binary <symbol> output in C language format",
"--verbose run at verbose mode",
@@ -43,7 +44,7 @@ usage(const char *name)
printf("Usage: %s [switches] programfile\n", name);
while(*p)
- printf(" %s\n", *p++);
+ printf(" %s\n", *p++);
}
static char *
@@ -162,7 +163,8 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
goto exit;
}
}
- exit:
+
+exit:
if (outfile && infile != outfile) mrb_free(mrb, outfile);
return result;
}