From 35bc1df02607792b9534f7f45bf7c80174fb97a4 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 31 Oct 2001 06:53:22 +0000 Subject: * eval.c (POP_VARS): should not set DVAR_DONT_RECYCLE if _old ruby_vars is already force_recycled. * gc.c (rb_gc): handles mark stack overflow. * gc.c (PUSH_MARK): use static mark stack, no more recursion. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@1807 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index e27020926..bea650cc5 100644 --- a/eval.c +++ b/eval.c @@ -594,15 +594,17 @@ new_blktag() } struct RVarmap *ruby_dyna_vars; -#define PUSH_VARS() { \ - struct RVarmap * volatile _old; \ - _old = ruby_dyna_vars; \ +#define PUSH_VARS() { \ + struct RVarmap * volatile _old; \ + _old = ruby_dyna_vars; \ ruby_dyna_vars = 0; -#define POP_VARS() \ - if (_old && (ruby_scope->flags & SCOPE_DONT_RECYCLE)) \ - FL_SET(_old, DVAR_DONT_RECYCLE); \ - ruby_dyna_vars = _old; \ +#define POP_VARS() \ + if (_old && (ruby_scope->flags & SCOPE_DONT_RECYCLE)) {\ + if (RBASIC(_old)->flags) /* unless it's already recycled */ \ + FL_SET(_old, DVAR_DONT_RECYCLE); \ + }\ + ruby_dyna_vars = _old; \ } #define DVAR_DONT_RECYCLE FL_USER2 -- cgit