>>>>> "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