diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-03-20 06:27:22 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-03-20 06:27:22 +0000 |
commit | 85dd7bb0ef28fe4ce63641e653d92e42327b0207 (patch) | |
tree | bcd1e5b816c1a7cdc06f31f28cd967f6b78e9a96 /eval.c | |
parent | 5782e5b0006ca5f941e8cdd7101ca07218c9d816 (diff) |
* eval.c (load_dyna): clear ruby_errinfo. (ruby-bugs-ja PR#409)
* io.c (read_all): make str empty if given. (ruby-bugs-ja PR#408)
* io.c (io_read): ditto.
* io.c (rb_io_sysread): ditto.
* range.c: do not override min and max.
* sprintf.c (remove_sign_bits): octal left most digit for negative
numbers may be '3'. (ruby-bugs-ja PR#407)
* sprintf.c (rb_f_sprintf): should prefix sign bits if bignum is
negative, using sign_bits().
* eval.c (avalue_to_mrhs): split argument passing and assignment
conversion.
* eval.c (svalue_to_mrhs): ditto.
* eval.c (avalue_to_svalue): avalue_to_svalue([[1,2]]) should be
[[1,2]], not [1,2] to wrap-around.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3584 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 46 |
1 files changed, 40 insertions, 6 deletions
@@ -2194,11 +2194,19 @@ avalue_to_svalue(v) if (NIL_P(tmp)) { return v; } - if (RARRAY(tmp)->len == 0) { + v = tmp; + if (RARRAY(v)->len == 0) { return Qundef; } - if (RARRAY(tmp)->len == 1) { - return RARRAY(tmp)->ptr[0]; + if (RARRAY(v)->len == 1) { + tmp = rb_check_array_type(RARRAY(v)->ptr[0]); + if (NIL_P(tmp)) { + return RARRAY(v)->ptr[0]; + } + if (RARRAY(tmp)->len > 1) { + return v; + } + return tmp; } return tmp; } @@ -2215,8 +2223,33 @@ svalue_to_avalue(v) if (NIL_P(tmp)) { return rb_ary_new3(1, v); } - if (RARRAY(tmp)->len <= 1) { - return rb_ary_new3(1, tmp); + v = tmp; + if (RARRAY(v)->len == 1) { + tmp = rb_check_array_type(RARRAY(v)->ptr[0]); + if (NIL_P(tmp)) return rb_ary_new3(1, v); + if (RARRAY(tmp)->len > 1) return v; + return tmp; + } + return v; +} + +static VALUE +avalue_to_mrhs(v) + VALUE v; +{ + VALUE tmp; + + if (v == Qundef) return v; + tmp = rb_check_array_type(v); + if (NIL_P(tmp)) { + return v; + } + v = tmp; + if (RARRAY(v)->len == 0) { + return Qundef; + } + if (RARRAY(v)->len == 1) { + return RARRAY(v)->ptr[0]; } return tmp; } @@ -2624,7 +2657,7 @@ rb_eval(self, n) break; case NODE_REXPAND: - result = avalue_to_svalue(rb_eval(self, node->nd_head)); + result = avalue_to_mrhs(rb_eval(self, node->nd_head)); break; case NODE_SVALUE: @@ -5778,6 +5811,7 @@ load_dyna(feature, fname) SCOPE_SET(old_vmode); } if (state) JUMP_TAG(state); + ruby_errinfo = Qnil; return Qtrue; } |