summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-01-07 06:52:04 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-01-07 06:52:04 +0000
commit9ccc80fea01944170a36a7a93edaead66a840b39 (patch)
tree11bf7492c7666f2d8722cffb19142ed3cfc22064
parent252cdfe0bfbcbf49d4cc94b2a72518ef01f72e5d (diff)
merge revision(s) 38213: [Backport #7629]
* vm.c (rb_vm_make_proc): save the proc made from the given block so that it will not get collected. [ruby-core:50545] [Bug #7507] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@38726 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--version.h10
-rw-r--r--vm.c11
3 files changed, 20 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index f04301fe32..f7f3e0cae7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Jan 7 15:50:25 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm.c (rb_vm_make_proc): save the proc made from the given block so
+ that it will not get collected. [ruby-core:50545] [Bug #7507]
+
Tue Dec 25 23:35:09 2012 NARUSE, Yui <naruse@ruby-lang.org>
* lib/mkmf.rb: fix for if config["libdir"] is nil.
diff --git a/version.h b/version.h
index f25888f484..a955faeea4 100644
--- a/version.h
+++ b/version.h
@@ -1,10 +1,10 @@
#define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 362
+#define RUBY_PATCHLEVEL 363
-#define RUBY_RELEASE_DATE "2012-12-25"
-#define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 12
-#define RUBY_RELEASE_DAY 25
+#define RUBY_RELEASE_DATE "2013-01-07"
+#define RUBY_RELEASE_YEAR 2013
+#define RUBY_RELEASE_MONTH 1
+#define RUBY_RELEASE_DAY 7
#include "ruby/version.h"
diff --git a/vm.c b/vm.c
index 4dd242fa8f..70e8d3b35c 100644
--- a/vm.c
+++ b/vm.c
@@ -468,10 +468,18 @@ vm_collect_local_variables_in_heap(rb_thread_t *th, VALUE *dfp, VALUE ary)
}
static VALUE vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block);
+static VALUE vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp, VALUE *blockprocptr);
VALUE
rb_vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp)
{
+ VALUE blockprocval;
+ return vm_make_env_object(th, cfp, &blockprocval);
+}
+
+static VALUE
+vm_make_env_object(rb_thread_t *th, rb_control_frame_t *cfp, VALUE *blockprocptr)
+{
VALUE envval;
VALUE *lfp;
rb_block_t *blockptr;
@@ -489,6 +497,7 @@ rb_vm_make_env_object(rb_thread_t * th, rb_control_frame_t *cfp)
rb_proc_t *p;
GetProcPtr(blockprocval, p);
lfp[0] = GC_GUARDED_PTR(&p->block);
+ *blockprocptr = blockprocval;
}
envval = vm_make_env_each(th, cfp, cfp->dfp, cfp->lfp);
@@ -559,7 +568,7 @@ rb_vm_make_proc(rb_thread_t *th, const rb_block_t *block, VALUE klass)
rb_bug("rb_vm_make_proc: Proc value is already created.");
}
- envval = rb_vm_make_env_object(th, cfp);
+ envval = vm_make_env_object(th, cfp, &blockprocval);
if (PROCDEBUG) {
check_env_value(envval);