mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* proc.c: support Proc#binding.
* sample/test.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14360 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
1b79b5be82
commit
40d8543fbd
3 changed files with 51 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
Thu Dec 20 17:18:38 2007 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* proc.c: support Proc#binding.
|
||||
|
||||
* sample/test.rb: add a test.
|
||||
|
||||
Thu Dec 20 17:15:15 2007 Martin Duerst <duerst@it.aoyama.ac.jp>
|
||||
|
||||
* pack.c: Slight change to documentation ('character' ->
|
||||
|
|
35
proc.c
35
proc.c
|
@ -1459,6 +1459,40 @@ localjump_reason(VALUE exc)
|
|||
return rb_iv_get(exc, "@reason");
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* prc.binding => binding
|
||||
*
|
||||
* Returns the binding associated with <i>prc</i>. Note that
|
||||
* <code>Kernel#eval</code> accepts either a <code>Proc</code> or a
|
||||
* <code>Binding</code> object as its second parameter.
|
||||
*
|
||||
* def fred(param)
|
||||
* proc {}
|
||||
* end
|
||||
*
|
||||
* b = fred(99)
|
||||
* eval("param", b.binding) #=> 99
|
||||
* eval("param", b) #=> 99
|
||||
*/
|
||||
static VALUE
|
||||
proc_binding(VALUE self)
|
||||
{
|
||||
rb_proc_t *proc;
|
||||
VALUE bindval = binding_alloc(rb_cBinding);
|
||||
rb_binding_t *bind;
|
||||
|
||||
GetProcPtr(self, proc);
|
||||
GetBindingPtr(bindval, bind);
|
||||
|
||||
if (TYPE(proc->block.iseq) == T_NODE) {
|
||||
rb_raise(rb_eArgError, "Can't create Binding from C level Proc");
|
||||
}
|
||||
|
||||
bind->env = proc->envval;
|
||||
bind->cref_stack = proc->special_cref_stack;
|
||||
return bindval;
|
||||
}
|
||||
|
||||
/*
|
||||
* <code>Proc</code> objects are blocks of code that have been bound to
|
||||
|
@ -1497,6 +1531,7 @@ Init_Proc(void)
|
|||
rb_define_method(rb_cProc, "hash", proc_hash, 0);
|
||||
rb_define_method(rb_cProc, "to_s", proc_to_s, 0);
|
||||
rb_define_method(rb_cProc, "lambda?", proc_lambda_p, 0);
|
||||
rb_define_method(rb_cProc, "binding", proc_binding, 0);
|
||||
|
||||
/* Exceptions */
|
||||
rb_eLocalJumpError = rb_define_class("LocalJumpError", rb_eStandardError);
|
||||
|
|
|
@ -2178,6 +2178,15 @@ end
|
|||
test_ok(File.expand_path(".", "//") == "//")
|
||||
test_ok(File.expand_path("sub", "//") == "//sub")
|
||||
|
||||
# test_check "Proc#binding"
|
||||
ObjectSpace.each_object(Proc){|o|
|
||||
begin
|
||||
b = o.binding
|
||||
eval 'self', b
|
||||
rescue ArgumentError
|
||||
end
|
||||
}
|
||||
|
||||
test_check "gc"
|
||||
begin
|
||||
1.upto(10000) {
|
||||
|
@ -2209,6 +2218,7 @@ test_ok true # reach here or dumps core
|
|||
ObjectSpace.each_object{|o|
|
||||
o.class.name
|
||||
}
|
||||
|
||||
test_ok true # reach here or dumps core
|
||||
|
||||
if $failed > 0
|
||||
|
|
Loading…
Reference in a new issue