1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* eval.c (proc_invoke): shares dmethod scope local variables.

a patch from coderrr at [ruby-core:23050]

* gc.c (obj_free): do not free cloned scope local variables.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@23257 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2009-04-22 03:20:14 +00:00
parent 4a9e4166bf
commit d09363d8c9
5 changed files with 22 additions and 5 deletions

View file

@ -1,3 +1,10 @@
Wed Apr 22 12:20:13 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* eval.c (proc_invoke): shares dmethod scope local variables.
a patch from coderrr at [ruby-core:23050]
* gc.c (obj_free): do not free cloned scope local variables.
Tue Apr 21 09:20:21 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/mkmf.rb (init_mkmf): needs default library path even if

2
eval.c
View file

@ -8942,7 +8942,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 */

2
gc.c
View file

@ -1380,7 +1380,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;

View file

@ -91,4 +91,14 @@ class TestProc < Test::Unit::TestCase
assert_equal(10, Proc.new{|&b| b.call(10)}.call {|x| x})
assert_equal(12, Proc.new{|a,&b| b.call(a)}.call(12) {|x| x})
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

View file

@ -1,7 +1,7 @@
#define RUBY_VERSION "1.8.8"
#define RUBY_RELEASE_DATE "2009-04-21"
#define RUBY_RELEASE_DATE "2009-04-22"
#define RUBY_VERSION_CODE 188
#define RUBY_RELEASE_CODE 20090421
#define RUBY_RELEASE_CODE 20090422
#define RUBY_PATCHLEVEL -1
#define RUBY_VERSION_MAJOR 1
@ -9,7 +9,7 @@
#define RUBY_VERSION_TEENY 8
#define RUBY_RELEASE_YEAR 2009
#define RUBY_RELEASE_MONTH 4
#define RUBY_RELEASE_DAY 21
#define RUBY_RELEASE_DAY 22
#ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[];