diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-12-03 09:30:33 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-12-03 09:30:33 +0000 |
commit | 379e85a5f5b243f307b97b76a762947ffbe6bc48 (patch) | |
tree | bfbe7e40f4e9e813d4cdce3a5776da1ec41a8080 /eval.c | |
parent | 744ec6294cbe29513af083bf1106b68247c72275 (diff) |
* 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: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7447 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 21 |
1 files changed, 18 insertions, 3 deletions
@@ -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); |