diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-01-07 07:36:40 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-01-07 07:36:40 +0000 |
commit | 6d481a4ae440532dcf674adf910c5cfa802f4679 (patch) | |
tree | 9eb994643aa02d75494ab17b10f33eee31bf8a9c /eval.c | |
parent | 954826f7a84722628b5386868dfdf7da2f4bd58a (diff) | |
download | ruby-6d481a4ae440532dcf674adf910c5cfa802f4679.tar.gz |
* hash.c (env_clear): new Hash compatible method.
* hash.c (env_shift): ditto.
* hash.c (env_invert): ditto.
* hash.c (env_replace): ditto.
* hash.c (env_update): ditto.
* array.c (rb_ary_join): dispatch based on "to_str".
* array.c (rb_ary_times): ditto.
* array.c (rb_ary_equal): ditto.
* process.c (rb_f_exec): dispatch based on "to_ary".
* eval.c (umethod_bind): exact class match is not required. relax
the restriction to subclasses.
* eval.c (rb_eval): call "inherited" before executing class body.
* class.c (rb_define_class): call "inherited" after defining the
constant.
* class.c (rb_define_class_under): ditto.
* eval.c (massign): expand first element if RHS is an array and
its size is 1, and LHS has concrete assignment target (i.e. LHS
has target(s) other than *var).
* eval.c (massign): avoid unnecessary avalue/svalue conversion.
* eval.c (rb_yield_0): ditto
* array.c (rb_ary_update): do not allocate unused array if rpl is
nil (i.e. merely removing elements).
* io.c (io_read): should resize supplied string if it's shorter
than expected.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3307 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 85 |
1 files changed, 48 insertions, 37 deletions
@@ -2158,7 +2158,7 @@ call_trace_func(event, node, self, id, klass) } static VALUE -mrhs_to_svalue(v) +avalue_to_svalue(v) VALUE v; { VALUE tmp; @@ -2178,7 +2178,7 @@ mrhs_to_svalue(v) } static VALUE -mrhs_to_avalue(v) +svalue_to_avalue(v) VALUE v; { VALUE tmp; @@ -2189,34 +2189,18 @@ mrhs_to_avalue(v) if (NIL_P(tmp)) { return rb_ary_new3(1, v); } - return v; -} - -static VALUE -args_to_svalue(v) - VALUE v; -{ - VALUE tmp; - - if (v == Qundef) return v; - tmp = rb_check_array_type(v); - if (NIL_P(tmp)) { - return v; - } - if (RARRAY(tmp)->len == 0) { - return Qundef; - } - if (RARRAY(tmp)->len == 1) { - v = rb_check_array_type(tmp); - if (NIL_P(v)) { - return RARRAY(tmp)->ptr[0]; - } + if (RARRAY(tmp)->len <= 1) { + return rb_ary_new3(1, tmp); } - return tmp; + return v; } static void return_check _((void)); -#define return_value(v) prot_tag->retval = (v) +#define return_value(v) do {\ + if ((prot_tag->retval = (v)) == Qundef) {\ + prot_tag->retval = Qnil;\ + }\ +} while (0) static VALUE rb_eval(self, n) @@ -2563,7 +2547,7 @@ rb_eval(self, n) break; case NODE_REXPAND: - result = mrhs_to_svalue(rb_eval(self, node->nd_head)); + result = avalue_to_svalue(rb_eval(self, node->nd_head)); break; case NODE_SVALUE: @@ -2928,7 +2912,8 @@ rb_eval(self, n) break; case NODE_MASGN: - result = massign(self, node, rb_eval(self, node->nd_value), 0); + result = svalue_to_avalue(rb_eval(self, node->nd_value)); + result = massign(self, node, result, 0); break; case NODE_LASGN: @@ -3333,9 +3318,8 @@ rb_eval(self, n) rb_extend_object(klass, ruby_wrapper); rb_include_module(klass, ruby_wrapper); } - - result = module_setup(klass, node->nd_body); if (super) rb_class_inherited(super, klass); + result = module_setup(klass, node->nd_body); } break; @@ -3856,10 +3840,11 @@ rb_yield_0(val, self, klass, pcall, avalue) } } else if (nd_type(block->var) == NODE_MASGN) { + if (!avalue) val = svalue_to_avalue(val); massign(self, block->var, val, pcall); } else { - if (avalue) val = mrhs_to_svalue(val); + if (avalue) val = avalue_to_svalue(val); if (val == Qundef) val = Qnil; assign(self, block->var, val, pcall); } @@ -3876,6 +3861,7 @@ rb_yield_0(val, self, klass, pcall, avalue) result = Qnil; } else if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) { + if (avalue) val = avalue_to_svalue(val); result = (*node->nd_cfnc)(val, node->nd_tval, self); } else { @@ -3970,12 +3956,30 @@ massign(self, node, val, pcall) NODE *list; long i = 0, len; - val = mrhs_to_avalue(val); len = RARRAY(val)->len; list = node->nd_head; - for (i=0; list && i<len; i++) { - assign(self, list->nd_head, RARRAY(val)->ptr[i], pcall); - list = list->nd_next; + if (len == 1 && list) { + VALUE v = RARRAY(val)->ptr[0]; + VALUE tmp = rb_check_array_type(v); + + if (NIL_P(tmp)) { + assign(self, list->nd_head, v, pcall); + list = list->nd_next; + } + else { + len = RARRAY(tmp)->len; + for (i=0; list && i<len; i++) { + assign(self, list->nd_head, RARRAY(tmp)->ptr[i], pcall); + list = list->nd_next; + } + } + i = 1; + } + else { + for (; list && i<len; i++) { + assign(self, list->nd_head, RARRAY(val)->ptr[i], pcall); + list = list->nd_next; + } } if (pcall && list) goto arg_error; if (node->nd_args) { @@ -4059,7 +4063,7 @@ assign(self, lhs, val, pcall) break; case NODE_MASGN: - massign(self, lhs, val, pcall); + massign(self, lhs, svalue_to_avalue(val), pcall); break; case NODE_CALL: @@ -7012,12 +7016,19 @@ umethod_bind(method, recv) st_lookup(RCLASS(CLASS_OF(recv))->m_tbl, data->oid, 0)) { rb_raise(rb_eTypeError, "method `%s' overridden", rb_id2name(data->oid)); } +#if 0 if (!((TYPE(data->rklass) == T_MODULE) ? rb_obj_is_kind_of(recv, data->rklass) : rb_obj_is_instance_of(recv, data->rklass))) { rb_raise(rb_eTypeError, "bind argument must be an instance of %s", rb_class2name(data->rklass)); } +#else + if(!rb_obj_is_kind_of(recv, data->rklass)) { + rb_raise(rb_eTypeError, "bind argument must be an instance of %s", + rb_class2name(data->rklass)); + } +#endif } method = Data_Make_Struct(rb_cMethod,struct METHOD,bm_mark,free,bound); @@ -7128,7 +7139,7 @@ static VALUE bmcall(args, method) VALUE args, method; { - args = mrhs_to_avalue(args); + args = svalue_to_avalue(args); return method_call(RARRAY(args)->len, RARRAY(args)->ptr, method); } |