diff options
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 49 |
1 files changed, 25 insertions, 24 deletions
@@ -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 |