summaryrefslogtreecommitdiff
path: root/insns.def
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-08-23 07:10:56 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-08-23 07:10:56 +0000
commite39eb9dab50eaa681467e51145b37cdc11667830 (patch)
treeb0b1e300f1105da8124013b71adab030b9182ee8 /insns.def
parentac41d2774982fcf6f297e71c3e1209a650e44ce7 (diff)
* 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.def50
1 files changed, 5 insertions, 45 deletions
diff --git a/insns.def b/insns.def
index 5728de6334..60d9d9a634 100644
--- a/insns.def
+++ b/insns.def
@@ -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);
}
/**