diff --git a/ChangeLog b/ChangeLog index 9e49490574..cfd1268ece 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sat Apr 12 22:11:10 2014 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] + Sat Apr 12 09:26:48 2014 Eric Hodel * ext/openssl/ossl_ocsp.c: [DOC] Document OpenSSL::OCSP. diff --git a/internal.h b/internal.h index 6c2951fa18..5890fdb959 100644 --- a/internal.h +++ b/internal.h @@ -758,6 +758,7 @@ ID rb_id_attrget(ID id); 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 b36c7aa865..1271a3ba42 100644 --- a/proc.c +++ b/proc.c @@ -709,6 +709,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 56b27d9d75..28b1efa2e9 100644 --- a/string.c +++ b/string.c @@ -8506,6 +8506,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;