diff --git a/compile.c b/compile.c index f565581c39..7b45d5b246 100644 --- a/compile.c +++ b/compile.c @@ -3644,11 +3644,12 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, /* method dispatch */ case NODE_CALL: + case NODE_OPCALL: case NODE_VCALL: case NODE_FCALL: case NODE_ATTRASGN:{ const int explicit_receiver = - (type == NODE_CALL || + (type == NODE_CALL || type == NODE_OPCALL || (type == NODE_ATTRASGN && !private_recv_p(node))); if (!lfinish[1] && (node->nd_args || explicit_receiver)) { @@ -5237,6 +5238,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popp break; } case NODE_CALL: + case NODE_OPCALL: /* optimization shortcut * "literal".freeze -> opt_str_freeze("literal") */ @@ -5363,7 +5365,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popp } #endif /* receiver */ - if (type == NODE_CALL || type == NODE_QCALL) { + if (type == NODE_CALL || type == NODE_OPCALL || type == NODE_QCALL) { CHECK(COMPILE(recv, "recv", node->nd_recv)); if (type == NODE_QCALL) { lskip = NEW_LABEL(line); diff --git a/node.c b/node.c index b06e6dc175..f6d551a106 100644 --- a/node.c +++ b/node.c @@ -475,6 +475,7 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node) break; case NODE_CALL: + case NODE_OPCALL: ANN("method invocation"); ANN("format: [nd_recv].[nd_mid]([nd_args])"); ANN("example: obj.foo(1)"); diff --git a/node.h b/node.h index 8fbe226a87..5590369e2e 100644 --- a/node.h +++ b/node.h @@ -92,6 +92,8 @@ enum node_type { #define NODE_OP_CDECL NODE_OP_CDECL NODE_CALL, #define NODE_CALL NODE_CALL + NODE_OPCALL, +#define NODE_OPCALL NODE_OPCALL NODE_FCALL, #define NODE_FCALL NODE_FCALL NODE_VCALL, @@ -418,6 +420,7 @@ typedef struct RNode { #define NEW_DSYM(s) NEW_NODE(NODE_DSYM,s,0,0) #define NEW_EVSTR(n) NEW_NODE(NODE_EVSTR,0,(n),0) #define NEW_CALL(r,m,a) NEW_NODE(NODE_CALL,r,m,a) +#define NEW_OPCALL(r,m,a) NEW_NODE(NODE_OPCALL,r,m,a) #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) diff --git a/parse.y b/parse.y index bfea0c76a7..d8494dc75d 100644 --- a/parse.y +++ b/parse.y @@ -8837,14 +8837,14 @@ call_bin_op_gen(struct parser_params *parser, NODE *recv, ID id, NODE *arg1) { value_expr(recv); value_expr(arg1); - return NEW_CALL(recv, id, NEW_LIST(arg1)); + return NEW_OPCALL(recv, id, NEW_LIST(arg1)); } static NODE * call_uni_op_gen(struct parser_params *parser, NODE *recv, ID id) { value_expr(recv); - return NEW_CALL(recv, id, 0); + return NEW_OPCALL(recv, id, 0); } static NODE* @@ -9523,7 +9523,7 @@ void_expr_gen(struct parser_params *parser, NODE *node) if (!node) return; switch (nd_type(node)) { - case NODE_CALL: + case NODE_OPCALL: switch (node->nd_mid) { case '+': case '-': diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb index 4ae2fa273f..030442f9e9 100644 --- a/test/ruby/test_parse.rb +++ b/test/ruby/test_parse.rb @@ -761,6 +761,7 @@ x = __ENCODING__ x = x = 1 assert_nil eval("x; nil") assert_nil eval("1+1; nil") + assert_nil eval("1.+(1); nil") assert_nil eval("TestParse; nil") assert_nil eval("::TestParse; nil") assert_nil eval("x..x; nil")