summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorMasamitsu MURASE <[email protected]>2013-01-19 23:15:20 +0900
committerMasamitsu MURASE <[email protected]>2013-01-19 23:16:03 +0900
commit0dd9a0fd6a24399852e7dda3f87700bb6f283574 (patch)
tree0faf2da72f8911da9d062c84e73d7fda244071d2 /src/vm.c
parent583983385b81c21f82704b116eab52d606a609f4 (diff)
downloadmruby-0dd9a0fd6a24399852e7dda3f87700bb6f283574.tar.gz
mruby-0dd9a0fd6a24399852e7dda3f87700bb6f283574.zip
Modify handling of OP_ENTER.
If `argc` is `-1`, `block` parameter is sometimes overwritten.
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/vm.c b/src/vm.c
index 8ae28ef5e..696b566c8 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1121,6 +1121,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
}
else {
if (argv0 != argv) {
+ regs[len+1] = *blk; /* move block */
memmove(&regs[1], argv, sizeof(mrb_value)*(m1+o)); /* m1 + o */
}
if (r) { /* r */
@@ -1129,7 +1130,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
if (m2) {
memmove(&regs[m1+o+r+1], &argv[argc-m2], sizeof(mrb_value)*m2);
}
- regs[len+1] = *blk; /* move block */
+ if (argv0 == argv) {
+ regs[len+1] = *blk; /* move block */
+ }
pc += o + 1;
}
JUMP;