>>>>> "Y" == Yukihiro Matsumoto <matz / zetabits.com> writes: Y> Tell me, have you implemented this already? Yes, but not yet finished. Actually there are big modifications because I must modify : * parse.y for the new syntax `def toto(Array a)' * eval.c for NODE_DEFN and NODE_DEFS * search_method(), rb_call() for the runtime part. I've another patch if you want :-) pigeon% cat b.rb #!./ruby autoload :CGI, "cgi" ENV["QUERY_STRING"] = "a=b" ENV["REQUEST_METHOD"] = "GET" a = Thread.new { p CGI.new.params } b = Thread.new { p CGI.new.params } a.join b.join pigeon% pigeon% /usr/bin/ruby b.rb {"a"=>["b"]} b.rb:6: uninitialized constant CGI (NameError) from b.rb:8:in `join' from b.rb:8 pigeon% pigeon% b.rb {"a"=>["b"]} {"a"=>["b"]} pigeon% Rather than storing the name of the class in autoload_tbl it store a struct typedef struct { char *modname; VALUE thr; } autoload_st; and it check which thread load the module void rb_autoload_load(id) ID id; { char *modname; VALUE module; autoload_st *al; st_lookup(autoload_tbl, id, &al); if (!al->thr) { al->thr = rb_thread_current(); st_insert(autoload_tbl, id, al); module = rb_str_new2(al->modname); FL_UNSET(module, FL_TAINT); rb_f_require(Qnil, module); st_delete(autoload_tbl, &id, &al); free(al->modname); free(al); } else if (rb_feature_p(al->modname, Qtrue)) { return; } } all tests are adapted, for example static int top_const_get(id, klassp) ID id; VALUE *klassp; { autoload_st *al; /* pre-defined class */ if (st_lookup(rb_class_tbl, id, klassp)) return Qtrue; /* autoload */ if (autoload_tbl && st_lookup(autoload_tbl, id, &al) && al->thr != rb_thread_current()) { rb_autoload_load(id); *klassp = rb_const_get(rb_cObject, id); return Qtrue; } return Qfalse; } This can work or not ? Y> |./b.rb:29: ambiguous call for toto ([Array, B::C] -- [Array, Array]) (RuntimeError) Y> |pigeon% Y> | Y> | it must give an error or not ? Y> I believe it should give an error. OK for the line 29 but my question was more for the line 28 pigeon% cat -n b.rb 1 #!./ruby 2 class B 3 class C 4 end 5 end 6 module D 7 def toto(B::C b, String d = "") 8 puts "B::C #{b} -- String #{d}" 9 end 10 end 11 12 class A 13 include D 14 def toto(B::C b, Array c = [12, 24]) 15 puts "B::C #{b} -- Array #{c.join ' '}" 16 end 17 def toto(Array b, B::C c = B::C.new) 18 puts "Array #{b.join ' '} -- B::C #{c}" 19 end 20 def toto(Array b, Array c = [3, 4]) 21 puts "Array #{b.join ' '} -- Array #{c.join ' '}" 22 end 23 end 24 25 a = A.new 26 27 a.toto(B::C.new, "toto") 28 a.toto(B::C.new) 29 a.toto([1, 2]) pigeon% If it look only in the class A it can resolve the call `a.toto(B::C.new)' by [B::C, Array] (this is what it do actually) but if it look also in the superclass, it shall see that it has an ambiguous call [B::C, String] and [B::C, Array] In this case (not all parameters are given) it must also search in the superclasses ? Guy Decoux