summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authoreban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-13 10:29:43 +0000
committereban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-13 10:29:43 +0000
commitdc5ea1179a22c0cf2acabae805c6d823469a7c0f (patch)
tree60d770b1e776e37fbfbc2ca9c313e8004a1f5985 /eval.c
parentd5188667bc966360e4feca9d3c46b357d2dd8d47 (diff)
* eval.c (blk_copy_prev): need frame_dup(). [ruby-dev:24103]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6901 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c49
1 files changed, 25 insertions, 24 deletions
diff --git a/eval.c b/eval.c
index 94060c8d54..040284f4b8 100644
--- a/eval.c
+++ b/eval.c
@@ -7756,6 +7756,30 @@ blk_free(data)
}
static void
+frame_dup(frame)
+ struct FRAME *frame;
+{
+ VALUE *argv;
+ struct FRAME *tmp;
+
+ for (;;) {
+ if (frame->argc > 0) {
+ argv = ALLOC_N(VALUE, frame->argc);
+ MEMCPY(argv, frame->argv, VALUE, frame->argc);
+ frame->argv = argv;
+ frame->flags |= FRAME_MALLOC;
+ }
+ 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;
{
@@ -7771,6 +7795,7 @@ blk_copy_prev(block)
tmp->frame.flags |= FRAME_MALLOC;
}
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;
@@ -7782,30 +7807,6 @@ blk_copy_prev(block)
}
}
-static void
-frame_dup(frame)
- struct FRAME *frame;
-{
- VALUE *argv;
- struct FRAME *tmp;
-
- for (;;) {
- if (frame->argc > 0) {
- argv = ALLOC_N(VALUE, frame->argc);
- MEMCPY(argv, frame->argv, VALUE, frame->argc);
- frame->argv = argv;
- frame->flags |= FRAME_MALLOC;
- }
- 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