diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | proc.c | 15 | ||||
-rw-r--r-- | test/ruby/test_symbol.rb | 1 |
3 files changed, 18 insertions, 2 deletions
@@ -1,3 +1,7 @@ +Thu Oct 15 23:56:03 2015 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * proc.c (rb_sym_to_proc): make void env. + Thu Oct 15 13:37:23 2015 Nobuyoshi Nakada <nobu@ruby-lang.org> * proc.c (rb_sym_to_proc): move from string.c and create a Proc @@ -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 |