diff --git a/ChangeLog b/ChangeLog index 8c7bd61164..4690f79c0e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sat Nov 19 14:06:07 2016 CHIKANAGA Tomoyuki + + * iseq.c (proc_dup): don't duplicate sym_procs. [Fix GH-1479] + [ruby-core:78100] [Bug #12927] + Based on the patch provided by Emiliano Ritiro. + Sat Nov 19 11:48:47 2016 Nobuyoshi Nakada * iseq.c (iseqw_s_compile_file): deal with syntax error as well as diff --git a/proc.c b/proc.c index 9df55c45c4..755b03ea30 100644 --- a/proc.c +++ b/proc.c @@ -65,11 +65,13 @@ typedef struct { VALUE env[3]; /* me, specval, envval */ } cfunc_proc_t; +#define IS_SYM_PROC(proc) (proc->block.ep == ((const cfunc_proc_t *)proc)->env+1) + static size_t proc_memsize(const void *ptr) { const rb_proc_t *proc = ptr; - if (proc->block.ep == ((const cfunc_proc_t *)ptr)->env+1) + if (IS_SYM_PROC(proc)) return sizeof(cfunc_proc_t); return sizeof(rb_proc_t); } @@ -111,6 +113,8 @@ proc_dup(VALUE self) rb_proc_t *dst; GetProcPtr(self, src); + if (IS_SYM_PROC(src)) + return self; procval = rb_proc_alloc(rb_cProc); GetProcPtr(procval, dst); *dst = *src; diff --git a/version.h b/version.h index d7af154d2a..cbf5191573 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.3.3" #define RUBY_RELEASE_DATE "2016-11-19" -#define RUBY_PATCHLEVEL 220 +#define RUBY_PATCHLEVEL 221 #define RUBY_RELEASE_YEAR 2016 #define RUBY_RELEASE_MONTH 11