[2947] MacRuby/trunk
Revision: 2947 http://trac.macosforge.org/projects/ruby/changeset/2947 Author: lsansonetti@apple.com Date: 2009-11-02 21:18:33 -0800 (Mon, 02 Nov 2009) Log Message: ----------- make sure Kernel#respond_to? doesn't call itself stupid^Wrecursively Modified Paths: -------------- MacRuby/trunk/dispatcher.cpp MacRuby/trunk/vm.h MacRuby/trunk/vm_method.c Modified: MacRuby/trunk/dispatcher.cpp =================================================================== --- MacRuby/trunk/dispatcher.cpp 2009-11-03 04:28:58 UTC (rev 2946) +++ MacRuby/trunk/dispatcher.cpp 2009-11-03 05:18:33 UTC (rev 2947) @@ -1757,16 +1757,17 @@ extern IMP basic_respond_to_imp; // vm_method.c -extern "C" -bool -rb_vm_respond_to(VALUE obj, SEL sel, bool priv) +static bool +respond_to(VALUE obj, SEL sel, bool priv, bool check_override) { VALUE klass = CLASS_OF(obj); - IMP respond_to_imp = class_getMethodImplementation((Class)klass, - selRespondTo); + const bool overriden = check_override + ? (class_getMethodImplementation((Class)klass, selRespondTo) + != basic_respond_to_imp) + : false; - if (respond_to_imp == basic_respond_to_imp) { + if (!overriden) { // FIXME: too slow! bool reject_pure_ruby_methods = false; Method m = class_getInstanceMethod((Class)klass, sel); @@ -1802,3 +1803,17 @@ return rb_vm_call(obj, selRespondTo, n, args, false) == Qtrue; } } + +extern "C" +bool +rb_vm_respond_to(VALUE obj, SEL sel, bool priv) +{ + return respond_to(obj, sel, priv, true); +} + +extern "C" +bool +rb_vm_respond_to2(VALUE obj, SEL sel, bool priv, bool check_override) +{ + return respond_to(obj, sel, priv, check_override); +} Modified: MacRuby/trunk/vm.h =================================================================== --- MacRuby/trunk/vm.h 2009-11-03 04:28:58 UTC (rev 2946) +++ MacRuby/trunk/vm.h 2009-11-03 05:18:33 UTC (rev 2947) @@ -300,6 +300,7 @@ VALUE rb_vm_yield(int argc, const VALUE *argv); VALUE rb_vm_yield_under(VALUE klass, VALUE self, int argc, const VALUE *argv); bool rb_vm_respond_to(VALUE obj, SEL sel, bool priv); +bool rb_vm_respond_to2(VALUE obj, SEL sel, bool priv, bool check_override); VALUE rb_vm_method_missing(VALUE obj, int argc, const VALUE *argv); void rb_vm_push_methods(VALUE ary, VALUE mod, bool include_objc_methods, int (*filter) (VALUE, ID, VALUE)); Modified: MacRuby/trunk/vm_method.c =================================================================== --- MacRuby/trunk/vm_method.c 2009-11-03 04:28:58 UTC (rev 2946) +++ MacRuby/trunk/vm_method.c 2009-11-03 05:18:33 UTC (rev 2947) @@ -769,24 +769,30 @@ //static NODE *basic_respond_to = 0; -bool -rb_obj_respond_to(VALUE obj, ID id, bool priv) +static bool +rb_obj_respond_to2(VALUE obj, ID id, bool priv, bool check_override) { const char *id_name = rb_id2name(id); SEL sel = sel_registerName(id_name); - if (!rb_vm_respond_to(obj, sel, priv)) { + if (!rb_vm_respond_to2(obj, sel, priv, check_override)) { char buf[100]; snprintf(buf, sizeof buf, "%s:", id_name); sel = sel_registerName(buf); - return rb_vm_respond_to(obj, sel, priv); + return rb_vm_respond_to2(obj, sel, priv, check_override); } return true; } bool +rb_obj_respond_to(VALUE obj, ID id, bool priv) +{ + return rb_obj_respond_to2(obj, id, priv, true); +} + +bool rb_respond_to(VALUE obj, ID id) { - return rb_obj_respond_to(obj, id, Qfalse); + return rb_obj_respond_to(obj, id, false); } /* @@ -806,7 +812,7 @@ rb_scan_args(argc, argv, "11", &mid, &priv); id = rb_to_id(mid); - return rb_obj_respond_to(obj, id, RTEST(priv)) ? Qtrue : Qfalse; + return rb_obj_respond_to2(obj, id, RTEST(priv), false) ? Qtrue : Qfalse; } IMP basic_respond_to_imp = NULL;
participants (1)
-
source_changes@macosforge.org