summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--internal.h1
-rw-r--r--proc.c11
-rw-r--r--string.c1
4 files changed, 19 insertions, 0 deletions
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 <nobu@ruby-lang.org>
+
+ * 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 <drbrain@segment7.net>
* 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
@@ -710,6 +710,17 @@ rb_block_lambda(void)
}
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)
{
rb_warn("rb_f_lambda() is deprecated; use rb_block_proc() instead");
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;