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 | 35bc1df02607792b9534f7f45bf7c80174fb97a4 (patch) | |
| tree | 031753e82307ea804a9846f7fad1907d08bfdb21 /eval.c | |
| parent | 28fd3752ea278fc965227fa94faf4d11de9320a1 (diff) | |
| download | ruby-35bc1df02607792b9534f7f45bf7c80174fb97a4.tar.gz ruby-35bc1df02607792b9534f7f45bf7c80174fb97a4.tar.xz ruby-35bc1df02607792b9534f7f45bf7c80174fb97a4.zip | |
* 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
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 |
