ts wrote: > >>>>> "D" == Daniel Berger <djberg96 / hotmail.com> writes: > > D> I'm confused - what conversion is it trying to do? I thought these two > D> were equivalent: > > D> if(NIL_P(rbNum)) > > D> if(Qnil == rbNum) > > if you want to write the same with rb_scan_args(), you must write > > if (rb_scan_args(argc, argv, "01", &rbNum)) { > rb_thread_wait_for(rb_time_interval(rbNum)); > } > else { > rb_thread_sleep_forever(); > } > > > and you see that the ruby version is faster :-) > > > Guy Decoux First things first. You're skirting the issue. It SHOULD work. There is some sort of side effect happening, because the error is NOT coming from process.c. I added some debug print statements directly into process.c and rebuilt. I can't even get to that point before the error is raised. This smells like a bug and/or some kind of global setting being used some where. Second, counting argc is not significantly faster than using rb_scan_args(). Using the following code, counting argc was faster by by .01 to .05 seconds over *ONE MILLION* iterations. That's 5.0e-008 per iteration. Rather insignificant don't you think? /* foo.c * * The purpose of this class is to test the speed of manual counting * of argc vs using rb_scan_args(). */ #include "ruby.h" #include <stdlib.h> VALUE some_func(int num); int other_func(VALUE rbNum); VALUE some_func(int num){ VALUE rbNum = INT2FIX(num); return rbNum; } int other_func(VALUE rbNum){ int y = FIX2INT(rbNum); return y; } static VALUE test_scan(int argc, VALUE* argv){ VALUE rbNum; rb_scan_args(argc,argv,"01",&rbNum); if(NIL_P(rbNum)){ some_func(55); } else{ other_func(argv[0]); } return rbNum; } static VALUE test_count(int argc, VALUE* argv){ if(argc == 0){ some_func(55); } else if(argc == 1){ other_func(argv[0]); } else{ rb_raise(rb_eStandardError,"Wrong number of arguments"); } return Qnil; } void Init_foo(){ VALUE cFoo = rb_define_class("Foo",rb_cObject); rb_define_singleton_method(cFoo,"test_scan",test_scan,-1); rb_define_singleton_method(cFoo,"test_count",test_count,-1); } # extconf.rb require "mkmf" create_makefile("foo") # test_basic.rb # Proof that you ought to be able to send 'nil' # Adding debug print statements to the C code proves that it # does what I intend. $:.unshift Dir.pwd require "foo" Foo.test_scan(5) # works Foo.test_scan # works Foo.test_scan(nil) # works (!) # test_speed.rb $LOAD_PATH.unshift Dir.pwd require "foo" require "benchmark" include Benchmark bm do |x| x.report("scan"){ 1000000.times{ Foo.test_scan } } x.report("count"){ 1000000.times{ Foo.test_count } } end Results of benchmark using on Solaris 9, gcc 3.4.2, 500Mhz Sparc Ultra IIe, 512 MB RAM: user system total real scan 3.220000 0.000000 3.220000 (3.224927) count 3.170000 0.000000 3.170000 (3.179761) Regards, Dan