diff options
author | wyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-07-10 18:31:58 +0000 |
---|---|---|
committer | wyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-07-10 18:31:58 +0000 |
commit | 919887813900fa61026f072a5cbcfd7ad873ea97 (patch) | |
tree | 9eab32003eccefe34fd9a27b0050e7e616ea9580 | |
parent | 665787ea4e0cef0157d6f4a6bca65973ce8839be (diff) |
Fix method scoping bug.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@24030 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | eval.c | 2 | ||||
-rw-r--r-- | gc.c | 2 | ||||
-rw-r--r-- | test/ruby/test_proc.rb | 11 | ||||
-rw-r--r-- | version.h | 2 |
5 files changed, 16 insertions, 3 deletions
@@ -2,6 +2,8 @@ Fri Jul 10 04:00:00 2009 Kirk Haines <khaines@ruby-lang.org> * file.c: Added FCNTL inclusion to fix a compile error with solaris (backport from r22812) + * gc.c: Fixed Backport #1322 [ruby-core:23050], backport of r23257; Fixes a define_method scope bug. + Thu Jul 9 11:22:00 2009 Kirk Haines <khaines@ruby-lang.org> * gc.c: Add a check for DATA_PTR(obj) to run_final as a stopgap fix for debilitating segfaults. @@ -8647,7 +8647,7 @@ proc_invoke(proc, args, self, klass) OBJSETUP(scope, tmp, T_SCOPE); scope->local_tbl = _block.scope->local_tbl; scope->local_vars = _block.scope->local_vars; - scope->flags |= SCOPE_CLONE; + scope->flags |= SCOPE_CLONE | (_block.scope->flags & SCOPE_MALLOC); _block.scope = scope; } /* modify current frame */ @@ -1316,7 +1316,7 @@ obj_free(obj) VALUE *vars = RANY(obj)->as.scope.local_vars-1; if (!(RANY(obj)->as.scope.flags & SCOPE_CLONE) && vars[0] == 0) RUBY_CRITICAL(free(RANY(obj)->as.scope.local_tbl)); - if (RANY(obj)->as.scope.flags & SCOPE_MALLOC) + if ((RANY(obj)->as.scope.flags & (SCOPE_MALLOC|SCOPE_CLONE)) == SCOPE_MALLOC) RUBY_CRITICAL(free(vars)); } break; diff --git a/test/ruby/test_proc.rb b/test/ruby/test_proc.rb index f0b78ffb23..1fe8446b67 100644 --- a/test/ruby/test_proc.rb +++ b/test/ruby/test_proc.rb @@ -86,4 +86,15 @@ class TestProc < Test::Unit::TestCase b = lambda {} assert_not_equal(a, b) end + + def test_define_method_scope + a = 1 + c = Class.new + c.send(:define_method, :x) do |*| + lambda {a = 2}.call + end + c.new.x(nil) + assert_equal(2, a, '[ruby-core:23050]') + end + end @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2009-06-08" #define RUBY_VERSION_CODE 186 #define RUBY_RELEASE_CODE 20090608 -#define RUBY_PATCHLEVEL 377 +#define RUBY_PATCHLEVEL 378 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 |