diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-10-15 14:56:05 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-10-15 14:56:05 +0000 |
commit | f1bc205681578dfa102ea09353f60a215f0f228a (patch) | |
tree | e55f3e696ec42831ca1199eb6750303d3a94f562 | |
parent | 628a1c8fffee1ccf97be8bceed5196f2fc11e168 (diff) | |
download | ruby-f1bc205681578dfa102ea09353f60a215f0f228a.tar.gz |
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
-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 |