diff options
| author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-15 15:04:57 +0000 |
|---|---|---|
| committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-15 15:04:57 +0000 |
| commit | ef1b0f36c7d5d613472d6818f22ecdcabd6420b9 (patch) | |
| tree | 6e7b8051a7212a6e1b76bf4d133ba98daf822a5c /parse.y | |
| parent | bd31355267f92e1f715e47becddb86d317bf92e9 (diff) | |
parse.y (new_command_qcall): Receives a block (optional)
There were four cases that uses new_command_qcall and then
method_add_block. This change factors out the four rules.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61856 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
| -rw-r--r-- | parse.y | 59 |
1 files changed, 27 insertions, 32 deletions
@@ -381,7 +381,7 @@ static NODE *splat_array(NODE*); static NODE *call_bin_op(struct parser_params*,NODE*,ID,NODE*,const YYLTYPE*,const YYLTYPE*); static NODE *call_uni_op(struct parser_params*,NODE*,ID,const YYLTYPE*,const YYLTYPE*); static NODE *new_qcall(struct parser_params* p, ID atype, NODE *recv, ID mid, NODE *args, const YYLTYPE *op_loc, const YYLTYPE *loc); -#define new_command_qcall(p,q,r,m,a,op_loc,loc) new_qcall(p,q,r,m,a,op_loc,loc) +static NODE *new_command_qcall(struct parser_params* p, ID atype, NODE *recv, ID mid, NODE *args, NODE *block, const YYLTYPE *op_loc, const YYLTYPE *loc); static NODE *new_command(struct parser_params *p, NODE *m, NODE *a) {m->nd_args = a; return m;} static NODE *method_add_block(struct parser_params*p, NODE *m, NODE *b, const YYLTYPE *loc) {b->nd_iter = m; b->nd_loc = *loc; return b;} @@ -481,7 +481,7 @@ static int id_is_var(struct parser_params *p, ID id); #define logop(p,id,node1,node2,op_loc,loc) call_bin_op(0, (node1), (id), (node2), op_loc, loc) #define node_assign(p, node1, node2, loc) dispatch2(assign, (node1), (node2)) static VALUE new_qcall(struct parser_params *p, VALUE q, VALUE r, VALUE m, VALUE a, YYLTYPE *op_loc, const YYLTYPE *loc); -#define new_command_qcall(p,q,r,m,a,op_loc,loc) dispatch4(command_call, (r), (q), (m), (a)) +static VALUE new_command_qcall(struct parser_params* p, VALUE atype, VALUE recv, VALUE mid, VALUE args, VALUE block, const YYLTYPE *op_loc, const YYLTYPE *loc); #define new_command(p, m,a) dispatch2(command, (m), (a)); #define new_nil(loc) Qnil @@ -1429,27 +1429,19 @@ command : fcall command_args %prec tLOWEST } | primary_value call_op operation2 command_args %prec tLOWEST { - $$ = new_command_qcall(p, $2, $1, $3, $4, &@3, &@$); - fixpos($$, $1); + $$ = new_command_qcall(p, $2, $1, $3, $4, Qnull, &@3, &@$); } | primary_value call_op operation2 command_args cmd_brace_block { - block_dup_check(p, $4, $5); - $$ = new_command_qcall(p, $2, $1, $3, $4, &@3, &@$); - $$ = method_add_block(p, $$, $5, &@$); - fixpos($$, $1); + $$ = new_command_qcall(p, $2, $1, $3, $4, $5, &@3, &@$); } | primary_value tCOLON2 operation2 command_args %prec tLOWEST { - $$ = new_command_qcall(p, ID2VAL(idCOLON2), $1, $3, $4, &@3, &@$); - fixpos($$, $1); + $$ = new_command_qcall(p, ID2VAL(idCOLON2), $1, $3, $4, Qnull, &@3, &@$); } | primary_value tCOLON2 operation2 command_args cmd_brace_block { - block_dup_check(p, $4, $5); - $$ = new_command_qcall(p, ID2VAL(idCOLON2), $1, $3, $4, &@3, &@$); - $$ = method_add_block(p, $$, $5, &@$); - fixpos($$, $1); + $$ = new_command_qcall(p, ID2VAL(idCOLON2), $1, $3, $4, $5, &@3, &@$); } | keyword_super command_args { @@ -3299,27 +3291,11 @@ block_call : command do_block } | block_call call_op2 operation2 opt_paren_args brace_block { - /*%%%*/ - block_dup_check(p, $4, $5); - $$ = new_command_qcall(p, $2, $1, $3, $4, &@3, &@$); - $$ = method_add_block(p, $$, $5, &@$); - fixpos($$, $1); - /*% - $$ = dispatch4(command_call, $1, $2, $3, $4); - $$ = method_add_block(p, $$, $5, &@$); - %*/ + $$ = new_command_qcall(p, $2, $1, $3, $4, $5, &@3, &@$); } | block_call call_op2 operation2 command_args do_block { - /*%%%*/ - block_dup_check(p, $4, $5); - $$ = new_command_qcall(p, $2, $1, $3, $4, &@3, &@$); - $$ = method_add_block(p, $$, $5, &@$); - fixpos($$, $1); - /*% - $$ = dispatch4(command_call, $1, $2, $3, $4); - $$ = method_add_block(p, $$, $5, &@$); - %*/ + $$ = new_command_qcall(p, $2, $1, $3, $4, $5, &@3, &@$); } ; @@ -8830,6 +8806,17 @@ new_qcall(struct parser_params* p, ID atype, NODE *recv, ID mid, NODE *args, con return qcall; } +static NODE* +new_command_qcall(struct parser_params* p, ID atype, NODE *recv, ID mid, NODE *args, NODE *block, const YYLTYPE *op_loc, const YYLTYPE *loc) +{ + NODE *ret; + if (block) block_dup_check(p, args, block); + ret = new_qcall(p, atype, recv, mid, args, op_loc, loc); + if (block) ret = method_add_block(p, ret, block, loc); + fixpos(ret, recv); + return ret; +} + #define nd_once_body(node) (nd_type(node) == NODE_ONCE ? (node)->nd_body : node) static NODE* match_op(struct parser_params *p, NODE *node1, NODE *node2, const YYLTYPE *op_loc, const YYLTYPE *loc) @@ -10415,6 +10402,14 @@ new_qcall(struct parser_params *p, VALUE q, VALUE r, VALUE m, VALUE a, YYLTYPE * } static VALUE +new_command_qcall(struct parser_params* p, VALUE atype, VALUE recv, VALUE mid, VALUE args, VALUE block, const YYLTYPE *op_loc, const YYLTYPE *loc) +{ + VALUE ret = dispatch4(command_call, recv, atype, mid, args); + if (block == Qundef) ret = method_add_block(p, ret, block, loc); + return ret; +} + +static VALUE const_decl(struct parser_params *p, VALUE path, const YYLTYPE *loc) { if (p->in_def) { |
