summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-12-03 09:30:33 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-12-03 09:30:33 +0000
commit379e85a5f5b243f307b97b76a762947ffbe6bc48 (patch)
treebfbe7e40f4e9e813d4cdce3a5776da1ec41a8080 /eval.c
parent744ec6294cbe29513af083bf1106b68247c72275 (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.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/eval.c b/eval.c
index 7b75b84cc2..020ed33cd4 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);