From 0eeeb2ef4c3183e094a9b4b546bee28068d5113d Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 3 Dec 2004 09:30:33 +0000 Subject: * eval.c (proc_invoke): copy arguments to frame.argv. [ruby-core:03861] * object.c (convert_type): use rb_respond_to() again. [ruby-dev:25021] * eval.c (rb_respond_to): funcall respond_to? if it's redefined. [ruby-dev:25021] * io.c (rb_file_initialize): [ruby-dev:25032] * lib/ostruct.rb (OpenStruct::Marshaler): OpenStruct can be marshaled again. [ruby-core:03862] * io.c (rb_io_ctl): [ruby-dev:25019] * io.c (io_fread): need not to null terminate. [ruby-dev:24998] * io.c (read_all): remove unnecessary rb_str_resize(). [ruby-dev:24996] * io.c (io_read): ditto. * io.c (rb_io_sysread): use temporary lock. [ruby-dev:24992] git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@7447 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 7b75b84cc..020ed33cd 100644 --- a/eval.c +++ b/eval.c @@ -312,7 +312,7 @@ rb_clear_cache_by_class(klass) static ID init, eqq, each, aref, aset, match, missing; static ID added, singleton_added; -static ID __id__, __send__; +static ID __id__, __send__, respond_to; void rb_add_method(klass, mid, node, noex) @@ -3943,17 +3943,25 @@ module_setup(module, n) return result; } +static NODE *basic_respond_to = 0; + int rb_respond_to(obj, id) VALUE obj; ID id; { - if (rb_method_boundp(CLASS_OF(obj), id, 0)) { + VALUE klass = CLASS_OF(obj); + if (rb_method_node(klass, respond_to) == basic_respond_to && + rb_method_boundp(klass, id, 0)) { return Qtrue; } + else{ + return rb_funcall(obj, respond_to, 1, ID2SYM(id)); + } return Qfalse; } + /* * call-seq: * obj.respond_to?(symbol, include_private=false) => true or false @@ -7581,7 +7589,10 @@ Init_eval() rb_define_global_function("loop", rb_f_loop, 0); rb_define_method(rb_mKernel, "respond_to?", rb_obj_respond_to, -1); - + respond_to = rb_intern("respond_to?"); + basic_respond_to = rb_method_node(rb_cObject, respond_to); + rb_global_variable((VALUE*)&basic_respond_to); + rb_define_global_function("raise", rb_f_raise, -1); rb_define_global_function("fail", rb_f_raise, -1); @@ -8152,6 +8163,10 @@ proc_invoke(proc, args, self, klass) _block = *data; if (self != Qundef) _block.frame.self = self; if (klass) _block.frame.last_class = klass; + _block.frame.argc = RARRAY(args)->len; + _block.frame.argv = ALLOCA_N(VALUE, RARRAY(args)->len); + MEMCPY(_block.frame.argv, RARRAY(args)->ptr, VALUE, RARRAY(args)->len); + _block.frame.flags = FRAME_ALLOCA; ruby_block = &_block; PUSH_ITER(ITER_CUR); -- cgit