summaryrefslogtreecommitdiff
path: root/insns.def
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-26 18:56:15 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-26 18:56:15 +0000
commit30ab3f75f9a8399c300359ea84e25f9a93df73ae (patch)
treeb3ec2146dec6a8344a47504d05f414b56cd98550 /insns.def
parent99c58e9ebcb90a81c2b6201d1d11ac1d5bd84604 (diff)
* compile.c (compile_massign), insns.def (expandarray): support
postarg with massign (a, *b, c = ...). * bootstraptest/test_massign.rb: add tests for above. * compile.h: fix debug macro names. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12631 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'insns.def')
-rw-r--r--insns.def97
1 files changed, 51 insertions, 46 deletions
diff --git a/insns.def b/insns.def
index 9db85ff162..8bd52fa496 100644
--- a/insns.def
+++ b/insns.def
@@ -480,43 +480,67 @@ DEFINE_INSN
expandarray
(rb_num_t num, rb_num_t flag)
(..., VALUE ary)
-(...) // inc += (num > 0) ? num - 1 + (flag ? 1 : 0) : num + 1 - (flag ? 1 : 0);
+(...) // inc += flag == 2 ? num : ((num > 0) ? num - 1 + (flag ? 1 : 0) : num + 1 - (flag ? 1 : 0));
{
int i;
- if ((long)num >= 0) {
- 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]));
+
+ 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);
}
- else {
- PUSH(rb_ary_new());
+ 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 {
- long holdnum = -num;
- VALUE val;
-
- val = rb_ary_new4(holdnum, STACK_ADDR_FROM_TOP(holdnum));
- if (CLASS_OF(ary) == rb_cArray) {
- val = rb_ary_concat(val, ary);
+ if ((long)num >= 0) {
+ 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());
+ }
+ }
}
else {
- rb_ary_push(val, ary);
+ long holdnum = -num;
+ VALUE val;
+
+ val = rb_ary_new4(holdnum, STACK_ADDR_FROM_TOP(holdnum));
+ if (CLASS_OF(ary) == rb_cArray) {
+ val = rb_ary_concat(val, ary);
+ }
+ else {
+ rb_ary_push(val, ary);
+ }
+ POPN(holdnum);
+ PUSH(val);
}
- POPN(holdnum);
- PUSH(val);
}
}
@@ -571,25 +595,6 @@ splatarray
tmp = rb_ary_new3(1, ary);
}
obj = tmp;
-
- if (0) {
- if (flag == Qfalse) {
- /* NODE_SPLAT */
- obj = rb_Array(ary);
- }
- else {
- /* NODE_SVALUE */
- if (RARRAY_LEN(ary) == 0) {
- obj = Qnil;
- }
- else if (RARRAY_LEN(ary) == 1) {
- obj = RARRAY_PTR(ary)[0];
- }
- else {
- obj = ary;
- }
- }
- }
}
/**