summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-10 18:31:58 +0000
committerwyhaines <wyhaines@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-07-10 18:31:58 +0000
commit90f75117b8d15ee55b1decacb5782079877e8370 (patch)
tree9eab32003eccefe34fd9a27b0050e7e616ea9580
parentb4c46380c18273c86d941c8ff80edc97507612f7 (diff)
downloadruby-90f75117b8d15ee55b1decacb5782079877e8370.tar.gz
ruby-90f75117b8d15ee55b1decacb5782079877e8370.tar.xz
ruby-90f75117b8d15ee55b1decacb5782079877e8370.zip
Fix method scoping bug.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8_6@24030 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog2
-rw-r--r--eval.c2
-rw-r--r--gc.c2
-rw-r--r--test/ruby/test_proc.rb11
-rw-r--r--version.h2
5 files changed, 16 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index d6b838bc2..555579993 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/eval.c b/eval.c
index 4098b8338..b4a5545a4 100644
--- a/eval.c
+++ b/eval.c
@@ -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 */
diff --git a/gc.c b/gc.c
index 9ea6f302c..66ce2634c 100644
--- a/gc.c
+++ b/gc.c
@@ -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 f0b78ffb2..1fe8446b6 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
diff --git a/version.h b/version.h
index 238d28c8a..8e57c62b6 100644
--- a/version.h
+++ b/version.h
@@ -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