From bb3f03633677b19814954da77975ec3f485eb490 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 6 Jun 2014 06:05:19 +0000 Subject: node.h: NODE_PRIVATE_RECV * node.h (NODE_PRIVATE_RECV): name a magic number, `self` as the receiver of a setter method call. * compile.c (private_recv_p), parse.y (attr_receiver): use the named macro. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46361 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- compile.c | 10 ++++++---- node.h | 2 ++ parse.y | 11 +++++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/compile.c b/compile.c index 99532b3e29..aeebe2634e 100644 --- a/compile.c +++ b/compile.c @@ -2786,6 +2786,8 @@ compile_cpath(LINK_ANCHOR *ret, rb_iseq_t *iseq, NODE *cpath) } } +#define private_recv_p(node) ((node)->nd_recv == NODE_PRIVATE_RECV) + #define defined_expr defined_expr0 static int defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret, @@ -2893,7 +2895,7 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret, switch (type) { case NODE_ATTRASGN: - if (node->nd_recv == (NODE *)1) break; + if (private_recv_p(node)) break; case NODE_CALL: self = FALSE; break; @@ -4335,7 +4337,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) /* optimization shortcut * obj["literal"] -> opt_aref_with(obj, "literal") */ - if (node->nd_mid == idAREF && node->nd_recv != (NODE *)1 && node->nd_args && + if (node->nd_mid == idAREF && !private_recv_p(node) && node->nd_args && nd_type(node->nd_args) == NODE_ARRAY && node->nd_args->nd_alen == 1 && nd_type(node->nd_args->nd_head) == NODE_STR) { @@ -5322,7 +5324,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) /* optimization shortcut * obj["literal"] = value -> opt_aset_with(obj, "literal", value) */ - if (node->nd_mid == idASET && node->nd_recv != (NODE *)1 && node->nd_args && + if (node->nd_mid == idASET && !private_recv_p(node) && node->nd_args && nd_type(node->nd_args) == NODE_ARRAY && node->nd_args->nd_alen == 2 && nd_type(node->nd_args->nd_head) == NODE_STR) { @@ -5345,7 +5347,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) INIT_ANCHOR(args); argc = setup_args(iseq, args, node->nd_args, &flag); - if (node->nd_recv == (NODE *) 1) { + if (private_recv_p(node)) { flag |= VM_CALL_FCALL; ADD_INSN(recv, line, putself); } diff --git a/node.h b/node.h index 9ee07048c2..2c6cd91e2b 100644 --- a/node.h +++ b/node.h @@ -465,6 +465,8 @@ typedef struct RNode { #define NEW_PRELUDE(p,b) NEW_NODE(NODE_PRELUDE,p,b,0) #define NEW_MEMO(a,b,c) NEW_NODE(NODE_MEMO,a,b,c) +#define NODE_PRIVATE_RECV ((NODE *)1) + #define roomof(x, y) ((sizeof(x) + sizeof(y) - 1) / sizeof(y)) #define MEMO_FOR(type, value) ((type *)RARRAY_PTR(value)) #define NEW_MEMO_FOR(type, value) \ diff --git a/parse.y b/parse.y index 2e73d64401..61251b9309 100644 --- a/parse.y +++ b/parse.y @@ -8895,11 +8895,18 @@ rb_id_attrget(ID id) return attrsetname_to_attr(rb_id2str(id)); } +static inline NODE * +attr_receiver(NODE *recv) +{ + if (recv && nd_type(recv) == NODE_SELF) + recv = NODE_PRIVATE_RECV; + return recv; +} + static NODE * attrset_gen(struct parser_params *parser, NODE *recv, ID id) { - if (recv && nd_type(recv) == NODE_SELF) - recv = (NODE *)1; + recv = attr_receiver(recv); return NEW_ATTRASGN(recv, rb_id_attrset(id), 0); } -- cgit v1.2.3