From 14b8530454b1db7707c9475d027c26858eac817c Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 15 Oct 2015 14:56:05 +0000 Subject: [PATCH] proc.c: void env * proc.c (rb_sym_to_proc): make void env. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52134 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ proc.c | 15 +++++++++++++-- test/ruby/test_symbol.rb | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 51779b94aa..c580232639 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Thu Oct 15 23:56:03 2015 Nobuyoshi Nakada + + * proc.c (rb_sym_to_proc): make void env. + Thu Oct 15 13:37:23 2015 Nobuyoshi Nakada * proc.c (rb_sym_to_proc): move from string.c and create a Proc diff --git a/proc.c b/proc.c index 24bd33a675..eae5e74ca3 100644 --- a/proc.c +++ b/proc.c @@ -57,9 +57,17 @@ proc_mark(void *ptr) RUBY_MARK_LEAVE("proc"); } +typedef struct { + rb_proc_t basic; + VALUE env[2]; /* specval, envval */ +} sym_proc_t; + static size_t proc_memsize(const void *ptr) { + const rb_proc_t *proc = ptr; + if (proc->block.ep == ((const sym_proc_t *)ptr)->env) + return sizeof(sym_proc_t); return sizeof(rb_proc_t); } @@ -1060,9 +1068,12 @@ rb_sym_to_proc(VALUE sym) } else { rb_proc_t *ptr; + sym_proc_t *symproc; VALUE ifunc = (VALUE)IFUNC_NEW(rb_sym_proc_call, (VALUE)id, 0); - proc = rb_proc_alloc(rb_cProc); - ptr = RTYPEDDATA_DATA(proc); + proc = TypedData_Make_Struct(rb_cProc, sym_proc_t, &proc_data_type, symproc); + symproc->env[0] = VM_ENVVAL_BLOCK_PTR(0); + ptr = &symproc->basic; + ptr->block.ep = symproc->env; ptr->block.iseq = (rb_iseq_t *)ifunc; ptr->block.proc = ifunc; aryp[index] = sym; diff --git a/test/ruby/test_symbol.rb b/test/ruby/test_symbol.rb index 07b75b0024..5f8314cf35 100644 --- a/test/ruby/test_symbol.rb +++ b/test/ruby/test_symbol.rb @@ -137,6 +137,7 @@ class TestSymbol < Test::Unit::TestCase assert_separately([], <<-"end;", timeout: 5.0) bug11566 = '[ruby-core:70980] [Bug #11566]' assert_raise(NoMethodError, bug11566) {Proc.new(&:foo).(1)} + assert_raise(NoMethodError, bug11566) {:foo.to_proc.(1)} end; end