From c3140b353c695aaa4165668c58998ddfc2e4d491 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 28 Jul 2011 00:17:59 -0700 Subject: [PATCH] Remove inadvertent symbol creation from send, __send__, and public_send --- vm_eval.c | 13 ++++++++++++- vm_insnhelper.c | 11 ++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/vm_eval.c b/vm_eval.c index d6e9d6e..d543ad6 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -677,6 +677,7 @@ rb_funcall_passing_block(VALUE recv, ID mid, int argc, const VALUE *argv) static VALUE send_internal(int argc, const VALUE *argv, VALUE recv, call_type scope) { + ID id; VALUE vid; VALUE self = RUBY_VM_PREVIOUS_CONTROL_FRAME(GET_THREAD()->cfp)->self; rb_thread_t *th = GET_THREAD(); @@ -688,7 +689,17 @@ send_internal(int argc, const VALUE *argv, VALUE recv, call_type scope) vid = *argv++; argc--; PASS_PASSED_BLOCK_TH(th); - return rb_call0(recv, rb_to_id(vid), argc, argv, scope, self); + id = rb_check_id(&vid); + if (!id) { + if (!rb_method_basic_definition_p(CLASS_OF(recv), idMethodMissing)) { + id = rb_to_id(vid); + } + else { + rb_raise(rb_eNoMethodError, "undefined method `%s' for %s", RSTRING_PTR(vid), + rb_class2name(CLASS_OF(recv))); + } + } + return rb_call0(recv, id, argc, argv, scope, self); } /* diff --git a/vm_insnhelper.c b/vm_insnhelper.c index a35dbb1..f6b7834 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -584,7 +584,16 @@ vm_call_method(rb_thread_t *th, rb_control_frame_t *cfp, } sym = TOPN(i); - id = SYMBOL_P(sym) ? SYM2ID(sym) : rb_to_id(sym); + id = SYMBOL_P(sym) ? SYM2ID(sym) : rb_check_id(&sym); + if (!id) { + if (!rb_method_basic_definition_p(CLASS_OF(recv), idMethodMissing)) { + id = rb_to_id(sym); + } + else { + rb_raise(rb_eNoMethodError, "undefined method `%s' for %s", RSTRING_PTR(sym), + rb_class2name(CLASS_OF(recv))); + } + } /* shift arguments */ if (i > 0) { MEMMOVE(&TOPN(i), &TOPN(i-1), VALUE, i); -- 1.7.5