aboutsummaryrefslogtreecommitdiffstats
path: root/proc.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-16 12:21:25 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-16 12:21:25 +0000
commit39b2a5c4f49870ca394e6ca7058e6911e68b4ac8 (patch)
treeb85ff7f36ca3b8db3f9f27c0405bffabb8e29e27 /proc.c
parentbe3cc3158103b880c4856e828d24adc2fc6c050c (diff)
downloadruby-39b2a5c4f49870ca394e6ca7058e6911e68b4ac8.tar.gz
proc.c: rb_proc_alloc
* proc.c (rb_proc_alloc, proc_dup): allocate rb_proc_t instead of wrapping to get rid of potential memory leak. * vm.c (rb_proc_create): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50507 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'proc.c')
-rw-r--r--proc.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/proc.c b/proc.c
index 44ec281273..b062a4a9f9 100644
--- a/proc.c
+++ b/proc.c
@@ -71,11 +71,10 @@ static const rb_data_type_t proc_data_type = {
};
VALUE
-rb_proc_wrap(VALUE klass, rb_proc_t *proc)
+rb_proc_alloc(VALUE klass)
{
- proc->block.proc = TypedData_Wrap_Struct(klass, &proc_data_type, proc);
-
- return proc->block.proc;
+ rb_proc_t *proc;
+ return TypedData_Make_Struct(klass, rb_proc_t, &proc_data_type, proc);
}
VALUE
@@ -95,11 +94,13 @@ proc_dup(VALUE self)
{
VALUE procval;
rb_proc_t *src;
- rb_proc_t *dst = ALLOC(rb_proc_t);
+ rb_proc_t *dst;
GetProcPtr(self, src);
+ procval = rb_proc_alloc(rb_cProc);
+ GetProcPtr(procval, dst);
*dst = *src;
- procval = rb_proc_wrap(rb_cProc, dst);
+ dst->block.proc = procval;
RB_GC_GUARD(self); /* for: body = proc_dup(body) */
return procval;