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>
|
Thu Dec 20 17:15:15 2007 Martin Duerst <duerst@it.aoyama.ac.jp>
|
||||||
|
|
||||||
* pack.c: Slight change to documentation ('character' ->
|
* 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");
|
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
|
* <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, "hash", proc_hash, 0);
|
||||||
rb_define_method(rb_cProc, "to_s", proc_to_s, 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, "lambda?", proc_lambda_p, 0);
|
||||||
|
rb_define_method(rb_cProc, "binding", proc_binding, 0);
|
||||||
|
|
||||||
/* Exceptions */
|
/* Exceptions */
|
||||||
rb_eLocalJumpError = rb_define_class("LocalJumpError", rb_eStandardError);
|
rb_eLocalJumpError = rb_define_class("LocalJumpError", rb_eStandardError);
|
||||||
|
|
|
@ -2178,6 +2178,15 @@ end
|
||||||
test_ok(File.expand_path(".", "//") == "//")
|
test_ok(File.expand_path(".", "//") == "//")
|
||||||
test_ok(File.expand_path("sub", "//") == "//sub")
|
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"
|
test_check "gc"
|
||||||
begin
|
begin
|
||||||
1.upto(10000) {
|
1.upto(10000) {
|
||||||
|
@ -2209,6 +2218,7 @@ test_ok true # reach here or dumps core
|
||||||
ObjectSpace.each_object{|o|
|
ObjectSpace.each_object{|o|
|
||||||
o.class.name
|
o.class.name
|
||||||
}
|
}
|
||||||
|
|
||||||
test_ok true # reach here or dumps core
|
test_ok true # reach here or dumps core
|
||||||
|
|
||||||
if $failed > 0
|
if $failed > 0
|
||||||
|
|
Loading…
Add table
Reference in a new issue