Feature #3447
closedargument delegation
Description
ใชใใ ใงใใ
http://www.rubyist.net/~matz/20100615.html#p01 ใๅฎ่ฃ
ใใฆใฟใพใใใ
foo(...)
ใงใใญใใฏใพใงใณใใfoo(..)
ใฏใใญใใฏๆใใซใใฆใใใพใใ
diff --git i/compile.c w/compile.c
index 4621cd9..d769c56 100644
--- i/compile.c
+++ w/compile.c
@@ -2729,7 +2729,6 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
return 1;
case NODE_SUPER:
- case NODE_ZSUPER:
ADD_INSN(ret, nd_line(node), putnil);
ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_ZSUPER), 0,
needstr);
@@ -2919,6 +2918,67 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned long *flag)
POP_ELEMENT(args);
break;
}
+ case NODE_DELEGATE: {
+ int i;
+ rb_iseq_t *liseq = iseq->local_iseq;
+
+ if (argn->nd_state) *flag |= VM_CALL_SUPER_BIT;
+ argc = INT2FIX(liseq->argc);
+
+ /* normal arguments */
+ for (i = 0; i < liseq->argc; i++) {
+ int idx = liseq->local_size - i;
+ ADD_INSN1(args, nd_line(argn), getlocal, INT2FIX(idx));
+ }
+
+ if (!liseq->arg_simple) {
+ if (liseq->arg_opts) {
+ /* optional arguments */
+ int j;
+ for (j = 0; j < liseq->arg_opts - 1; j++) {
+ int idx = liseq->local_size - (i + j);
+ ADD_INSN1(args, nd_line(argn), getlocal, INT2FIX(idx));
+ }
+ i += j;
+ argc = INT2FIX(i);
+ }
+
+ if (liseq->arg_rest != -1) {
+ /* rest argument */
+ int idx = liseq->local_size - liseq->arg_rest;
+ ADD_INSN1(args, nd_line(argn), getlocal, INT2FIX(idx));
+ argc = INT2FIX(liseq->arg_rest + 1);
+ *flag |= VM_CALL_ARGS_SPLAT_BIT;
+ }
+
+ if (liseq->arg_post_len) {
+ /* post arguments */
+ int post_len = liseq->arg_post_len;
+ int post_start = liseq->arg_post_start;
+
+ if (liseq->arg_rest != -1) {
+ int j;
+ for (j=0; j<post_len; j++) {
+ int idx = liseq->local_size - (post_start + j);
+ ADD_INSN1(args, nd_line(argn), getlocal, INT2FIX(idx));
+ }
+ ADD_INSN1(args, nd_line(argn), newarray, INT2FIX(j));
+ ADD_INSN (args, nd_line(argn), concatarray);
+ /* argc is setteled at above */
+ }
+ else {
+ int j;
+ for (j=0; j<post_len; j++) {
+ int idx = liseq->local_size - (post_start + j);
+ ADD_INSN1(args, nd_line(argn), getlocal, INT2FIX(idx));
+ }
+ argc = INT2FIX(post_len + post_start);
+ }
+ }
+ }
+
+ break;
+ }
default: {
rb_bug("setup_arg: unknown node: %s\n", ruby_node_name(nd_type(argn)));
}
@@ -4115,8 +4175,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
}
break;
}
- case NODE_SUPER:
- case NODE_ZSUPER:{
+ case NODE_SUPER: {
DECL_ANCHOR(args);
VALUE argc;
unsigned long flag = 0;
@@ -4124,72 +4183,12 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
INIT_ANCHOR(args);
iseq->compile_data->current_block = Qfalse;
- if (nd_type(node) == NODE_SUPER) {
- argc = setup_args(iseq, args, node->nd_args, &flag);
- }
- else {
- /* NODE_ZSUPER */
- int i;
- rb_iseq_t *liseq = iseq->local_iseq;
-
- argc = INT2FIX(liseq->argc);
-
- /* normal arguments */
- for (i = 0; i < liseq->argc; i++) {
- int idx = liseq->local_size - i;
- ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
- }
-
- if (!liseq->arg_simple) {
- if (liseq->arg_opts) {
- /* optional arguments */
- int j;
- for (j = 0; j < liseq->arg_opts - 1; j++) {
- int idx = liseq->local_size - (i + j);
- ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
- }
- i += j;
- argc = INT2FIX(i);
- }
-
- if (liseq->arg_rest != -1) {
- /* rest argument */
- int idx = liseq->local_size - liseq->arg_rest;
- ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
- argc = INT2FIX(liseq->arg_rest + 1);
- flag |= VM_CALL_ARGS_SPLAT_BIT;
- }
-
- if (liseq->arg_post_len) {
- /* post arguments */
- int post_len = liseq->arg_post_len;
- int post_start = liseq->arg_post_start;
-
- if (liseq->arg_rest != -1) {
- int j;
- for (j=0; j<post_len; j++) {
- int idx = liseq->local_size - (post_start + j);
- ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
- }
- ADD_INSN1(args, nd_line(node), newarray, INT2FIX(j));
- ADD_INSN (args, nd_line(node), concatarray);
- /* argc is setteled at above */
- }
- else {
- int j;
- for (j=0; j<post_len; j++) {
- int idx = liseq->local_size - (post_start + j);
- ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
- }
- argc = INT2FIX(post_len + post_start);
- }
- }
- }
- }
+ argc = setup_args(iseq, args, node->nd_args, &flag);
/* dummy receiver */
ADD_INSN1(ret, nd_line(node), putobject,
- nd_type(node) == NODE_ZSUPER ? Qfalse : Qtrue);
+ (flag & VM_CALL_SUPER_BIT) ? Qfalse : Qtrue);
+ flag &= ~VM_CALL_SUPER_BIT;
ADD_SEQ(ret, args);
ADD_INSN3(ret, nd_line(node), invokesuper,
argc, parent_block, LONG2FIX(flag));
diff --git i/gc.c w/gc.c
index 58e4550..0d5fbad 100644
--- i/gc.c
+++ w/gc.c
@@ -1671,7 +1671,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev)
goto again;
case NODE_ZARRAY: /* - */
- case NODE_ZSUPER:
+ case NODE_DELEGATE:
case NODE_VCALL:
case NODE_GVAR:
case NODE_LVAR:
diff --git i/insns.def w/insns.def
index f75007d..6c1efdc 100644
--- i/insns.def
+++ w/insns.def
@@ -993,10 +993,10 @@ send
{
const rb_method_entry_t *me;
VALUE recv, klass;
- rb_block_t *blockptr = 0;
+ rb_block_t *blockptr = (op_flag & VM_CALL_SUPER_BIT) ? GET_BLOCK_PTR() : 0;
int num = caller_setup_args(th, GET_CFP(), op_flag, (int)op_argc,
(rb_iseq_t *)blockiseq, &blockptr);
- rb_num_t flag = op_flag;
+ rb_num_t flag = op_flag & ~VM_CALL_SUPER_BIT;
ID id = op_id;
/* get receiver */
diff --git i/node.c w/node.c
index 65bc541..f2900d3 100644
--- i/node.c
+++ w/node.c
@@ -408,10 +408,17 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
F_NODE(nd_args, "arguments");
break;
- case NODE_ZSUPER:
- ANN("super invocation with no argument");
- ANN("format: super");
- ANN("example: super");
+ case NODE_DELEGATE:
+ if (node->nd_state) {
+ ANN("argument delegation with block");
+ ANN("format: ...");
+ ANN("example: foo(...)");
+ }
+ else {
+ ANN("argument delegation without block");
+ ANN("format: ..");
+ ANN("example: foo(..)");
+ }
break;
case NODE_ARRAY:
diff --git i/node.h w/node.h
index f8cf7de..74320c0 100644
--- i/node.h
+++ w/node.h
@@ -96,8 +96,8 @@ enum node_type {
#define NODE_VCALL NODE_VCALL
NODE_SUPER,
#define NODE_SUPER NODE_SUPER
- NODE_ZSUPER,
-#define NODE_ZSUPER NODE_ZSUPER
+ NODE_DELEGATE,
+#define NODE_DELEGATE NODE_DELEGATE
NODE_ARRAY,
#define NODE_ARRAY NODE_ARRAY
NODE_ZARRAY,
@@ -414,7 +414,7 @@ typedef struct RNode {
#define NEW_FCALL(m,a) NEW_NODE(NODE_FCALL,0,m,a)
#define NEW_VCALL(m) NEW_NODE(NODE_VCALL,0,m,0)
#define NEW_SUPER(a) NEW_NODE(NODE_SUPER,0,0,a)
-#define NEW_ZSUPER() NEW_NODE(NODE_ZSUPER,0,0,0)
+#define NEW_DELEGATE(b) NEW_NODE(NODE_DELEGATE,0,0,b)
#define NEW_ARGS(m,o) NEW_NODE(NODE_ARGS,o,m,0)
#define NEW_ARGS_AUX(r,b) NEW_NODE(NODE_ARGS_AUX,r,b,0)
#define NEW_OPT_ARG(i,v) NEW_NODE(NODE_OPT_ARG,i,v,0)
diff --git i/parse.y w/parse.y
index 9fac5bd..735d1bf 100644
--- i/parse.y
+++ w/parse.y
@@ -2399,6 +2399,20 @@ opt_paren_args : none
opt_call_args : none
| call_args
+ | tDOT2
+ {
+ /*%%%*/
+ $$ = NEW_DELEGATE(0);
+ /*%
+ %*/
+ }
+ | tDOT3
+ {
+ /*%%%*/
+ $$ = NEW_DELEGATE(1);
+ /*%
+ %*/
+ }
;
call_args : command
@@ -3647,7 +3661,7 @@ method_call : operation paren_args
| keyword_super
{
/*%%%*/
- $$ = NEW_ZSUPER();
+ $$ = NEW_SUPER(NEW_DELEGATE(1));
/*%
$$ = dispatch0(zsuper);
%*/
diff --git i/test/ruby/test_method.rb w/test/ruby/test_method.rb
index 7be70b0..a04a285 100644
--- i/test/ruby/test_method.rb
+++ w/test/ruby/test_method.rb
@@ -345,4 +345,38 @@ class TestMethod < Test::Unit::TestCase
obj.extend(m)
assert_equal([:m1, :a], obj.public_methods(false), bug)
end
+
+ def test_argument_delegate
+ class << (o = Object.new)
+ def foo(*args)
+ yield(*args)
+ end
+ def foo1(*)
+ foo(...)
+ end
+ def foo2(*)
+ foo1(...)
+ end
+ def bar(*args, &block)
+ [args, block]
+ end
+ def bar1(*)
+ bar(..)
+ end
+ def bar2(*)
+ bar1(..)
+ end
+ end
+ called = nil
+ assert_equal([42], o.foo1(42) {|*x| called = x})
+ assert_equal([42], called)
+ called = nil
+ assert_equal([42], o.foo2(42) {|*x| called = x})
+ assert_equal([42], called)
+ called = :not_called
+ assert_equal([[42], nil], o.bar1(42) {|*x| called = true})
+ assert_equal(:not_called, called)
+ assert_equal([[42], nil], o.bar2(42) {|*x| called = true})
+ assert_equal(:not_called, called)
+ end
end
--
--- ๅใฎๅใซBugใฏใชใใ
--- ๅใฎๅพใใซBugใฏใงใใใ
ไธญ็ฐ ไผธๆฆ
Updated by matz (Yukihiro Matsumoto) about 15 years ago
ใพใคใใจ ใใใฒใใงใ
In message "Re: [ruby-dev:41623] [Feature:trunk] argument delegation"
on Wed, 16 Jun 2010 18:57:40 +0900, Nobuyoshi Nakada nobu@ruby-lang.org writes:
http://www.rubyist.net/~matz/20100615.html#p01 ใๅฎ่ฃ ใใฆใฟใพใใใ
ๆใๆฉใใ
foo(...)ใงใใญใใฏใพใงใณใใfoo(..)ใฏใใญใใฏๆใใซใใฆใใใพใใ
foo(..)ใฏไธ่ฆใ ใจๆใใพใใ
Updated by mame (Yusuke Endoh) about 15 years ago
้ ่คใงใใ
2010ๅนด6ๆ16ๆฅ18:57 Nobuyoshi Nakada nobu@ruby-lang.org:
http://www.rubyist.net/~matz/20100615.html#p01 ใๅฎ่ฃ ใใฆใฟใพใใใ
argument delegation ใฏใ
- ใใญใใฏใๅผใ็ถใใใใใ ใ (ๅผๆฐใฏๅคใใใ) ใจใใซไธไพฟ
- ๅผๆฐใฎๅคๆฐใธใใฃใใไปฃๅ ฅใใฆใ้้ใฃใๅผๆฐใๆธกใไบไปถใๅค็บใใใ
-
define_method
ใงใตใใผใใงใใฆใใชใ (ๅฐๆฅ็ใซใใใไบๅฎใฏใใ๏ผ)
ใฎใงใใใใพใๅฅฝใใใใชใใงใใ
ใใญใใฏใๅผใ็ถใใใใฎใ้ขๅใใใใจใใๅๆฉใฏใจใฆใใใใใใใฎใงใ
foo(a, b, c, &)
ใจๆธใใใใใฎใณใณใใญในใใฎใใญใใฏใๆธกใใใจใใใฎใฏใฉใใงใใใใใ
Yusuke Endoh mame@tsg.ne.jp
Updated by matz (Yukihiro Matsumoto) about 15 years ago
ใพใคใใจ ใใใฒใใงใ
In message "Re: [ruby-dev:41625] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 03:36:56 +0900, Yusuke ENDOH mame@tsg.ne.jp writes:
argument delegation ใฏใ
- ใใญใใฏใๅผใ็ถใใใใใ ใ (ๅผๆฐใฏๅคใใใ) ใจใใซไธไพฟ
- ๅผๆฐใฎๅคๆฐใธใใฃใใไปฃๅ ฅใใฆใ้้ใฃใๅผๆฐใๆธกใไบไปถใๅค็บใใใ
define_method
ใงใตใใผใใงใใฆใใชใ (ๅฐๆฅ็ใซใใใไบๅฎใฏใใ๏ผ)ใฎใงใใใใพใๅฅฝใใใใชใใงใใ
-
ใซใคใใฆใฏใใใญใใฏใๅผใ็ถใใใใๆใซใฏใๆ็คบ็ใซใใญใ
ใฏใๅผใๆธกใใฐใใ(ใฒใจใคใฎใใจใใใใใจใใซใใฒใจใคใฎใ
ใจใใใใฐใใใๅ้ทๆงใฏใชใ)ใฎใงใๆๅฝใฆใฎๅฟ ่ฆใใใใ
ใฉใใ็ๅใงใใไปๅใฎๅๆฉใฏใใฒใจใคใฎใใจใใใใฎใซใใต
ใใคใฎใใจใๆธใใชใใจใใใชใใใจใใๅ้ทๆงใงใใใใ -
ใใใฏ
super
ใงใใใใงใใใญใๆใsuper
ใฏๅผๆฐใฎๅคๆฐใซไปฃๅ ฅ
ใใฆใใใฎใพใพๆธกใไปๆงใ ใฃใใฎใงใใใๅฎ่ฃ ไธใฎๅ้กใงใใ
ใใใพใใใ -
ๅฐๆฅ็ใซใฏใ
define_method
ใงใใตใใผใใใใในใใ ใจๆใใพ
ใใใงใใฆใชใใฎใฏๅฎ่ฃ ไธใฎๅถ็ดใ ใจๆใฃใฆใใ ใใใ
ใใญใใฏใๅผใ็ถใใใใฎใ้ขๅใใใใจใใๅๆฉใฏใจใฆใใใใใใใฎใงใ
foo(a, b, c, &)
ใจๆธใใใใใฎใณใณใใญในใใฎใใญใใฏใๆธกใใใจใใใฎใฏใฉใใงใใใใใ
็นฐใ่ฟใใซใชใใพใใใใใใงใฏใใฒใจใคใฎใใจใใใใฎใซใใตใ
ใคใฎใใจใๆธใใชใใจใใใชใใใจใใๅ้ทๆงใ่งฃๆฑบใงใใฆใพใใใ
ๅฎ่ณช่ฟฝๅ ใฏ2ๆๅญใ ใใ่ฒ ๆ
ใฏ่ปฝใใชใใพใใใ
ใใใใจใใจใฎๅๆฉใจใฏๅฅใจใใฆใใ&
ใ1ๆๅญใงใใฎใณใณใใญในใ
ใฎใใญใใฏใๆธกใใฎใฏใ้ข็ฝใใขใคใใฃใขใ ใจๆใใพใใใใฎๅ ดๅ
ใฏใไปฎๅผๆฐใชในใใฎใใญใใฏๅผๆฐใใชใใฆใใใใญใใฏใๆธกใใใจ
ใซใชใใใงใใใญใ
ใพใคใใจ ใใใฒใ /:|)
Updated by ko1 (Koichi Sasada) about 15 years ago
ใใใใ ใงใ๏ผ
(2010/06/17 6:31), Yukihiro Matsumoto wrote::
argument delegation ใฏใ
- ใใญใใฏใๅผใ็ถใใใใใ ใ (ๅผๆฐใฏๅคใใใ) ใจใใซไธไพฟ
- ๅผๆฐใฎๅคๆฐใธใใฃใใไปฃๅ ฅใใฆใ้้ใฃใๅผๆฐใๆธกใไบไปถใๅค็บใใใ
- define_method ใงใตใใผใใงใใฆใใชใ (ๅฐๆฅ็ใซใใใไบๅฎใฏใใ๏ผ)
ใฎใงใใใใพใๅฅฝใใใใชใใงใใ
ใซใคใใฆใฏใใใญใใฏใๅผใ็ถใใใใๆใซใฏใๆ็คบ็ใซใใญใ
ใฏใๅผใๆธกใใฐใใ(ใฒใจใคใฎใใจใใใใใจใใซใใฒใจใคใฎใ
ใจใใใใฐใใใๅ้ทๆงใฏใชใ)ใฎใงใๆๅฝใฆใฎๅฟ ่ฆใใใใ
ใฉใใ็ๅใงใใไปๅใฎๅๆฉใฏใใฒใจใคใฎใใจใใใใฎใซใใต
ใใคใฎใใจใๆธใใชใใจใใใชใใใจใใๅ้ทๆงใงใใใใใใใฏ
super
ใงใใใใงใใใญใๆใsuper
ใฏๅผๆฐใฎๅคๆฐใซไปฃๅ ฅ
ใใฆใใใฎใพใพๆธกใไปๆงใ ใฃใใฎใงใใใๅฎ่ฃ ไธใฎๅ้กใงใใ
ใใใพใใใๅฐๆฅ็ใซใฏใ
define_method
ใงใใตใใผใใใใในใใ ใจๆใใพ
ใใใงใใฆใชใใฎใฏๅฎ่ฃ ไธใฎๅถ็ดใ ใจๆใฃใฆใใ ใใใ
ใใๅฎ่ฃ
ไธใฎๅถ็ดใใฏใใฎใจใใใง๏ผ่จ่ชใใถใคใณใจใใฆใใในใใงใฏใชใใจๆ
ใใพใ๏ผ
๏ผๅฎ่ฃ ใ็ฐกๅใใฉใใใฏๅฅใฎ่ฉฑใงใใใฉ๏ผ
ใใใใฏ็ฝฎใใจใใฆ๏ผใใ๏ผใใใชใซไฝฟใใใงใใใใ๏ผใใพใไฝฟใใชใๆฉ่ฝ
ใซ๏ผๆฐใใ่จๅทใๅ
ฅใใใฎใฏๆตๆใใใใพใ๏ผใจใใซ๏ผfoo(...)
ใจใ๏ผๆฌไผผ
ใณใผใใงใใไฝฟใใฎใง๏ผๆตๆใใใใพใ๏ผๆ่ใงใใใใฃใกใใใใใใงใใ๏ผ
ๅฉ็จไพ๏ผ
http://rurema.clear-code.com/query:%28...%29/
ใ้ ่คใใใฎ
ใใญใใฏใๅผใ็ถใใใใฎใ้ขๅใใใใจใใๅๆฉใฏใจใฆใใใใใใใฎใงใ
foo(a, b, c, &)
ใจๆธใใใใใฎใณใณใใญในใใฎใใญใใฏใๆธกใใใจใใใฎใฏใฉใใงใใใใใ
ใฎ่ฉฑใฏ๏ผใใ๏ผใใฃใใไฝฟใใใ๏ผใจๆใใพใใ๏ผ
// SASADA Koichi at atdot dot net
Updated by matz (Yukihiro Matsumoto) about 15 years ago
ใพใคใใจ ใใใฒใใงใ
In message "Re: [ruby-dev:41629] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 10:45:11 +0900, SASADA Koichi ko1@atdot.net writes:
https://bugs.ruby-lang.org/issues/3447#
ใใใใฏ็ฝฎใใจใใฆ๏ผใใ๏ผใใใชใซไฝฟใใใงใใใใ๏ผใใพใไฝฟใใชใๆฉ่ฝ
ใซ๏ผๆฐใใ่จๅทใๅ ฅใใใฎใฏๆตๆใใใใพใ๏ผใจใใซ๏ผfoo(...) ใจใ๏ผๆฌไผผ
ใณใผใใงใใไฝฟใใฎใง๏ผๆตๆใใใใพใ๏ผๆ่ใงใใใใฃใกใใใใใใงใใ๏ผๅฉ็จไพ๏ผ
http://rurema.clear-code.com/query:%28...%29/
ใใใชใซ้ ป็นใซไฝฟใใใจ่จใใจใใใใพใงใงใฏใชใใจๆใใพใใใใ
ๅ
จ็ถใชใใใใงใฏใใใพใใใใ็นฐใ่ฟใใซใชใใพใใใใใใใ
ใใใจใซๅฏพใใๅ้ทๆงใใใ่ใใใจๆๅฝใฆใใใๆนใใใใจๆใ
ใพใใ
ใใใใใ...
ใใซใใใพใงใใ ใใฃใฆใใใใใงใฏใใใพใใใฎใงใ
ไปใฎๆๆณใงใๆงใใพใใใใใ ใใRใLuaใงใฏๅใ็ฎ็ใซใ...
ใใ
ไฝฟใใใฆใใพใใใใใใใชใซๆชใๆกใงใใชใใ ใใใจๆใฃใฆใพใใ
Updated by akr (Akira Tanaka) about 15 years ago
2010ๅนด6ๆ17ๆฅ6:31 Yukihiro Matsumoto matz@ruby-lang.org:
- ใใญใใฏใๅผใ็ถใใใใใ ใ (ๅผๆฐใฏๅคใใใ) ใจใใซไธไพฟ
- ใซใคใใฆใฏใใใญใใฏใๅผใ็ถใใใใๆใซใฏใๆ็คบ็ใซใใญใ
ใฏใๅผใๆธกใใฐใใ(ใฒใจใคใฎใใจใใใใใจใใซใใฒใจใคใฎใ
ใจใใใใฐใใใๅ้ทๆงใฏใชใ)ใฎใงใๆๅฝใฆใฎๅฟ ่ฆใใใใ
ใฉใใ็ๅใงใใไปๅใฎๅๆฉใฏใใฒใจใคใฎใใจใใใใฎใซใใต
ใใคใฎใใจใๆธใใชใใจใใใชใใใจใใๅ้ทๆงใงใใใใ
ไปๅใฎ่ฉฑใซใฏใชใใ่งฆใใใใฆใใชใใใงใใใ
ใใฎๆฉ่ฝใฎ่ๆฏใฎใฒใจใคใซใฏใญใผใฏใผใๅผๆฐใใใใใใซๆใใพใใ
ใญใผใฏใผใๅผๆฐใๅ ใใใจใใซใใญใผใฏใผใๅผๆฐใ
ๆฎ้ใฎๅผๆฐใงใใใญใใฏๅผๆฐใงใใชใใใฎใจใใใจใ
ใในใฆใฎๅผๆฐใๅผใๆธกใใฎใซ 3ใคใใใใใซใคใใฆๅผใๆธกใใชใใจใใใพใใใ
ใใใ้ฟใใใใใซใญใผใฏใผใๅผๆฐใๆฎ้ใฎๅผๆฐใฎไธ้จใซใใใจใใใใจใซใใใใ
ๅ่ซใๅบใพใใฃใฆไปๆงใใพใจใพใใชใใฃใใใจใใใฎใ็งใฎ่ช่ญใงใใ
ruby-talk:162431
ใใใชใใในใฆใฎๅผๆฐใๅผใๆธกใใใใฎๆฉ่ฝใใคใใใใจใใใขใคใใขใ
ruby-talk:162561 ใ ruby-dev:30892 ใซๆธใใใใจใใใใพใใใ
ใใฎๆ็นใงใฏๅๅฟใๅพใใใพใใใงใใใ
ใใใใๆตใใงไปๅใฎใ่ฆใใจใใใๅพใๆนๅใ ใจๆใใใใงใใใ
2ใคๆธๅฟตใใใใพใใ
ไปใฏๆฎ้ใฎๅผๆฐใจใใญใใฏๅผๆฐใฎใตใใคใใใชใใฎใงใ
ใฒใจใคใๅคใใใชใใๆฎใใฏใฒใจใคใใใใใพใใใ
ใใใใฃใฆใๆฎใใในใฆใๅผใๆธกใใฎใฏใฒใจใคๆธใใฐๆธใฟใพใใ
ใใใใใญใผใฏใผใๅผๆฐใๅ
ฅใใจใฟใฃใคใซใชใใฎใงใ
ใฒใจใคใๅคใใใชใใๆฎใใฏใตใใคใซใชใใพใใ
ๆฎใใในใฆใๅผใๆธกใใฎใซใตใใคๆธใๅฟ
่ฆใๅบใฆใใพใใ
ใใใใใใใฏใใใใใชใใงใใใใ
ใคใพใใargument delegation ใฏใญใผใฏใผใๅผๆฐใๅ
ฅใใใจใใซๅฐใๅ้กใ่งฃๆฑบใใ
ใใใใใชใใจๆใฃใใใๅฎ้ใฎใจใใใฏใใพใ่งฃๆฑบใใฆใใชใใใจใใใใใงใใ
- define_method ใงใตใใผใใงใใฆใใชใ (ๅฐๆฅ็ใซใใใไบๅฎใฏใใ๏ผ)
- ๅฐๆฅ็ใซใฏใdefine_methodใงใใตใใผใใใใในใใ ใจๆใใพ
ใใใงใใฆใชใใฎใฏๅฎ่ฃ ไธใฎๅถ็ดใ ใจๆใฃใฆใใ ใใใ
ใใใฒใจใคใฏ define_method
ใ lambda
ใจใฎ้ข้ฃใงใใ
...
ใจใใๆงๆใซใฏๅๅใๅ
ฅใฃใฆใใชใใฎใงใ
def f(a)
lambda {|b|
g(...)
}
end
ใจใใใจใใซ ...
ใฏใฉใฎๅผๆฐใๆใใฎใไธๆใงใใ
ไปๆงใจใใฆใฉใกใใใซๅบๅฎใใใใจใฏใงใใใงใใใใใ
ใใญใฐใฉใใ้ธในใใใใชๆงๆใซใฏใชใฃใฆใใพใใใ
ใใฎใใกใ้ธในใใใใซใใๆงๆใ่ฆๆฑใใใใใใซใชใใใใใชใใงใใใใใ
[็ฐไธญ ๅฒ][ใใชใ ใใใ][Tanaka Akira]
Updated by shugo (Shugo Maeda) about 15 years ago
ๅ็ฐใงใใ
argument delegationใซใคใใฆใฏใพใ ๆ
ๅบฆใๆฑบใใใญใฆใใใฎใงใใใ
super(...)
ใๅฐๅ
ฅใใใใใ(่ญฆๅใๅบใใชใฉใฎ็งป่กในใใใใ็ตใฆ)
ๆฌๅผงใชใsuper
ใฏsuper()
ใจๅใๆๅณใซใใฆใใพใฃใฆใฏใฉใใงใใใใใ
2010ๅนด6ๆ17ๆฅ6:31 Yukihiro Matsumoto matz@ruby-lang.org:
- ใใใฏ
super
ใงใใใใงใใใญใๆใsuper
ใฏๅผๆฐใฎๅคๆฐใซไปฃๅ ฅ
ใใฆใใใฎใพใพๆธกใไปๆงใ ใฃใใฎใงใใใๅฎ่ฃ ไธใฎๅ้กใงใใ
ใใใพใใใ
super
ใงใฏใใญใใฏๅผๆฐใธใฎไปฃๅ
ฅใๅๆ ใใใชใๅไฝใซใชใฃใฆใใพใใใ
argument delegationใงใฏใฉใใชใใพใใ?
def foo(&b)
b = lambda { puts "lambda in foo" }
bar(...)
end
ใจใใใฑใผในใฎ่ฉฑใงใใใ
Shugo Maeda
Updated by matz (Yukihiro Matsumoto) about 15 years ago
ใพใคใใจ ใใใฒใใงใ
In message "Re: [ruby-dev:41634] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 13:58:53 +0900, Shugo Maeda shugo@ruby-lang.org writes:
argument delegationใซใคใใฆใฏใพใ ๆ ๅบฆใๆฑบใใใญใฆใใใฎใงใใใ
super(...)
ใๅฐๅ ฅใใใใใ(่ญฆๅใๅบใใชใฉใฎ็งป่กในใใใใ็ตใฆ)
ๆฌๅผงใชใsuper
ใฏsuper()
ใจๅใๆๅณใซใใฆใใพใฃใฆใฏใฉใใงใใใใใ
ใใผใใsuper
ใsuper()
ใฎๆๅณใงใใฃใฆใใใใใฎใฏใ
- ใซใผใซใๅฐใชใใชใ
- ็กๅผๆฐ
super
ใฎๅผใณๅบใใๅๅใซๅคใ
ใฎใใใใใ ใจๆใใฎใงใใใๅ่
ใฏ็ตๅฑใฏRubyใฎ่จญ่จใงใฏๅชๅ
ๅบฆ
ใไฝใใไธ่ฒซๆงใใ้ซใใใจใใใใจใชใฎใงใใใฎ้ใใใใใใ
ใจใฏ่ฉไพกใใพใใใ
ๅพ่ ใงใใใใใใๅฎ้็ใซใใใใใฎใฏ
-
super
ใๅซใใกใฝใใใๅผๆฐใ๏ผๅไปฅไธๅใๅใ -
super
ใซใฏใฒใจใคใๆธกใใชใ
ใจใใใฑใผในใ ใใงใsuper
ใฎไฝฟใ้ใฎใใกๅคใใๅซใ(ใจๆใใใ)
-
super
ใๅซใใกใฝใใใๅผๆฐใ๏ผๅไปฅไธๅใๅใ -
super
ใซใใฎใพใพๆธกใ
ๅ ดๅใใใใพใงsuper
ใ ใใงใใใ ใใฎใsuper(...)
ใจๆธใใญใฐใชใ
ใใใกใฃใจใใใใใใใใพใใใ
-
super
ใๅซใใกใฝใใใๅผๆฐใ๏ผๅไปฅไธๅใๅใ -
super
ใซใฏๅฅใฎๅผๆฐใๆธกใ
ๅ ดๅใargment delegationใฏๅฝนใซ็ซใใชใใฎใฏไบๅฎใงใใใใใใฏ
super
ใsuper()
ใซใใใใจใจใฏ็ก้ขไฟใงใใใใ
super
ใงใฏใใญใใฏๅผๆฐใธใฎไปฃๅ ฅใๅๆ ใใใชใๅไฝใซใชใฃใฆใใพใใใ
argument delegationใงใฏใฉใใชใใพใใ?def foo(&b) b = lambda { puts "lambda in foo" } bar(...) end
ใจใใใฑใผในใฎ่ฉฑใงใใใ
ใsuper
ใจๅใๅไฝใใจใใใฎใๅบๆฌใ ใจๆใใพใใๆฌๅฝใฏใ้ๅธธ
ๅผๆฐใไปฃๅ
ฅใๅๆ ใใใชใใใใซใใใใฎใงใใใYARVใฎๅฎ่ฃ
ใ ใจ
้ฃใใใจ่ใใใใใชๆฐใใใพใใ
ใพใคใใจ ใใใฒใ /:|)
Updated by ko1 (Koichi Sasada) about 15 years ago
(2010/06/17 14:53), Yukihiro Matsumoto wrote::
ใ
super
ใจๅใๅไฝใใจใใใฎใๅบๆฌใ ใจๆใใพใใๆฌๅฝใฏใ้ๅธธ
ๅผๆฐใไปฃๅ ฅใๅๆ ใใใชใใใใซใใใใฎใงใใใYARVใฎๅฎ่ฃ ใ ใจ
้ฃใใใจ่ใใใใใชๆฐใใใพใใ
ใๅฎ่ฃ
ใใใชใใฆใใใฉใผใใณในใ็็ฑใซใ้กใใใพใใ๏ผๅผๆฐ้ ๅใฎใณใใผ
ใ๏ผในใฟใใฏใใฌใผใ ็ฉใใใจใซ่กใใฎใฏๅซใงใ๏ผๅซใชใฎใฏไฟบใ ใใใ๏ผ๏ผ
zsuper
ใใใฃใใจใใ ใ๏ผใจใใใฎใ eval
ใใใใใ็ตๅฑใใก๏ผยถ
ใๆๅณ็ใซใ๏ผๅไบบ็ใซใฏ 1.9 ใฎไปๆงใๅฅฝใใชใฎใงใใ๏ผ
// SASADA Koichi at atdot dot net
Updated by matz (Yukihiro Matsumoto) about 15 years ago
ใพใคใใจ ใใใฒใใงใ
In message "Re: [ruby-dev:41631] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 12:05:22 +0900, Tanaka Akira akr@fsij.org writes:
ใใใใๆตใใงไปๅใฎใ่ฆใใจใใใๅพใๆนๅใ ใจๆใใใใงใใใ
2ใคๆธๅฟตใใใใพใใไปใฏๆฎ้ใฎๅผๆฐใจใใญใใฏๅผๆฐใฎใตใใคใใใชใใฎใงใ
ใฒใจใคใๅคใใใชใใๆฎใใฏใฒใจใคใใใใใพใใใ
ใใใใฃใฆใๆฎใใในใฆใๅผใๆธกใใฎใฏใฒใจใคๆธใใฐๆธใฟใพใใใใใใใญใผใฏใผใๅผๆฐใๅ ฅใใจใฟใฃใคใซใชใใฎใงใ
ใฒใจใคใๅคใใใชใใๆฎใใฏใตใใคใซใชใใพใใ
ๆฎใใในใฆใๅผใๆธกใใฎใซใตใใคๆธใๅฟ ่ฆใๅบใฆใใพใใ
ใใใใใใใฏใใใใใชใใงใใใใ
ใใฒใจใคใๅคใใใใจใใๆๅณใใใพใใก่ชญใฟๅใใชใใฃใใฎใงใ
ใใใใใฏใใจใใฐใใ้ๅธธใฎๅผๆฐใฎๅใซใฒใจใคๅฅใฎๅผๆฐใๅ ใใใ
ใจใใใ้ๅธธๅผๆฐใฏๅใใ ใใๆธกใใใญใใฏใ ใๅคใใใใจใใใ
ใใๆๅณใชใใงใใใใใ
ใ ใจใใใจใใใฃใใใใใจใฏ็่งฃใงใใพใใใใ ใใใใพใฎใจใ
ใใญใผใฏใผใๅผๆฐใฏ้ๅธธใฎๅผๆฐใฎไธ้จใจใใฆๆฑใใใจๆใฃใฆใใใฎ
ใงใใใพใๅ้กใซใฏใชใใชใใใใใใพใใใ
ใใใฒใจใคใฏ
define_method
ใlambda
ใจใฎ้ข้ฃใงใใ
...
ใจใใๆงๆใซใฏๅๅใๅ ฅใฃใฆใใชใใฎใงใdef f(a) lambda {|b| g(...) } end
ใจใใใจใใซ ... ใฏใฉใฎๅผๆฐใๆใใฎใไธๆใงใใ
็ขบใใซใใใ ใใใไธ็ชๅ
ๅดใฎๅผๆฐใใจใใlambda
ใฏ็ก่ฆใใกใฝใ
ใใฎๅผๆฐใใงใใฉใกใใงใใใพใๅ้กใชใใใใชๆฐใใใพใใใจใ
ใใฎใใใใฎ่จๆณใฏใใงใใชใใใจใใงใใใใใซใใใใฎใงใฏใช
ใใฆใใใใฉใใใใใฎใใใๆฅฝใซ่กจ็พใใใใจใใใใฎใงใใใใ
ไปๆงใฎ่ค้ๅใ้ฟใใฆใใ็จๅบฆใงใใใใใใใใจใใใฎใฏๅๅใ
ใใใๅคๆญใ ใจๆใใพใใ
ไปๆงใจใใฆใฉใกใใใซๅบๅฎใใใใจใฏใงใใใงใใใใใ
ใใญใฐใฉใใ้ธในใใใใชๆงๆใซใฏใชใฃใฆใใพใใใใใฎใใกใ้ธในใใใใซใใๆงๆใ่ฆๆฑใใใใใใซใชใใใใใชใใงใใใใใ
ใใฎใใใชไปๆงใฎใฒใจใคใฎๆกใจใใฆใฏใใ...
ใใใฎใใฎใๅผใจใใฆ
ใใพใฃใฆใใใฎๅคใruby-talk:162561 ใง็คบใใใใใใชใชใใธใง
ใฏใใซใใๆนๆณใใใใพใใญใใใฎๅ ดๅใซใฏใ**
ใใจใ**obj
ใใฎๆน
ใ่ฏใใใใใใพใใใใ
ใคใพใใ
def f(a)
c = **
lambda {|b|
g(**c) # aใๆธกใ
}
end
def f(a)
lambda {|b|
g(**) # bใๆธกใ
}
end
ใจใใใใจใงใใญใใใ ใover specใชๅฐ่ฑกใใใใพใใ
ใพใคใใจ ใใใฒใ /:|)
Updated by matz (Yukihiro Matsumoto) about 15 years ago
ใพใคใใจ ใใใฒใใงใ
In message "Re: [ruby-dev:41636] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 15:03:33 +0900, SASADA Koichi ko1@atdot.net writes:
ใๅฎ่ฃ ใใใชใใฆใใใฉใผใใณในใ็็ฑใซใ้กใใใพใใ๏ผๅผๆฐ้ ๅใฎใณใใผ
ใ๏ผในใฟใใฏใใฌใผใ ็ฉใใใจใซ่กใใฎใฏๅซใงใ๏ผๅซใชใฎใฏไฟบใ ใใใ๏ผ๏ผ
ใใใใใฐใใใ ใฃใใใใชใ
ใๆๅณ็ใซใ๏ผๅไบบ็ใซใฏ 1.9 ใฎไปๆงใๅฅฝใใชใฎใงใใ๏ผ
็นใซไปใฎใงใฏใใกใจๆใฃใฆใใใใงใฏใชใใฎใงใใ(ๅผๆฐใๆธใๆ
ใใใใคใๆชใ)ใใใ ใใใใใ ใใใใฉใใใฆใ1.9 ใฎไปๆงใ
ๅฅฝใใใชใฎใใใใฎ็็ฑใซใฏ้ขๅฟใใใใพใใ
ใพใคใใจ ใใใฒใ /:|)
Updated by ko1 (Koichi Sasada) about 15 years ago
ใใใใ ใงใ๏ผ
(2010/06/17 15:17), Yukihiro Matsumoto wrote::
ใๆๅณ็ใซใ๏ผๅไบบ็ใซใฏ 1.9 ใฎไปๆงใๅฅฝใใชใฎใงใใ๏ผ
็นใซไปใฎใงใฏใใกใจๆใฃใฆใใใใงใฏใชใใฎใงใใ(ๅผๆฐใๆธใๆ
ใใใใคใๆชใ)ใใใ ใใใใใ ใใใใฉใใใฆใ1.9 ใฎไปๆงใ
ๅฅฝใใใชใฎใใใใฎ็็ฑใซใฏ้ขๅฟใใใใพใใ
ใๆธใๆใใ่ช็ฑใใใใฎใง๏ผใใฃใกใฎใปใใใใใใชใ๏ผใจ๏ผ
// SASADA Koichi at atdot dot net
Updated by shugo (Shugo Maeda) about 15 years ago
ๅ็ฐใงใใ
2010ๅนด6ๆ17ๆฅ14:53 Yukihiro Matsumoto matz@ruby-lang.org:
argument delegationใซใคใใฆใฏใพใ ๆ ๅบฆใๆฑบใใใญใฆใใใฎใงใใใ
super(...)
ใๅฐๅ ฅใใใใใ(่ญฆๅใๅบใใชใฉใฎ็งป่กในใใใใ็ตใฆ)
ๆฌๅผงใชใsuper
ใฏsuper()
ใจๅใๆๅณใซใใฆใใพใฃใฆใฏใฉใใงใใใใใใใผใใ
super
ใsuper()
ใฎๆๅณใงใใฃใฆใใใใใฎใฏใ
- ใซใผใซใๅฐใชใใชใ
- ็กๅผๆฐ
super
ใฎๅผใณๅบใใๅๅใซๅคใใฎใใใใใ ใจๆใใฎใงใใใๅ่ ใฏ็ตๅฑใฏRubyใฎ่จญ่จใงใฏๅชๅ ๅบฆ
ใไฝใใไธ่ฒซๆงใใ้ซใใใจใใใใจใชใฎใงใใใฎ้ใใใใใใ
ใจใฏ่ฉไพกใใพใใใ
ๅผทใใฆใใใฐๅ่
ใงใใใใซใผใซใๅฐใชใใชใใใจใใฎใใฎใใใใใ
ใฎใงใฏใชใใฆใ้ๅธธใฎใกใฝใใๅผๅบใใ ใจ()
ใไปใใชใใฆใใใใฎใซใ
super
ใฎใจใใ ใๅผๆฐใใชใใฎใซ()
ใไปใใชใใจใใใชใใฎใ(่ฆใ็ฎ
็ใซ)ๆฐๆใกๆชใใใจใใ็็ฑใงใใ
ๅพ่ ใงใใใใใใๅฎ้็ใซใใใใใฎใฏ
super
ใๅซใใกใฝใใใๅผๆฐใ๏ผๅไปฅไธๅใๅใsuper
ใซใฏใฒใจใคใๆธกใใชใใจใใใฑใผในใ ใใงใ
็งใฎ็ต้จใงใฏใinitialize
ใใชใผใใผใฉใคใใใใจใใซsuper()
ใจๆธใใชใใจ
ใใใชใใฆๆฐๆใกๆชใใจๆใใใใจใ็ตๆงใใใพใใใ
ใกใชใฟใซๆจๆบๆทปไปใฉใคใใฉใชใซใใใsuper
/super()
ใฎๅฉ็จ็ฎๆใ่ชฟในใใจใใ
super
: 391็ฎๆ
super()
: 292็ฎๆ
ใจใใ็ตๆใงใใใๆๅคใจใใๅ่ฒ ใใใชใใงใใใใใ
super
ใฎไฝฟใ้ใฎใใกๅคใใๅซใ(ใจๆใใใ)
super
ใๅซใใกใฝใใใๅผๆฐใ๏ผๅไปฅไธๅใๅใsuper
ใซใใฎใพใพๆธกใๅ ดๅใใใใพใง
super
ใ ใใงใใใ ใใฎใsuper(...)
ใจๆธใใญใฐใชใ
ใใใกใฃใจใใใใใใใใพใใใ
5ๆๅญใฎ็ฏ็ดใ้่ฆใซใชใใปใฉใใไฝฟใๆฉ่ฝใงใใชใใจๆใใฎใงใ
็ญใ่จ่ฟฐใงๆธใใใจใใใใไปใฎๆฉ่ฝใจใฎ้กๆจใงsuper
ใฎๆๅใ
ๆจๆธฌใงใใใใจใฎๆนใๅฉ็นใๅคงใใใใใซๆใใพใใ
ใใ ใไบๆๆงใฎๅ้กใใใ(ๆขๅญใฎในใฏใชใใใฏๆฉๆขฐ็ใซ็ฝฎๆใงใใ
ใใใใชใใใจๆใใพใใ)ใฎใงใใใใปใฉๅผทใใฏไธปๅผตใใพใใใ
super
ใงใฏใใญใใฏๅผๆฐใธใฎไปฃๅ ฅใๅๆ ใใใชใๅไฝใซใชใฃใฆใใพใใใ
argument delegationใงใฏใฉใใชใใพใใ?def foo(&b) b = lambda { puts "lambda in foo" } bar(...) end
ใจใใใฑใผในใฎ่ฉฑใงใใใ
ใ
super
ใจๅใๅไฝใใจใใใฎใๅบๆฌใ ใจๆใใพใใๆฌๅฝใฏใ้ๅธธ
ๅผๆฐใไปฃๅ ฅใๅๆ ใใใชใใใใซใใใใฎใงใใใYARVใฎๅฎ่ฃ ใ ใจ
้ฃใใใจ่ใใใใใชๆฐใใใพใใ
ๆง่ฝไธใฎ็็ฑใจใใใใจใงไบ่งฃใใพใใใ
# ๅไบบ็ใซใฏใๅผๆฐใซไปฃๅ
ฅใใใฎใฏๆชใในใฟใคใซใ ใจๆใฃใฆใใฎใงใใฉใฃใกใงใ
# ใใใใงใใใฉใ
Shugo Maeda
Updated by matz (Yukihiro Matsumoto) about 15 years ago
ใพใคใใจ ใใใฒใใงใ
In message "Re: [ruby-dev:41641] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 17:05:10 +0900, Shugo Maeda shugo@ruby-lang.org writes:
็งใฎ็ต้จใงใฏใ
initialize
ใใชใผใใผใฉใคใใใใจใใซsuper()
ใจๆธใใชใใจ
ใใใชใใฆๆฐๆใกๆชใใจๆใใใใจใ็ตๆงใใใพใใใ
ใกใชใฟใซๆจๆบๆทปไปใฉใคใใฉใชใซใใใsuper
/super()
ใฎๅฉ็จ็ฎๆใ่ชฟในใใจใใ
super
: 391็ฎๆ
super()
: 292็ฎๆใจใใ็ตๆใงใใใๆๅคใจใใๅ่ฒ ใใใชใใงใใใใใ
ใใผใใ็งใ lib/**/*.rb
ใงๆฐใใใ super()
ใใคใพใๆ็คบ็ใซ็ก
ๅผๆฐใงๅผใณๅบใใsuper
ใฏ66็ฎๆใใ่ฆใคใใใพใใใงใใใใใก2
็ฎๆใฏใกใฝใใใซๅผๆฐใใชใใฎใงsuper
ใงใๅใใใจใงใใ้ใซๆ้ป
ใซๅผๆฐใๅผใๆธกใsuper
ใฏ243็ฎๆใงใใๅฐใ
ใฎๆฐใใใใใใฃใฆใ
ใใใใใชใใงใใใใใพใใซใ้ใใฎใงใใใใใใฆๆฐใๆนใ้
ใ๏ผ
5ๆๅญใฎ็ฏ็ดใ้่ฆใซใชใใปใฉใใไฝฟใๆฉ่ฝใงใใชใใจๆใใฎใงใ
็ญใ่จ่ฟฐใงๆธใใใจใใใใไปใฎๆฉ่ฝใจใฎ้กๆจใงsuper
ใฎๆๅใ
ๆจๆธฌใงใใใใจใฎๆนใๅฉ็นใๅคงใใใใใซๆใใพใใ
็งใใใฃใใ(ๅผๆฐ่ปข้ใฎ) super
ไฝฟใใใ ใใฉใชใ
ใพใคใใจ ใใใฒใ /:|)
Updated by mame (Yusuke Endoh) about 15 years ago
้ ่คใงใใ
2010ๅนด6ๆ17ๆฅ6:31 Yukihiro Matsumoto matz@ruby-lang.org:
- ใใญใใฏใๅผใ็ถใใใใใ ใ (ๅผๆฐใฏๅคใใใ) ใจใใซไธไพฟ
- (็ฅ) ไปๅใฎๅๆฉใฏใใฒใจใคใฎใใจใใใใฎใซใใต
ใใคใฎใใจใๆธใใชใใจใใใชใใใจใใๅ้ทๆงใงใใใใ
ใชใใปใฉใใ้ๅธธใฎๅผๆฐใจใใญใใฏๅผๆฐใใพใจใใฆ delegate ใใใใ
ใจๆใใใใจใใใพใใชใใฃใใฎใงใๅๆฉใๅ้ใใใฆใใพใใใ
lib/
ใ็ฒใฃใฝใๆขใใฆใฟใใใ24 ็ฎๆใปใฉ่ฆใคใใใพใใ (ใกใผใซใฎ
ๆๅพใซ่ฒผใใคใใฆใใใพใ) ใใใใชใใซ้่ฆใฏใใใฎใใชใ
ใใใใจใใจใฎๅๆฉใจใฏๅฅใจใใฆใใ
&
ใ1ๆๅญใงใใฎใณใณใใญในใ
ใฎใใญใใฏใๆธกใใฎใฏใ้ข็ฝใใขใคใใฃใขใ ใจๆใใพใใใใฎๅ ดๅ
ใฏใไปฎๅผๆฐใชในใใฎใใญใใฏๅผๆฐใใชใใฆใใใใญใใฏใๆธกใใใจ
ใซใชใใใงใใใญใ
้ๅธธใฎๅผๆฐใฏ้ขไฟใชใใใใญใใฏๅผๆฐใๅผใ็ถใใใใไบไพใชใใไธใจ
ๅใใใใชๆค็ดขใง 183 ็ฎๆ (ไธใฎ 24 ็ฎๆใๅซใ) ใ่ฆใคใใฃใใฎใงใ
&
ใฎ็็ฅ่จๆณใฏๆฏ้ๆฌฒใใใชใฃใฆใใพใใใ
$ ruby check.rb
lib/drb/drb.rb
1079: def method_missing(msg_id, *a, &b)
1083: return obj.__send__(msg_id, *a, &b)
lib/test/unit/assertions.rb
22: def assert_raise(*args, &b)
23: assert_raises(*args, &b)
lib/rake.rb
743: def create_rule(*args, &block)
744: Rake.application.create_rule(*args, &block)
lib/rake.rb
844:def task(*args, &block)
845: Rake::Task.define_task(*args, &block)
lib/rake.rb
862:def file(*args, &block)
863: Rake::FileTask.define_task(*args, &block)
lib/rake.rb
868:def file_create(args, &block)
869: Rake::FileCreationTask.define_task(args, &block)
lib/rake.rb
892:def multitask(args, &block)
893: Rake::MultiTask.define_task(args, &block)
lib/rake.rb
918:def rule(*args, &block)
919: Rake::Task.create_rule(*args, &block)
lib/scanf.rb
607: def scanf(str,&b)
608: return block_scanf(str,&b) if b
lib/scanf.rb
687: def scanf(fstr,&b)
689: block_scanf(fstr,&b)
lib/scanf.rb
716: def scanf(fs,&b)
717: STDIN.scanf(fs,&b)
lib/rubygems/user_interaction.rb
62: def use_ui(new_ui, &block)
63: Gem::DefaultUserInteraction.use_ui(new_ui, &block)
lib/optparse.rb
832: def accept(*args, &blk) top.accept(*args, &blk) end
836: def self.accept(*args, &blk) top.accept(*args, &blk) end
lib/optparse.rb
1202: def on(*opts, &block)
1203: define(*opts, &block)
lib/optparse.rb
1216: def on_head(*opts, &block)
1217: define_head(*opts, &block)
lib/optparse.rb
1230: def on_tail(*opts, &block)
1231: define_tail(*opts, &block)
lib/optparse.rb
1425: def visit(id, *args, &block)
1427: el.send(id, *args, &block)
lib/csv.rb
2308:def CSV(*args, &block)
2309: CSV.instance(*args, &block)
lib/erb.rb
334: def percent_line(line, &block)
336: return @scan_line.call(line, &block)
lib/erb.rb
334: def percent_line(line, &block)
341: @scan_line.call(line, &block)
lib/matrix.rb
1457: def map2(v, &block) # :yield: e1, e2
1459: els = collect2(v, &block)
lib/set.rb
613: def initialize(*args, &block) # :nodoc:
615: initialize(*args, &block)
lib/delegate.rb
141: def method_missing(m, *args, &block)
144: target.respond_to?(m) ? target.__send__(m, *args, &block) :
super(m, *args, &block)
lib/open-uri.rb
27: def open(name, *rest, &block) # :doc:
35: open_uri_original_open(name, *rest, &block)
count: 24
$ cat check.rb
count = 0
Dir.glob("lib/**/*.rb").each do |path|
next unless File.file?(path)
open(path) do |file|
while line = file.gets
if line =~ /^(\s*)def\s+[\d\w]+(\(.*,.*&.*\))/ # ไธกๆนๅผใ็ถใใใไบไพ
#if line =~ /^(\s*)def\s+[\d\w]+\(.*(&.*\))/ # ใใญใใฏๅผๆฐใๅผใ็ถใใใไบไพ
sig = line
lineno = file.lineno
re1 = /^\s{#{ $1.size }}end/
re2 = Regexp.new(Regexp.quote($2))
while line = file.gets
break if re1 =~ line
if re2 =~ line
puts path
puts "#{ lineno }:#{ sig }"
puts "#{ file.lineno }:#{ line }"
puts
count += 1
end
end
end
end
end
end
puts "count: #{ count }"
Yusuke Endoh mame@tsg.ne.jp
Updated by matz (Yukihiro Matsumoto) about 15 years ago
ใพใคใใจ ใใใฒใใงใ
In message "Re: [ruby-dev:41644] Re: [Feature:trunk] argument delegation"
on Thu, 17 Jun 2010 22:29:19 +0900, Yusuke ENDOH mame@tsg.ne.jp writes:
้ๅธธใฎๅผๆฐใฏ้ขไฟใชใใใใญใใฏๅผๆฐใๅผใ็ถใใใใไบไพใชใใไธใจ
ๅใใใใชๆค็ดขใง 183 ็ฎๆ (ไธใฎ 24 ็ฎๆใๅซใ) ใ่ฆใคใใฃใใฎใงใ
&
ใฎ็็ฅ่จๆณใฏๆฏ้ๆฌฒใใใชใฃใฆใใพใใใ
ใใใฏ่ฏใใขใคใใฃใขใ ใจๆใใพใใใใใใใใจๅ
ใฎใขใคใใฃใข
ใใใใ
Updated by shugo (Shugo Maeda) about 15 years ago
ๅ็ฐใงใใ
2010ๅนด6ๆ17ๆฅ19:06 Yukihiro Matsumoto matz@ruby-lang.org:
็งใฎ็ต้จใงใฏใ
initialize
ใใชใผใใผใฉใคใใใใจใใซsuper()
ใจๆธใใชใใจ
ใใใชใใฆๆฐๆใกๆชใใจๆใใใใจใ็ตๆงใใใพใใใ
ใกใชใฟใซๆจๆบๆทปไปใฉใคใใฉใชใซใใใsuper
/super()
ใฎๅฉ็จ็ฎๆใ่ชฟในใใจใใ
super
: 391็ฎๆ
super()
: 292็ฎๆใจใใ็ตๆใงใใใๆๅคใจใใๅ่ฒ ใใใชใใงใใใใใ
ใใผใใ็งใ
lib/**/*.rb
ใงๆฐใใใsuper()
ใใคใพใๆ็คบ็ใซ็ก
ๅผๆฐใงๅผใณๅบใใsuper
ใฏ66็ฎๆใใ่ฆใคใใใพใใใงใใใใใก2
็ฎๆใฏใกใฝใใใซๅผๆฐใใชใใฎใงsuper
ใงใๅใใใจใงใใ้ใซๆ้ป
ใซๅผๆฐใๅผใๆธกใsuper
ใฏ243็ฎๆใงใใๅฐใ ใฎๆฐใใใใใใฃใฆใ
ใใใใใชใใงใใใใใพใใซใ้ใใฎใงใใใใใใฆๆฐใๆนใ้
ใ๏ผ
~/src/ruby/**/*.rb
ใงใใฃใฆใพใใใ
ใงใๅคใใฎใฏTkใฟใใใงใใโฆใ
5ๆๅญใฎ็ฏ็ดใ้่ฆใซใชใใปใฉใใไฝฟใๆฉ่ฝใงใใชใใจๆใใฎใงใ
็ญใ่จ่ฟฐใงๆธใใใจใใใใไปใฎๆฉ่ฝใจใฎ้กๆจใงsuper
ใฎๆๅใ
ๆจๆธฌใงใใใใจใฎๆนใๅฉ็นใๅคงใใใใใซๆใใพใใ็งใใใฃใใ(ๅผๆฐ่ปข้ใฎ)
super
ไฝฟใใใ ใใฉใชใ
ใพใใ่ชๅใ็ตๆงไฝฟใฃใฆใใใใใใพใใใใใใใใใฃใใใจใฏ
ใใใซๅฟใใฆใไธๆบใซๆใฃใใใจใ ใ่ฆใใฆใใใจใใใใจใใ
ใใใพใใใ
Shugo Maeda
Updated by mame (Yusuke Endoh) about 15 years ago
้ ่คใงใใ
2010ๅนด6ๆ17ๆฅ6:31 Yukihiro Matsumoto matz@ruby-lang.org:
ใใใใจใใจใฎๅๆฉใจใฏๅฅใจใใฆใใ
&
ใ1ๆๅญใงใใฎใณใณใใญในใ
ใฎใใญใใฏใๆธกใใฎใฏใ้ข็ฝใใขใคใใฃใขใ ใจๆใใพใใใใฎๅ ดๅ
ใฏใไปฎๅผๆฐใชในใใฎใใญใใฏๅผๆฐใใชใใฆใใใใญใใฏใๆธกใใใจ
ใซใชใใใงใใใญใ
ใใใใๆธใใฆใฟใพใใใๆใฃใใใๅฐใใๆธใใพใใใ
def foo
yield
end
def bar
foo(&)
end
bar { p 1 } #=> 1
ใซใใณใ็็ฅใใๅ ดๅใ
foo &
bar
ใจใใใฎใ foo & bar
ใชใฎใ foo(&); bar
ใชใฎใๆๆงใจใใๅ้กใ
ใใใพใใใใใไบๆๆง้่ฆใง foo & bar
ใจ่งฃ้ใใใใใซใชใฃใฆใ
ใพใใใจใใใๆธใใฆใฟใใใใใชใฃใใconflict ใฏๅบใพใใใ
diff --git a/compile.c b/compile.c
index 2fd804c..3f8c331 100644
--- a/compile.c
+++ b/compile.c
@@ -2863,8 +2863,13 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args,
NODE *argn, unsigned long *flag)
INIT_ANCHOR(arg_block);
INIT_ANCHOR(args_splat);
if (argn && nd_type(argn) == NODE_BLOCK_PASS) {
- COMPILE(arg_block, "block", argn->nd_body);
- *flag |= VM_CALL_ARGS_BLOCKARG_BIT;
+ if ((VALUE)argn->nd_body != (VALUE)-1) {
+ COMPILE(arg_block, "block", argn->nd_body);
+ *flag |= VM_CALL_ARGS_BLOCKARG_BIT;
+ }
+ else {
+ *flag |= VM_CALL_ARGS_BLOCKTRGH_BIT;
+ }
argn = argn->nd_head;
}
diff --git a/node.c b/node.c
index 65bc541..85574b4 100644
--- a/node.c
+++ b/node.c
@@ -621,7 +621,12 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
ANN("example: foo(x, &blk)");
F_NODE(nd_head, "other arguments");
LAST_NODE;
- F_NODE(nd_body, "block argument");
+ if ((VALUE)node->nd_body != (VALUE)-1) {
+ F_NODE(nd_body, "block argument");
+ }
+ else {
+ F_MSG(nd_body, "block argument", "-1 (anonymous)");
+ }
break;
case NODE_DEFN:
diff --git a/parse.y b/parse.y
index e085088..b0b946b 100644
--- a/parse.y
+++ b/parse.y
@@ -2459,6 +2459,14 @@ block_arg : tAMPER arg_value
$$ = $2;
%*/
}
+ | tAMPER
+ {
+ /*%%%*/
+ $$ = NEW_BLOCK_PASS(-1);
+ /*%
+ $$ = dispatch0(anonymous_block_arg);
+ %*/
+ }
;
opt_block_arg : ',' block_arg
diff --git a/vm_core.h b/vm_core.h
index 7676b2f..f0fa3a3 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -544,6 +544,7 @@ typedef struct {
#define VM_CALL_TAILRECURSION_BIT (0x01 << 6)
#define VM_CALL_SUPER_BIT (0x01 << 7)
#define VM_CALL_OPT_SEND_BIT (0x01 << 8)
+#define VM_CALL_ARGS_BLOCKTRGH_BIT (0x01 << 9)
#define VM_SPECIAL_OBJECT_VMCORE 0x01
#define VM_SPECIAL_OBJECT_CBASE 0x02
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 985a2fb..2a127d7 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -261,6 +261,10 @@ caller_setup_args(const rb_thread_t *th,
rb_control_frame_t *cfp, VALUE flag,
*block = blockptr;
}
}
+ else if (flag & VM_CALL_ARGS_BLOCKTRGH_BIT) {
+ rb_control_frame_t *reg_cfp = cfp;
+ *block = GET_BLOCK_PTR();
+ }
else if (blockiseq) {
blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp);
blockptr->iseq = blockiseq;
Yusuke Endoh mame@tsg.ne.jp
Updated by ko1 (Koichi Sasada) about 15 years ago
ใใใใ ใงใ๏ผ
ใใใพใใซๆใใฆ็ฎใ่ฆใใพใใ๏ผ
(2010/08/25 0:30), Yusuke ENDOH wrote:
--- a/vm_core.h +++ b/vm_core.h @@ -544,6 +544,7 @@ typedef struct { #define VM_CALL_TAILRECURSION_BIT (0x01 << 6) #define VM_CALL_SUPER_BIT (0x01 << 7) #define VM_CALL_OPT_SEND_BIT (0x01 << 8) +#define VM_CALL_ARGS_BLOCKTRGH_BIT (0x01 << 9) #define VM_SPECIAL_OBJECT_VMCORE 0x01 #define VM_SPECIAL_OBJECT_CBASE 0x02 diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 985a2fb..2a127d7 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -261,6 +261,10 @@ caller_setup_args(const rb_thread_t *th, rb_control_frame_t *cfp, VALUE flag, *block = blockptr; } } + else if (flag & VM_CALL_ARGS_BLOCKTRGH_BIT) { + rb_control_frame_t *reg_cfp = cfp; + *block = GET_BLOCK_PTR(); + } else if (blockiseq) { blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp); blockptr->iseq = blockiseq;
ใใงใใใฐ๏ผVM_CALL_ARGS_BLOCKTRGH_BIT
ใๅขใใใใใใชใ
ใฆ๏ผVM_CALL_ARGS_BLOCKARG_BIT
ใ ใใฉ๏ผblockiseqใใใชใใใฎๅคใ็นๆฎใซใ
ใฆใใใจใ๏ผใใใใๅฎ่ฃ
ใซใใฆใใใใใจใใใใใใชใใใจๆใใพใ๏ผ
๏ผๅฝไปคใชใใฉใณใใฎใใชใจใผใทใงใณใๆธใฃใๆนใ่ฒใ ใใใใ๏ผ
--
// SASADA Koichi at atdot dot net
Updated by mame (Yusuke Endoh) about 15 years ago
้ ่คใงใใ
2010ๅนด8ๆ25ๆฅ3:23 SASADA Koichi ko1@atdot.net:
ใใงใใใฐ๏ผ
VM_CALL_ARGS_BLOCKTRGH_BIT
ใๅขใใใใใใชใ
ใฆ๏ผVM_CALL_ARGS_BLOCKARG_BIT
ใ ใใฉ๏ผblockiseq
ใใใชใใใฎๅคใ็นๆฎใซใ
ใฆใใใจใ๏ผใใใใๅฎ่ฃ ใซใใฆใใใใใจใใใใใใชใใใจๆใใพใ๏ผ๏ผๅฝไปคใชใใฉใณใใฎใใชใจใผใทใงใณใๆธใฃใๆนใ่ฒใ ใใใใ๏ผ
ใณใกใณใใใใใจใใใใใพใใใงใใ่ฆใใไธใใชใจใผใทใงใณใๅขใใใชใ
ใจใใใงใVM_CALL_ARGS_BLOCKTRGH_BIT
ใซ็ตๆง็ฐใชใ 2 ใคใฎๆๅณใ็ชใฃ่พผใ
ใใจใซใชใ (ในใฟใใฏใซ Proc
ใ่ผใใใป่ผใใชใใฎ้ใใใใใฎใงใ็ดฐใ
ๆก
ไปถๅคๅฎใๅฟ
่ฆใซใชใ) ใฎใงใๅคงใใฆๅฌใใใชใใจๆใใพใใใกใณใใใณในๆงใ
ไธใใใพใใฎใงใๅ
ใฎใใใใฎๆนใใใใจๆใใพใใ
ไธๅฟ blockiseq
ใซ -1
ใๅ
ฅใฃใฆใใ BLOCKTRGH
ๆฑใใซใใใใใใๆธใใฆใฟ
ใพใใใใใใชใๆฌ่ณช็ใงใชใใณใผใใงใใฃใฑใใซใชใใพใใใ
# ไป trunk ใๅฃใใฆใใใใชใฎใงใtest-all ใฏใงใใฆใพใใใ
diff --git a/compile.c b/compile.c
index 2fd804c..1c04640 100644
--- a/compile.c
+++ b/compile.c
@@ -1411,11 +1411,18 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
case TS_ISEQ: /* iseq */
{
VALUE v = operands[j];
- rb_iseq_t *block = 0;
+ VALUE block = 0;
if (v) {
- GetISeqPtr(v, block);
+ if (v == Qundef) {
+ block = (VALUE)-1;
+ }
+ else {
+ rb_iseq_t *blk;
+ GetISeqPtr(v, blk);
+ block = (VALUE)blk;
+ }
}
- generated_iseq[pos + 1 + j] = (VALUE)block;
+ generated_iseq[pos + 1 + j] = block;
break;
}
case TS_VALUE: /* VALUE */
@@ -2853,7 +2860,7 @@ add_ensure_iseq(LINK_ANCHOR *ret, rb_iseq_t *iseq, int is_return)
}
static VALUE
-setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned long *flag)
+setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, VALUE *blockiseq, unsigned long *flag)
{
VALUE argc = INT2FIX(0);
int nsplat = 0;
@@ -2863,7 +2870,13 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned long *flag)
INIT_ANCHOR(arg_block);
INIT_ANCHOR(args_splat);
if (argn && nd_type(argn) == NODE_BLOCK_PASS) {
- COMPILE(arg_block, "block", argn->nd_body);
+ if ((VALUE)argn->nd_body != (VALUE)-1) {
+ COMPILE(arg_block, "block", argn->nd_body);
+ }
+ else {
+ arg_block = 0;
+ if (blockiseq) *blockiseq = Qundef;
+ }
*flag |= VM_CALL_ARGS_BLOCKARG_BIT;
argn = argn->nd_head;
}
@@ -2932,7 +2945,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned long *flag)
ADD_SEQ(args, args_splat);
}
- if (*flag & VM_CALL_ARGS_BLOCKARG_BIT) {
+ if ((*flag & VM_CALL_ARGS_BLOCKARG_BIT) && arg_block) {
ADD_SEQ(args, arg_block);
}
return argc;
@@ -3776,7 +3789,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
boff = 1;
default:
INIT_ANCHOR(args);
- argc = setup_args(iseq, args, node->nd_args->nd_head, &flag);
+ argc = setup_args(iseq, args, node->nd_args->nd_head, 0, &flag);
ADD_SEQ(ret, args);
}
ADD_INSN1(ret, nd_line(node), dupn, FIXNUM_INC(argc, 1 + boff));
@@ -4083,7 +4096,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
/* args */
if (nd_type(node) != NODE_VCALL) {
- argc = setup_args(iseq, args, node->nd_args, &flag);
+ argc = setup_args(iseq, args, node->nd_args, &parent_block, &flag);
}
else {
argc = INT2FIX(0);
@@ -4121,7 +4134,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
INIT_ANCHOR(args);
iseq->compile_data->current_block = Qfalse;
if (nd_type(node) == NODE_SUPER) {
- argc = setup_args(iseq, args, node->nd_args, &flag);
+ argc = setup_args(iseq, args, node->nd_args, &parent_block, &flag);
}
else {
/* NODE_ZSUPER */
@@ -4294,7 +4307,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
}
if (node->nd_head) {
- argc = setup_args(iseq, args, node->nd_head, &flag);
+ argc = setup_args(iseq, args, node->nd_head, 0, &flag);
}
else {
argc = INT2FIX(0);
@@ -4906,7 +4919,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
INIT_ANCHOR(recv);
INIT_ANCHOR(args);
- argc = setup_args(iseq, args, node->nd_args, &flag);
+ argc = setup_args(iseq, args, node->nd_args, 0, &flag);
if (node->nd_recv == (NODE *) 1) {
flag |= VM_CALL_FCALL_BIT;
diff --git a/insns.def b/insns.def
index fcd97ae..10b99be 100644
--- a/insns.def
+++ b/insns.def
@@ -989,7 +989,7 @@ DEFINE_INSN
send
(ID op_id, rb_num_t op_argc, ISEQ blockiseq, rb_num_t op_flag, IC ic)
(...)
-(VALUE val) // inc += - (int)(op_argc + ((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? 1 : 0));
+(VALUE val) // inc += - (int)(op_argc + (((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) && (VALUE)blockiseq != (VALUE)-1) ? 1 : 0));
{
const rb_method_entry_t *me;
VALUE recv, klass;
@@ -1017,7 +1017,7 @@ DEFINE_INSN
invokesuper
(rb_num_t op_argc, ISEQ blockiseq, rb_num_t op_flag)
(...)
-(VALUE val) // inc += - (int)(op_argc + ((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? 1 : 0));
+(VALUE val) // inc += - (int)(op_argc + (((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) && (VALUE)blockiseq != (VALUE)-1) ? 1 : 0));
{
rb_block_t *blockptr = !(op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? GET_BLOCK_PTR() : 0;
int num = caller_setup_args(th, GET_CFP(), op_flag,
diff --git a/node.c b/node.c
index 65bc541..85574b4 100644
--- a/node.c
+++ b/node.c
@@ -621,7 +621,12 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
ANN("example: foo(x, &blk)");
F_NODE(nd_head, "other arguments");
LAST_NODE;
- F_NODE(nd_body, "block argument");
+ if ((VALUE)node->nd_body != (VALUE)-1) {
+ F_NODE(nd_body, "block argument");
+ }
+ else {
+ F_MSG(nd_body, "block argument", "-1 (anonymous)");
+ }
break;
case NODE_DEFN:
diff --git a/parse.y b/parse.y
index e085088..b0b946b 100644
--- a/parse.y
+++ b/parse.y
@@ -2459,6 +2459,14 @@ block_arg : tAMPER arg_value
$$ = $2;
%*/
}
+ | tAMPER
+ {
+ /*%%%*/
+ $$ = NEW_BLOCK_PASS(-1);
+ /*%
+ $$ = dispatch0(anonymous_block_arg);
+ %*/
+ }
;
opt_block_arg : ',' block_arg
diff --git a/tool/instruction.rb b/tool/instruction.rb
index 4fd2127..4ce219f 100755
--- a/tool/instruction.rb
+++ b/tool/instruction.rb
@@ -66,13 +66,12 @@ class RubyVM
ret = "int inc = 0;\n"
@opes.each_with_index{|(t, v), i|
- if t == 'rb_num_t' && ((re = /\b#{v}\b/n) =~ @sp_inc ||
- @defopes.any?{|t, val| re =~ val})
+ if ((re = /\b#{v}\b/n) =~ @sp_inc || @defopes.any?{|t, val| re =~ val})
ret << " int #{v} = FIX2INT(opes[#{i}]);\n"
end
}
@defopes.each_with_index{|((t, var), val), i|
- if t == 'rb_num_t' && val != '*' && /\b#{var}\b/ =~ @sp_inc
+ if val != '*' && /\b#{var}\b/ =~ @sp_inc
ret << " #{t} #{var} = #{val};\n"
end
}
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 985a2fb..f6418b7 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -240,25 +240,31 @@ caller_setup_args(const rb_thread_t *th, rb_control_frame_t *cfp, VALUE flag,
if (block) {
if (flag & VM_CALL_ARGS_BLOCKARG_BIT) {
- rb_proc_t *po;
- VALUE proc;
-
- proc = *(--cfp->sp);
-
- if (proc != Qnil) {
- if (!rb_obj_is_proc(proc)) {
- VALUE b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
- if (NIL_P(b) || !rb_obj_is_proc(b)) {
- rb_raise(rb_eTypeError,
- "wrong argument type %s (expected Proc)",
- rb_obj_classname(proc));
+ if ((VALUE)blockiseq != (VALUE)-1) {
+ rb_proc_t *po;
+ VALUE proc;
+
+ proc = *(--cfp->sp);
+
+ if (proc != Qnil) {
+ if (!rb_obj_is_proc(proc)) {
+ VALUE b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
+ if (NIL_P(b) || !rb_obj_is_proc(b)) {
+ rb_raise(rb_eTypeError,
+ "wrong argument type %s (expected Proc)",
+ rb_obj_classname(proc));
+ }
+ proc = b;
}
- proc = b;
+ GetProcPtr(proc, po);
+ blockptr = &po->block;
+ RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp)->proc = proc;
+ *block = blockptr;
}
- GetProcPtr(proc, po);
- blockptr = &po->block;
- RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp)->proc = proc;
- *block = blockptr;
+ }
+ else {
+ rb_control_frame_t *reg_cfp = cfp;
+ *block = GET_BLOCK_PTR();
}
}
else if (blockiseq) {
Yusuke Endoh mame@tsg.ne.jp
Updated by yugui (Yuki Sonoda) about 15 years ago
Yuguiใงใ
2010/6/17 Yukihiro Matsumoto matz@ruby-lang.org:
ใใใใจใใจใฎๅๆฉใจใฏๅฅใจใใฆใใ
&
ใ1ๆๅญใงใใฎใณใณใใญในใ
ใฎใใญใใฏใๆธกใใฎใฏใ้ข็ฝใใขใคใใฃใขใ ใจๆใใพใใใใฎๅ ดๅ
ใฏใไปฎๅผๆฐใชในใใฎใใญใใฏๅผๆฐใใชใใฆใใใใญใใฏใๆธกใใใจ
ใซใชใใใงใใใญใ
ๆทฑใๅผใณๅบใ้ๅฑคใงใใญใใฏใๅใๅใใใใซใไธไฝใฎใกใฝใใใๅปถใ
ใจใใญใใฏใๅผใๆธกใ็ถใใใฃใฆใใใฑใผในใฏๅฎ้ใซใใญใฐใฉใ ใใฆใใฆใใๅบไผใใพใใใงใใใใใใฎใจใไธไฝๅผใณๅบใใฎๅฎๅผๆฐใซ&block
ใ่ถณใใฆใไปฎๅผๆฐใซใๅฟใใใซ&block
ใ่ถณใใฆใจใใใฎใฏ้ขๅใงใใใฎใขใคใใฃใขใฏไพฟๅฉใใใงใใ
ใใใใใใพใใซใ็ญใใใใ&
๏ผๆๅญใฏ่ฆ่ฝใจใใใใงใใ
foo(a, b, &yield)
ใชใใฆใฎใฏ้ง็ฎใงใใใใใyield
ใจ block.call
ใฎ้กไผผๆงใใใฎ้กๆจใงใใ
Yuki Sonoda (Yugui)
yugui@yugui.jp
http://yugui.jp
Updated by mame (Yusuke Endoh) about 15 years ago
้ ่คใงใใ
2010ๅนด8ๆ26ๆฅ23:28 Yugui yugui@yugui.jp:
ใใใใใใพใใซใ็ญใใใใ
&
๏ผๆๅญใฏ่ฆ่ฝใจใใใใงใใ
ใใใใ่ใใใใงใใใใ
func(foo + bar, baz * qux, i)
ใง i
ใ่ฆ่ฝใจใใจใใชใใงใใใ
&
ใฏ i
ใใ็ฎ็ซใคใใ
foo(a, b, &yield)
ใชใใฆใฎใฏ้ง็ฎใงใใใใใ
yield
ใจblock.call
ใฎ้กไผผๆงใใใฎ้กๆจใงใใ
ใใใฏไบๆๆงใซๅ้กใใใใพใใ
Yusuke Endoh mame@tsg.ne.jp
Updated by shyouhei (Shyouhei Urabe) over 13 years ago
- Description updated (diff)
- Status changed from Open to Feedback
- ใใฎในใฌใใใฎ็พ็ถใใฉใชใใๆใใฆใใใ ใใพใใใใ
- ใใฎ่จๆณใฎใฆใผในใฑใผในใใฉใชใใๆใใฆใใใ ใใพใใใใ
Updated by nobu (Nobuyoshi Nakada) over 13 years ago
- Description updated (diff)
Updated by mame (Yusuke Endoh) almost 13 years ago
- Status changed from Feedback to Assigned
- Assignee set to matz (Yukihiro Matsumoto)
- Target version set to 2.6
shyouhei (Shyouhei Urabe) wrote:
- ใใฎในใฌใใใฎ็พ็ถใใฉใชใใๆใใฆใใใ ใใพใใใใ
matz ใฎๆ็ต็ใช go ahead ๅพ ใกใ ใจๆใใพใใใ2.0.0 ใฎ feature deadline ใฏ้ใใใฎใง next minor ใซใ
- ใใฎ่จๆณใฎใฆใผในใฑใผในใใฉใชใใๆใใฆใใใ ใใพใใใใ
ใใใฎ่จๆณใใฏ matz ใฎๅ
ๆๆกใฎ่ฉฑ๏ผใใใจใ &
ใฎ่ฉฑ๏ผ
ๅพ่
ใ ใจใใใใ
def foo; ... yield ... end
foo { ... }
ใจๆธใใฆใใใ ใใฉใใชใใกใฏใฟใชใณใฐใง foo
ใฎไธญ่บซใ bar
ใซใใใๅบใใใจใซใชใฃใใใจใใใจใใ
def bar; ... yield ... end
def foo(&blk); ... bar(&blk) ... end
foo { ... }
ใจใใใจๆใใพใใใblk
ใจใใไธๆๅคๆฐใๅฎ็พฉใใใใชใ and/or ใใญใใฏใ Proc
ๅใใใฎใง้ใใชใใฎใๅซใใจใใงใใใญใ
Yusuke Endoh mame@tsg.ne.jp
Updated by nobu (Nobuyoshi Nakada) over 11 years ago
- Description updated (diff)
Updated by matz (Yukihiro Matsumoto) about 10 years ago
- Related to Feature #11256: anonymous block forwarding added
Updated by jeremyevans0 (Jeremy Evans) almost 4 years ago
- Status changed from Assigned to Closed