diff --git a/ChangeLog b/ChangeLog index ac74ba3bd2..3e1d4e9c8c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Thu Oct 29 23:54:35 2015 Nobuyoshi Nakada + + * string.c (sym_to_proc), proc.c (rb_block_clear_env_self): clear + caller's self which is useless, so that it can get collected. + [Fixes GH-592] + Thu Oct 29 23:30:20 2015 SHIBATA Hiroshi * lib/ipaddr.rb, test/test_ipaddr.rb: Reject invalid address contained diff --git a/internal.h b/internal.h index fbd0e28e18..1e439913c7 100644 --- a/internal.h +++ b/internal.h @@ -630,6 +630,7 @@ void rb_gc_mark_symbols(int full_mark); VALUE rb_proc_location(VALUE self); st_index_t rb_hash_proc(st_index_t hash, VALUE proc); int rb_block_arity(void); +VALUE rb_block_clear_env_self(VALUE proc); /* process.c */ #define RB_MAX_GROUPS (65536) diff --git a/proc.c b/proc.c index a13452329d..1ee442a7f8 100644 --- a/proc.c +++ b/proc.c @@ -636,6 +636,17 @@ rb_block_lambda(void) return proc_new(rb_cProc, TRUE); } +VALUE +rb_block_clear_env_self(VALUE proc) +{ + rb_proc_t *po; + rb_env_t *env; + GetProcPtr(proc, po); + GetEnvPtr(po->envval, env); + env->env[0] = Qnil; + return proc; +} + VALUE rb_f_lambda(void) { diff --git a/string.c b/string.c index 859018e5c1..526f476deb 100644 --- a/string.c +++ b/string.c @@ -8540,6 +8540,7 @@ sym_to_proc(VALUE sym) } else { proc = rb_proc_new(sym_call, (VALUE)id); + rb_block_clear_env_self(proc); aryp[index] = sym; aryp[index + 1] = proc; return proc; diff --git a/version.h b/version.h index 75fcbf3133..eb424edf07 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.1.8" #define RUBY_RELEASE_DATE "2015-10-29" -#define RUBY_PATCHLEVEL 411 +#define RUBY_PATCHLEVEL 412 #define RUBY_RELEASE_YEAR 2015 #define RUBY_RELEASE_MONTH 10