diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-08-23 07:10:56 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-08-23 07:10:56 +0000 |
commit | e39eb9dab50eaa681467e51145b37cdc11667830 (patch) | |
tree | b0b1e300f1105da8124013b71adab030b9182ee8 /insns.def | |
parent | ac41d2774982fcf6f297e71c3e1209a650e44ce7 (diff) | |
download | ruby-e39eb9dab50eaa681467e51145b37cdc11667830.tar.gz |
* compile.c, insns.def, parse.y: fix massign order. This change
causes performance problem. Try vm1_swap benchmark.
[ruby-dev:31522]
* insns.def, insnhelper.ci: move process body of expandarray insn to
vm_expandarray().
* bootstraptest/test_knownbug.rb, bootstraptest/test_massign.rb:
move a solved test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13236 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'insns.def')
-rw-r--r-- | insns.def | 50 |
1 files changed, 5 insertions, 45 deletions
@@ -446,57 +446,17 @@ duparray num以上の要素は切り捨てる。 配列オブジェクトでなければ、num - 1 個の nil を積む。 もし flag が真なら、残り要素の配列を積む + flag: 0x01 - 最後を配列に + flag: 0x02 - postarg 用 + flag: 0x04 - reverse? */ DEFINE_INSN expandarray (rb_num_t num, rb_num_t flag) (..., VALUE ary) -(...) // inc += flag == 2 ? num : ((num > 0) ? num - 1 + (flag ? 1 : 0) : num + 1 - (flag ? 1 : 0)); +(...) // inc += flag == 0x02 ? num : ((num > 0) ? num - 1 + (flag ? 1 : 0) : num + 1 - (flag ? 1 : 0)); { - int i; - - if (flag == 2) { - VALUE *ptr = RARRAY_PTR(ary); - int len = RARRAY_LEN(ary); - int start = len - num; - - if (start < 0) { - for (i=0; i<num-len; i++) { - PUSH(Qnil); - } - for (i=0; i<len; i++) { - PUSH(ptr[len-i-1]); - } - rb_ary_clear(ary); - } - else { - for (i=0; i<num; i++) { - PUSH(ptr[len-i-1]); - } - RARRAY_LEN(ary) = len - num; - } - } - else { - int len; - if (TYPE(ary) != T_ARRAY) { - ary = rb_ary_to_ary(ary); - } - len = RARRAY_LEN(ary); - for (i = 0; i < len && i < num; i++) { - PUSH(RARRAY_PTR(ary)[i]); - } - for (; i < num; i++) { - PUSH(Qnil); - } - if (flag) { - if (len > num) { - PUSH(rb_ary_new4(len - num, &RARRAY_PTR(ary)[num])); - } - else { - PUSH(rb_ary_new()); - } - } - } + vm_expandarray(GET_CFP(), ary, num, flag); } /** |