зеркало из https://github.com/github/ruby.git
compile.c: massign optimization
* compile.c (compile_massign): optimization for special case, assignments by aset or attrset. http://kokizzu.blogspot.jp/2015/02/c-java-hhvm-ruby-nodejsrhinojscspidermo.html http://www.atdot.net/~ko1/diary/201502.html#d16 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49614 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
1917960510
Коммит
4aa088c72f
|
@ -1,3 +1,10 @@
|
||||||
|
Mon Feb 16 20:58:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* compile.c (compile_massign): optimization for special case,
|
||||||
|
assignments by aset or attrset.
|
||||||
|
http://kokizzu.blogspot.jp/2015/02/c-java-hhvm-ruby-nodejsrhinojscspidermo.html
|
||||||
|
http://www.atdot.net/~ko1/diary/201502.html#d16
|
||||||
|
|
||||||
Sun Feb 15 10:41:23 2015 Sho Hashimoto <sho-h@ruby-lang.org>
|
Sun Feb 15 10:41:23 2015 Sho Hashimoto <sho-h@ruby-lang.org>
|
||||||
|
|
||||||
* doc/standard_library.rdoc: [DOC] delete removed libraries.
|
* doc/standard_library.rdoc: [DOC] delete removed libraries.
|
||||||
|
|
28
compile.c
28
compile.c
|
@ -2782,6 +2782,7 @@ compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int poped)
|
||||||
|
|
||||||
if (!poped || splatn || !compile_massign_opt(iseq, ret, rhsn, lhsn)) {
|
if (!poped || splatn || !compile_massign_opt(iseq, ret, rhsn, lhsn)) {
|
||||||
int llen = 0;
|
int llen = 0;
|
||||||
|
int expand = 1;
|
||||||
DECL_ANCHOR(lhsseq);
|
DECL_ANCHOR(lhsseq);
|
||||||
|
|
||||||
INIT_ANCHOR(lhsseq);
|
INIT_ANCHOR(lhsseq);
|
||||||
|
@ -2797,9 +2798,30 @@ compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int poped)
|
||||||
if (!poped) {
|
if (!poped) {
|
||||||
ADD_INSN(ret, nd_line(node), dup);
|
ADD_INSN(ret, nd_line(node), dup);
|
||||||
}
|
}
|
||||||
|
else if (!lhs_splat) {
|
||||||
ADD_INSN2(ret, nd_line(node), expandarray,
|
INSN *last = (INSN*)ret->last;
|
||||||
INT2FIX(llen), INT2FIX(lhs_splat));
|
if (last->link.type == ISEQ_ELEMENT_INSN &&
|
||||||
|
last->insn_id == BIN(newarray) &&
|
||||||
|
last->operand_size == 1 &&
|
||||||
|
OPERAND_AT(last, 0) == INT2FIX(llen)) {
|
||||||
|
/* special case: assign to aset or attrset */
|
||||||
|
if (llen == 2) {
|
||||||
|
POP_ELEMENT(ret);
|
||||||
|
ADD_INSN(ret, nd_line(node), swap);
|
||||||
|
expand = 0;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
else if (llen > 2) {
|
||||||
|
last->insn_id = BIN(reverse);
|
||||||
|
expand = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (expand) {
|
||||||
|
ADD_INSN2(ret, nd_line(node), expandarray,
|
||||||
|
INT2FIX(llen), INT2FIX(lhs_splat));
|
||||||
|
}
|
||||||
ADD_SEQ(ret, lhsseq);
|
ADD_SEQ(ret, lhsseq);
|
||||||
|
|
||||||
if (lhs_splat) {
|
if (lhs_splat) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче