Revision: 542 http://trac.macosforge.org/projects/ruby/changeset/542 Author: lsansonetti@apple.com Date: 2008-09-01 14:08:39 -0700 (Mon, 01 Sep 2008) Log Message: ----------- fix for #120 Modified Paths: -------------- MacRuby/trunk/test/ruby/test_objc.rb MacRuby/trunk/vm_insnhelper.c Modified: MacRuby/trunk/test/ruby/test_objc.rb =================================================================== --- MacRuby/trunk/test/ruby/test_objc.rb 2008-09-01 21:08:22 UTC (rev 541) +++ MacRuby/trunk/test/ruby/test_objc.rb 2008-09-01 21:08:39 UTC (rev 542) @@ -372,9 +372,13 @@ assert(o.respond_to?(:foo=)) assert(o.respond_to?(:setFoo)) o.setFoo(42) - assert(42, o.foo) - o.performSelector('setFoo:', withObject:42) - assert(42, o.foo) + assert_equal(42, o.foo) + assert_equal(nil, o.performSelector('setFoo:', withObject:42)) + assert_equal(42, o.foo) + assert_equal(nil, o.send('setFoo', 42)) + assert_equal(42, o.foo) + assert_equal(nil, o.send('setFoo:', 42)) + assert_equal(42, o.foo) end def test_respond_to_objc_methods Modified: MacRuby/trunk/vm_insnhelper.c =================================================================== --- MacRuby/trunk/vm_insnhelper.c 2008-09-01 21:08:22 UTC (rev 541) +++ MacRuby/trunk/vm_insnhelper.c 2008-09-01 21:08:39 UTC (rev 542) @@ -495,17 +495,20 @@ if (node->nd_cfnc == rb_f_send) { int i = *num - 1; VALUE sym = TOPN(i); - *id = SYMBOL_P(sym) ? SYM2ID(sym) : rb_to_id(sym); + ID new_id = SYMBOL_P(sym) ? SYM2ID(sym) : rb_to_id(sym); + NODE *new_node = rb_method_node(klass, new_id); + if (new_node != NULL) { + /* shift arguments */ + if (i > 0) { + MEMMOVE(&TOPN(i), &TOPN(i-1), VALUE, i); + } - /* shift arguments */ - if (i > 0) { - MEMMOVE(&TOPN(i), &TOPN(i-1), VALUE, i); + *mn = new_node; + *id = new_id; + *num -= 1; + DEC_SP(1); + *flag |= VM_CALL_FCALL_BIT; } - - *mn = rb_method_node(klass, *id); - *num -= 1; - DEC_SP(1); - *flag |= VM_CALL_FCALL_BIT; } } } @@ -695,7 +698,7 @@ rcall_dispatch: if (flag & VM_CALL_SEND_BIT) { - vm_send_optimize(cfp, (NODE **)&mn, (rb_num_t *)&flag, (rb_num_t *)&num, (ID *)&id, klass); + vm_send_optimize(cfp, (NODE **)&mn, (rb_num_t *)&flag, (rb_num_t *)&num, (ID *)&id, klass); } DLOG("RCALL", "%c[<%s %p> %s] node=%p cached=%d", class_isMetaClass((Class)klass) ? '+' : '-', class_getName((Class)klass), (void *)recv, (char *)rb_id2name(id), mn, cached);