From 3c7c983300670b29e6c7feb3b8c23421c53af01b Mon Sep 17 00:00:00 2001 From: mame Date: Thu, 17 Mar 2016 12:47:31 +0000 Subject: * compile.c (NODE_CALL): add optimization shortcut for Array#max/min. Now `[x, y].max` is optimized so that a temporal array object is not created in some condition. * insns.def (opt_newarray_max, opt_newarray_min): added. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54153 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- compile.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'compile.c') diff --git a/compile.c b/compile.c index 76024dfe53..767e2b1772 100644 --- a/compile.c +++ b/compile.c @@ -4916,6 +4916,26 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) } break; } + /* optimization shortcut + * [a, b, ...].max/min -> a, b, c, opt_newarray_max/min + */ + if (node->nd_recv && nd_type(node->nd_recv) == NODE_ARRAY && + (node->nd_mid == idMax || node->nd_mid == idMin) && node->nd_args == NULL && + ISEQ_COMPILE_DATA(iseq)->current_block == NULL && + ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction) { + COMPILE(ret, "recv", node->nd_recv); + if (((INSN*)ret->last)->insn_id == BIN(newarray)) { + ((INSN*)ret->last)->insn_id = + node->nd_mid == idMax ? BIN(opt_newarray_max) : BIN(opt_newarray_min); + } + else { + ADD_SEND(ret, line, node->nd_mid, INT2FIX(0)); + } + if (poped) { + ADD_INSN(ret, line, pop); + } + break; + } case NODE_QCALL: case NODE_FCALL: case NODE_VCALL:{ /* VCALL: variable or call */ -- cgit v1.2.3