diff options
-rw-r--r-- | compile.c | 6 | ||||
-rw-r--r-- | node.c | 1 | ||||
-rw-r--r-- | node.h | 3 | ||||
-rw-r--r-- | parse.y | 6 | ||||
-rw-r--r-- | test/ruby/test_parse.rb | 1 |
5 files changed, 12 insertions, 5 deletions
@@ -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); @@ -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)"); @@ -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) @@ -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") |