diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-10-31 06:53:22 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-10-31 06:53:22 +0000 |
commit | c0fe73989d3027f0d7c196d01951ece6d112d98b (patch) | |
tree | 031753e82307ea804a9846f7fad1907d08bfdb21 /eval.c | |
parent | 4c9362b74fe837475fe0ab647ba48eee07d69f9f (diff) |
* 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: svn+ssh://ci.ruby-lang.org/ruby/trunk@1807 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -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 |