summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--eval.c35
2 files changed, 22 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index c996c5ad36..7f14df485a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Mon Sep 13 19:16:33 2004 WATANABE Hirofumi <eban@ruby-lang.org>
+
+ * eval.c (blk_copy_prev): need frame_dup(). [ruby-dev:24103]
+
Mon Sep 13 16:23:27 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tk/lib/multi-tk.rb: MultiTkIp.new_master and new_slave accept
diff --git a/eval.c b/eval.c
index 7efec7e57b..d4b9589b20 100644
--- a/eval.c
+++ b/eval.c
@@ -7739,6 +7739,23 @@ blk_free(data)
}
static void
+frame_dup(frame)
+ struct FRAME *frame;
+{
+ VALUE *argv;
+ struct FRAME *tmp;
+
+ for (;;) {
+ frame->tmp = 0; /* should not preserve tmp */
+ if (!frame->prev) break;
+ tmp = ALLOC(struct FRAME);
+ *tmp = *frame->prev;
+ frame->prev = tmp;
+ frame = tmp;
+ }
+}
+
+static void
blk_copy_prev(block)
struct BLOCK *block;
{
@@ -7749,6 +7766,7 @@ blk_copy_prev(block)
tmp = ALLOC_N(struct BLOCK, 1);
MEMCPY(tmp, block->prev, struct BLOCK, 1);
scope_dup(tmp->scope);
+ frame_dup(&tmp->frame);
for (vars = tmp->dyna_vars; vars; vars = vars->next) {
if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
@@ -7760,23 +7778,6 @@ blk_copy_prev(block)
}
}
-static void
-frame_dup(frame)
- struct FRAME *frame;
-{
- VALUE *argv;
- struct FRAME *tmp;
-
- for (;;) {
- frame->tmp = 0; /* should not preserve tmp */
- if (!frame->prev) break;
- tmp = ALLOC(struct FRAME);
- *tmp = *frame->prev;
- frame->prev = tmp;
- frame = tmp;
- }
-}
-
/*
* MISSING: documentation