[PD-cvs] externals/clr clr.cpp,1.7,1.8 test-clr.pd,1.9,1.10

Thomas Grill xovo at users.sourceforge.net
Wed Mar 8 02:59:27 CET 2006


Update of /cvsroot/pure-data/externals/clr
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25474/clr

Modified Files:
	clr.cpp test-clr.pd 
Log Message:
finally implemented efficient method registering
other cleanups and improvements

Index: test-clr.pd
===================================================================
RCS file: /cvsroot/pure-data/externals/clr/test-clr.pd,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** test-clr.pd	6 Mar 2006 01:10:36 -0000	1.9
--- test-clr.pd	8 Mar 2006 01:59:24 -0000	1.10
***************
*** 1,12 ****
! #N canvas 0 0 458 308 12;
! #X floatatom 35 70 5 0 0 0 - - -;
! #X msg 91 67 bang;
! #X msg 145 69 1 2 3;
! #X symbolatom 204 72 10 0 0 0 - - -;
! #X msg 209 111 msg one 2 three;
! #X obj 114 183 Counter a b 5;
! #X connect 0 0 5 0;
! #X connect 1 0 5 0;
! #X connect 2 0 5 0;
! #X connect 3 0 5 0;
! #X connect 4 0 5 0;
--- 1,29 ----
! #N canvas 603 10 798 320 12;
! #X floatatom 125 51 5 0 0 0 - - -;
! #X symbolatom 320 81 10 0 0 0 - - -;
! #X msg 536 45 msg one 2 three;
! #X obj 240 276 Counter a b 5;
! #X obj 22 24 loadbang;
! #X floatatom 213 26 5 0 0 0 - - -;
! #X msg 213 52 1 \$1 3;
! #X msg 318 14 symbol abc;
! #X msg 328 42 symbol d3f;
! #X obj 21 54 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
! -1;
! #X msg 535 82 set 1 7 8;
! #X msg 541 167 list;
! #X msg 540 196 list 1;
! #X msg 541 225 list abc;
! #X connect 0 0 3 0;
! #X connect 1 0 3 0;
! #X connect 2 0 3 0;
! #X connect 4 0 9 0;
! #X connect 5 0 6 0;
! #X connect 6 0 3 0;
! #X connect 7 0 1 0;
! #X connect 8 0 1 0;
! #X connect 9 0 3 0;
! #X connect 10 0 3 0;
! #X connect 11 0 3 0;
! #X connect 12 0 3 0;
! #X connect 13 0 3 0;

Index: clr.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/clr/clr.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** clr.cpp	7 Mar 2006 13:18:29 -0000	1.7
--- clr.cpp	8 Mar 2006 01:59:24 -0000	1.8
***************
*** 31,46 ****
  #define DLLEXT "dll"
  
  static MonoDomain *monodomain;
  static MonoClass *clr_symbol,*clr_pointer,*clr_atom,*clr_atomlist,*clr_external;
  static MonoMethodDesc *clr_desc_tostring,*clr_desc_ctor;
! static MonoMethodDesc *clr_desc_bang,*clr_desc_float,*clr_desc_symbol,*clr_desc_pointer,*clr_desc_list,*clr_desc_anything;
! static MonoMethod *ext_method_bang,*ext_method_float,*ext_method_symbol,*ext_method_list,*ext_method_pointer,*ext_method_anything;
  
- typedef std::map<t_symbol *,MonoMethod *> ClrMethodMap;
  
  // this is the class structure
  // holding the pd and mono class
  // and our CLR method pointers
! typedef struct
  {
      t_class *pd_class;
--- 31,79 ----
  #define DLLEXT "dll"
  
+ 
+ // cached mono data
+ 
  static MonoDomain *monodomain;
  static MonoClass *clr_symbol,*clr_pointer,*clr_atom,*clr_atomlist,*clr_external;
  static MonoMethodDesc *clr_desc_tostring,*clr_desc_ctor;
! static MonoMethod *clr_meth_invoke;
! static MonoProperty *clr_prop_method;
! 
! 
! struct AtomList
! {
!     int argc;
!     t_atom *argv;
! 
!     void Set(int c,t_atom *v) { argc = c,argv = v; }
! };
! 
! 
! // temporary workspace items
! 
! static MonoArray *clr_objarr_1,*clr_objarr_2;
! static MonoObject *clr_obj_single,*clr_obj_symbol,*clr_obj_pointer,*clr_obj_atomlist;
! static float *clr_val_single;
! static t_symbol **clr_val_symbol;
! static void **clr_val_pointer;
! static AtomList *clr_val_atomlist;
! 
! 
! 
! struct Delegate
! {
!     operator bool() const { return methodinfo != NULL; }
! 
!     MonoObject *methodinfo;
!     MonoMethod *virtmethod;
! };
! 
! typedef std::map<t_symbol *,Delegate> ClrMethodMap;
  
  
  // this is the class structure
  // holding the pd and mono class
  // and our CLR method pointers
! struct t_clr_class
  {
      t_class *pd_class;
***************
*** 49,54 ****
      MonoMethod *mono_ctor;
      t_symbol *name;
! //    ClrMethodMap *methods;
! } t_clr_class;
  
  typedef std::map<t_symbol *,t_clr_class *> ClrMap;
--- 82,88 ----
      MonoMethod *mono_ctor;
      t_symbol *name;
!     Delegate method_bang,method_float,method_symbol,method_pointer,method_list,method_anything;
!     ClrMethodMap *methods; // explicit method selectors
! };
  
  typedef std::map<t_symbol *,t_clr_class *> ClrMap;
***************
*** 60,69 ****
  
  // this is the class instance object structure
! typedef struct
  {
      t_object pd_obj; // myself
      t_clr_class *clr_clss; // pointer to our class structure
!     MonoObject *mono_obj;
! } t_clr;
  
  
--- 94,103 ----
  
  // this is the class instance object structure
! struct t_clr
  {
      t_object pd_obj; // myself
      t_clr_class *clr_clss; // pointer to our class structure
!     MonoObject *mono_obj;  // the mono class instance
! };
  
  
***************
*** 82,94 ****
  }
  
- 
- 
  static void clr_method_bang(t_clr *x) 
  {
      assert(x && x->clr_clss);
!     MonoMethod *m = mono_object_get_virtual_method(x->mono_obj,ext_method_bang);
!     assert(m);
      MonoObject *exc;
!     mono_runtime_invoke(m,x->mono_obj,NULL,&exc);
      if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
  }
--- 116,129 ----
  }
  
  static void clr_method_bang(t_clr *x) 
  {
      assert(x && x->clr_clss);
! 
!     const Delegate &d = x->clr_clss->method_bang;
!     assert(d);
! 
!     gpointer args[2] = {x->mono_obj,NULL};
      MonoObject *exc;
!     mono_runtime_invoke(d.virtmethod,d.methodinfo,args,&exc);
      if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
  }
***************
*** 97,105 ****
  {
      assert(x && x->clr_clss);
!     MonoMethod *m = mono_object_get_virtual_method(x->mono_obj,ext_method_float);
!     assert(m);
! 	gpointer args = &f;
      MonoObject *exc;
!     mono_runtime_invoke(m,x->mono_obj,&args,&exc);
      if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
  }
--- 132,145 ----
  {
      assert(x && x->clr_clss);
! 
!     const Delegate &d = x->clr_clss->method_float;
!     assert(d);
! 
!     *clr_val_single = f;
!     mono_array_set(clr_objarr_1,void*,0,clr_obj_single);
! 
!     gpointer args[2] = {x->mono_obj,clr_objarr_1};
      MonoObject *exc;
!     mono_runtime_invoke(d.virtmethod,d.methodinfo,args,&exc);
      if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
  }
***************
*** 108,122 ****
  {
      assert(x && x->clr_clss);
!     MonoMethod *m = mono_object_get_virtual_method(x->mono_obj,ext_method_symbol);
!     assert(m);
! #if 0
!     MonoObject *symobj = mono_value_box(monodomain,clr_symbol,&s);
!     MonoObject *o = (MonoObject *)mono_object_unbox(symobj);
! 	gpointer args = o;
! #else
! 	gpointer args = &s;
! #endif
      MonoObject *exc;
!     mono_runtime_invoke(m,x->mono_obj,&args,&exc);
      if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
  }
--- 148,161 ----
  {
      assert(x && x->clr_clss);
! 
!     const Delegate &d = x->clr_clss->method_symbol;
!     assert(d);
! 
!     *clr_val_symbol = s;
!     mono_array_set(clr_objarr_1,void*,0,clr_obj_symbol);
! 
!     gpointer args[2] = {x->mono_obj,clr_objarr_1};
      MonoObject *exc;
!     mono_runtime_invoke(d.virtmethod,d.methodinfo,args,&exc);
      if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
  }
***************
*** 125,207 ****
  {
      assert(x && x->clr_clss);
-     MonoMethod *m = mono_object_get_virtual_method(x->mono_obj,ext_method_pointer);
-     assert(m);
- #if 0
-     MonoObject *ptrobj = mono_value_box(monodomain,clr_pointer,&p);
-     MonoObject *o = (MonoObject *)mono_object_unbox(ptrobj);
- 	gpointer args = o;
- #else
- 	gpointer args = &p;
- #endif
-     MonoObject *exc;
-     mono_runtime_invoke(m,x->mono_obj,&args,&exc);
-     if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
- }
  
! struct AtomList
! {
!     int argc;
!     t_atom *argv;
  
!     AtomList(int c,t_atom *v): argc(c),argv(v) {}
! };
  
! static MonoObject *new_AtomList(int argc,t_atom *argv)
! {
! 	AtomList al(argc,argv);
!     MonoObject *lstobj = mono_value_box(monodomain,clr_atomlist,&al);
!     MonoObject *o = (MonoObject *)mono_object_unbox(lstobj);
!     return o;
  }
  
- static MonoArray *new_Atoms(int argc,t_atom *argv)
- {
-     MonoArray *lstobj = mono_array_new(monodomain,clr_atom,argc);
-     t_atom *lstptr = mono_array_addr(lstobj,t_atom,0);
-     memcpy(lstptr,argv,argc*sizeof(t_atom));
-     return lstobj;
- }
  
  static void clr_method_list(t_clr *x,t_symbol *l, int argc, t_atom *argv)
  {
      assert(x && x->clr_clss);
!     MonoMethod *m = mono_object_get_virtual_method(x->mono_obj,ext_method_list);
!     assert(m);
! #if 1
!     // make PureData.AtomList value type
! //    MonoObject *lstobj = new_AtomList(argc,argv);
! //	gpointer args = lstobj;
! 	AtomList al(argc,argv);
! 	gpointer args = &al;
! #else
!     // make PureData.Atom[] array - copy data
!     MonoArray *lstobj = new_Atoms(argc,argv);
! 	gpointer args = lstobj;
! #endif
      MonoObject *exc;
!     mono_runtime_invoke(m,x->mono_obj,&args,&exc);
      if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
  }
  
! static void clr_method_anything(t_clr *x,t_symbol *sl, int argc, t_atom *argv)
  {
- #if 0
      assert(x && x->clr_clss);
      ClrMethodMap *methods = x->clr_clss->methods;
      if(methods) {
!         ClrMethodMap::iterator it = methods->find(sl);
!         if(it != methods->end()) {
!             // \TODO call m
!             return;
!         }
      }
!     if(x->clr_clss->method_anything) {
!          // \TODO call methodanything
      }
!     else
!         post("CLR - no method for %s found",sl->s_name);
! #else
!     assert(x && x->clr_clss);
! #endif
  }
  
--- 164,234 ----
  {
      assert(x && x->clr_clss);
  
!     const Delegate &d = x->clr_clss->method_pointer;
!     assert(d);
  
!     *clr_val_pointer = p;
!     mono_array_set(clr_objarr_1,void*,0,clr_obj_pointer);
  
!     gpointer args[2] = {x->mono_obj,clr_objarr_1};
!     MonoObject *exc;
!     mono_runtime_invoke(d.virtmethod,d.methodinfo,args,&exc);
!     if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
  }
  
  
  static void clr_method_list(t_clr *x,t_symbol *l, int argc, t_atom *argv)
  {
      assert(x && x->clr_clss);
! 
!     const Delegate &d = x->clr_clss->method_list;
!     assert(d);
! 
!     clr_val_atomlist->Set(argc,argv);
!     mono_array_set(clr_objarr_1,void*,0,clr_obj_atomlist);
! 
!     gpointer args[2] = {x->mono_obj,clr_objarr_1};
      MonoObject *exc;
!     mono_runtime_invoke(d.virtmethod,d.methodinfo,args,&exc);
      if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
  }
  
! static void clr_method_anything(t_clr *x,t_symbol *s,int argc,t_atom *argv)
  {
      assert(x && x->clr_clss);
+ 
+     const Delegate *d = NULL;
      ClrMethodMap *methods = x->clr_clss->methods;
      if(methods) {
!         ClrMethodMap::iterator it = methods->find(s);
!         if(it != methods->end()) d = &it->second;
      }
! 
!     gpointer args[2];
!     args[0] = x->mono_obj;
! 
!     if(d) {
!         // explicit selector
! 
!         clr_val_atomlist->Set(argc,argv);
!         mono_array_set(clr_objarr_1,void*,0,clr_obj_atomlist);
!         args[1] = clr_objarr_1;
      }
!     else {
!         // general method
! 
!         d = &x->clr_clss->method_anything;
!         assert(d);
! 
!         *clr_val_symbol = s;
!         clr_val_atomlist->Set(argc,argv);
!         mono_array_set(clr_objarr_2,void*,0,clr_obj_symbol);
!         mono_array_set(clr_objarr_2,void*,1,clr_obj_atomlist);
!         args[1] = clr_objarr_2;
!     }
! 
!     MonoObject *exc;
!     mono_runtime_invoke(d->virtmethod,d->methodinfo,args,&exc);
!     if(exc) error_exc("Exception raised",x->clr_clss->name->s_name,exc);
  }
  
***************
*** 233,238 ****
  {
      assert(str);
! 	t_symbol *s = gensym(mono_string_to_utf8(str));	
!     return s;
  }
  
--- 260,264 ----
  {
      assert(str);
! 	return gensym(mono_string_to_utf8(str));	
  }
  
***************
*** 245,333 ****
  static void PD_AddBang(MonoObject *method)
  {
!     post("Add bang method");
  }
  
  static void PD_AddFloat(MonoObject *method)
  {
!     post("Add float method");
  }
  
  static void PD_AddSymbol(MonoObject *method)
  {
!     post("Add symbol method");
  }
  
  static void PD_AddPointer(MonoObject *method)
  {
!     post("Add pointer method");
  }
  
  static void PD_AddList(MonoObject *method)
  {
!     post("Add list method");
  }
  
! static void PD_AddAnything(MonoObject *method)
  {
!     post("Add anything method");
  }
  
! #if 0
! // this function is called by mono when it wants post messages to pd
! static void PD_AddMethod(MonoObject *symobj,MonoObject *obj)
  {
      assert(clr_setup_class);
! 
! //    char *tag = mono_string_to_utf8(str);
! //	post("register method %s",tag);
!     t_symbol *sym;
!     mono_field_get_value(symobj,clr_symbol_ptr,&sym);
! 
!     // \TODO convert from obj
!     MonoMethod *m = NULL;
! 
!     if(sym == &s_bang) {
!         if(!clr_setup_class->method_bang)
!     	    class_addbang(clr_setup_class->pd_class,clr_method_bang);
!         clr_setup_class->method_bang = m;
!     }
!     else if(sym == &s_float) {
!         if(!clr_setup_class->method_bang)
!     	    class_addfloat(clr_setup_class->pd_class,clr_method_float);
!         clr_setup_class->method_bang = m;
!     }
!     else if(sym == &s_symbol) {
!         if(!clr_setup_class->method_symbol)
!     	    class_addsymbol(clr_setup_class->pd_class,clr_method_symbol);
!         clr_setup_class->method_symbol = m;
!     }
!     else if(sym == &s_list) {
!         if(!clr_setup_class->method_list)
!     	    class_addlist(clr_setup_class->pd_class,clr_method_list);
!         clr_setup_class->method_list = m;
!     }
!     else if(sym == &s_pointer) {
!         if(!clr_setup_class->method_pointer)
!         	class_addpointer(clr_setup_class->pd_class,clr_method_pointer);
!         clr_setup_class->method_pointer = m;
!     }
!     else if(sym == &s_) {
!         if(!clr_setup_class->method_anything && !clr_setup_class->methods) // only register once!
! 	        class_addanything(clr_setup_class->pd_class,clr_method_anything);
!         clr_setup_class->method_anything = m;
!     }
!     else {
!         if(!clr_setup_class->methods) {
!             // no methods yet
!             clr_setup_class->methods = new ClrMethodMap;
!             if(!clr_setup_class->method_anything) // only register once!
!     	        class_addanything(clr_setup_class->pd_class,clr_method_anything);
!         }
! 
!         // add tag to map
!         (*clr_setup_class->methods)[sym] = m;
!     }
  }
! #endif
  
  void *clr_new(t_symbol *classname, int argc, t_atom *argv)
--- 271,333 ----
  static void PD_AddBang(MonoObject *method)
  {
!     assert(clr_setup_class);
!     Delegate &d = clr_setup_class->method_bang;
!     d.methodinfo = mono_property_get_value(clr_prop_method,method,NULL,NULL);
!     d.virtmethod = mono_object_get_virtual_method(d.methodinfo,clr_meth_invoke);
  }
  
  static void PD_AddFloat(MonoObject *method)
  {
!     assert(clr_setup_class);
!     Delegate &d = clr_setup_class->method_float;
!     d.methodinfo = mono_property_get_value(clr_prop_method,method,NULL,NULL);
!     d.virtmethod = mono_object_get_virtual_method(d.methodinfo,clr_meth_invoke);
  }
  
  static void PD_AddSymbol(MonoObject *method)
  {
!     assert(clr_setup_class);
!     Delegate &d = clr_setup_class->method_symbol;
!     d.methodinfo = mono_property_get_value(clr_prop_method,method,NULL,NULL);
!     d.virtmethod = mono_object_get_virtual_method(d.methodinfo,clr_meth_invoke);
  }
  
  static void PD_AddPointer(MonoObject *method)
  {
!     assert(clr_setup_class);
!     Delegate &d = clr_setup_class->method_pointer;
!     d.methodinfo = mono_property_get_value(clr_prop_method,method,NULL,NULL);
!     d.virtmethod = mono_object_get_virtual_method(d.methodinfo,clr_meth_invoke);
  }
  
  static void PD_AddList(MonoObject *method)
  {
!     assert(clr_setup_class);
!     Delegate &d = clr_setup_class->method_list;
!     d.methodinfo = mono_property_get_value(clr_prop_method,method,NULL,NULL);
!     d.virtmethod = mono_object_get_virtual_method(d.methodinfo,clr_meth_invoke);
  }
  
! static void PD_AddSelector(t_symbol *sym,MonoObject *method)
  {
!     assert(clr_setup_class);
!     Delegate d;
!     d.methodinfo = mono_property_get_value(clr_prop_method,method,NULL,NULL);
!     d.virtmethod = mono_object_get_virtual_method(d.methodinfo,clr_meth_invoke);
! 
!     if(!clr_setup_class->methods)
!         clr_setup_class->methods = new ClrMethodMap;
!     // add tag to map
!     (*clr_setup_class->methods)[sym] = d;
  }
  
! static void PD_AddAnything(MonoObject *method)
  {
      assert(clr_setup_class);
!     Delegate &d = clr_setup_class->method_anything;
!     d.methodinfo = mono_property_get_value(clr_prop_method,method,NULL,NULL);
!     d.virtmethod = mono_object_get_virtual_method(d.methodinfo,clr_meth_invoke);
  }
! 
  
  void *clr_new(t_symbol *classname, int argc, t_atom *argv)
***************
*** 360,370 ****
      // ok, we have an object - look for constructor
  	if(clss->mono_ctor) {
! #if 1
!     	AtomList al(argc,argv);
  	    gpointer args = &al;
! #else
!         MonoObject *lstobj = new_AtomList(argc,argv);
!     	gpointer args = lstobj;
! #endif
          // call constructor
          MonoObject *exc;
--- 360,367 ----
      // ok, we have an object - look for constructor
  	if(clss->mono_ctor) {
!     	AtomList al; 
!         al.Set(argc,argv);
  	    gpointer args = &al;
! 
          // call constructor
          MonoObject *exc;
***************
*** 378,382 ****
      }
      else
!         post("Warning: no constructor for class %s found",classname->s_name);
  
      return x;
--- 375,379 ----
      }
      else
!         verbose(1,"CLR - Warning: no constructor for class %s found",classname->s_name);
  
      return x;
***************
*** 406,409 ****
--- 403,407 ----
  
      clr_class = (t_clr_class *)getbytes(sizeof(t_clr_class));
+     memset(clr_class,0,sizeof(*clr_class));
  
  //    clr_class->methods = NULL;
***************
*** 434,441 ****
      assert(clr_class->mono_obj_field);
  
-     // ok
- 
- 	post("CLR class %s loaded",classname);
- 
      // make new class (with classname)
      classsym = gensym(classname);
--- 432,435 ----
***************
*** 444,448 ****
      // find static Main method
  
!     MonoMethodDesc *clr_desc_main = mono_method_desc_new(":Setup",FALSE);
      assert(clr_desc_main);
  
--- 438,442 ----
      // find static Main method
  
!     MonoMethodDesc *clr_desc_main = mono_method_desc_new("::Setup",FALSE);
      assert(clr_desc_main);
  
***************
*** 465,481 ****
  	    gpointer args = obj;
          MonoObject *exc;
!         MonoObject *ret = mono_runtime_invoke(method,NULL,&args,&exc);
  
          // unset current class
          clr_setup_class = NULL;
  
-         if(ret) {
-             post("CLR - Warning: returned value from %s.Setup ignored",classname);
-             // ??? do we have to mark ret as free?
-         }
- 
          if(exc) {
-             MonoObject *ret = mono_runtime_invoke(method,NULL,&args,&exc);
- 
              error_exc("CLR - Exception raised by Setup",classname,exc);
              goto bailout;
--- 459,468 ----
  	    gpointer args = obj;
          MonoObject *exc;
!         mono_runtime_invoke(method,NULL,&args,&exc);
  
          // unset current class
          clr_setup_class = NULL;
  
          if(exc) {
              error_exc("CLR - Exception raised by Setup",classname,exc);
              goto bailout;
***************
*** 488,525 ****
      clr_class->mono_ctor = mono_method_desc_search_in_class(clr_desc_ctor,clr_class->mono_class);
  
- #if 0
      // find && register methods
!     if((clr_class->method_bang = mono_method_desc_search_in_class(clr_desc_bang,clr_class->mono_class)) != NULL)
!         class_addbang(clr_class->pd_class,clr_method_bang);
!     if((clr_class->method_float = mono_method_desc_search_in_class(clr_desc_float,clr_class->mono_class)) != NULL)
!         class_addfloat(clr_class->pd_class,clr_method_float);
!     if((clr_class->method_symbol = mono_method_desc_search_in_class(clr_desc_symbol,clr_class->mono_class)) != NULL)
!         class_addsymbol(clr_class->pd_class,clr_method_symbol);
!     if((clr_class->method_pointer = mono_method_desc_search_in_class(clr_desc_pointer,clr_class->mono_class)) != NULL)
!         class_addpointer(clr_class->pd_class,clr_method_pointer);
!     if((clr_class->method_list = mono_method_desc_search_in_class(clr_desc_list,clr_class->mono_class)) != NULL)
!         class_addlist(clr_class->pd_class,clr_method_list);
!     if((clr_class->method_anything = mono_method_desc_search_in_class(clr_desc_anything,clr_class->mono_class)) != NULL)
!         class_addanything(clr_class->pd_class,clr_method_anything);
! #else
!     // register methods
!     if(ext_method_bang) 
          class_addbang(clr_class->pd_class,clr_method_bang);
!     if(ext_method_float) 
          class_addfloat(clr_class->pd_class,clr_method_float);
!     if(ext_method_symbol) 
          class_addsymbol(clr_class->pd_class,clr_method_symbol);
!     if(ext_method_pointer) 
          class_addpointer(clr_class->pd_class,clr_method_pointer);
!     if(ext_method_list) 
          class_addlist(clr_class->pd_class,clr_method_list);
!     if(ext_method_anything) 
          class_addanything(clr_class->pd_class,clr_method_anything);
- #endif
  
      // put into map
      clr_map[classsym] = clr_class;
  
! //    post("Loaded class %s OK",classname);
  
      return 1;
--- 475,496 ----
      clr_class->mono_ctor = mono_method_desc_search_in_class(clr_desc_ctor,clr_class->mono_class);
  
      // find && register methods
!     if(clr_class->method_bang)
          class_addbang(clr_class->pd_class,clr_method_bang);
!     if(clr_class->method_float)
          class_addfloat(clr_class->pd_class,clr_method_float);
!     if(clr_class->method_symbol)
          class_addsymbol(clr_class->pd_class,clr_method_symbol);
!     if(clr_class->method_pointer)
          class_addpointer(clr_class->pd_class,clr_method_pointer);
!     if(clr_class->method_list)
          class_addlist(clr_class->pd_class,clr_method_list);
!     if(clr_class->method_anything || clr_class->methods)
          class_addanything(clr_class->pd_class,clr_method_anything);
  
      // put into map
      clr_map[classsym] = clr_class;
  
!     verbose(1,"CLR - Loaded class %s OK",classname);
  
      return 1;
***************
*** 597,600 ****
--- 568,572 ----
          mono_add_internal_call("PureData.External::Add(PureData.External/MethodPointer)", (const void *)PD_AddPointer);
          mono_add_internal_call("PureData.External::Add(PureData.External/MethodList)", (const void *)PD_AddList);
+         mono_add_internal_call("PureData.External::Add(PureData.Symbol,PureData.External/MethodList)", (const void *)PD_AddSelector);
          mono_add_internal_call("PureData.External::Add(PureData.External/MethodAnything)", (const void *)PD_AddAnything);
  
***************
*** 616,639 ****
          assert(clr_desc_ctor);
  
!         clr_desc_bang = mono_method_desc_new("::MethodBang()",FALSE);
!         assert(clr_desc_bang);
!         clr_desc_float = mono_method_desc_new("::MethodFloat(single)",FALSE);
!         assert(clr_desc_float);
!         clr_desc_symbol = mono_method_desc_new("::MethodSymbol(Symbol)",FALSE);
!         assert(clr_desc_symbol);
!         clr_desc_pointer = mono_method_desc_new("::MethodPointer(Pointer)",FALSE);
!         assert(clr_desc_pointer);
!         clr_desc_list = mono_method_desc_new("::MethodList(AtomList)",FALSE);
!         assert(clr_desc_list);
!         clr_desc_anything = mono_method_desc_new("::MethodAnything(Symbol,AtomList)",FALSE);
!         assert(clr_desc_anything);
  
!         // find abstract methods
!         ext_method_bang = mono_method_desc_search_in_class(clr_desc_bang,clr_external);
!         ext_method_float = mono_method_desc_search_in_class(clr_desc_float,clr_external);
!         ext_method_symbol = mono_method_desc_search_in_class(clr_desc_symbol,clr_external);
!         ext_method_pointer = mono_method_desc_search_in_class(clr_desc_pointer,clr_external);
!         ext_method_list = mono_method_desc_search_in_class(clr_desc_list,clr_external);
!         ext_method_anything = mono_method_desc_search_in_class(clr_desc_anything,clr_external);
  
          // install loader hook
--- 588,611 ----
          assert(clr_desc_ctor);
  
!         MonoMethodDesc *desc = mono_method_desc_new("System.Reflection.MethodBase:Invoke(object,object[])",FALSE);
!         clr_meth_invoke = mono_method_desc_search_in_image(desc,mono_get_corlib());
  
!         MonoClass *delegate = mono_class_from_name(mono_get_corlib(),"System","Delegate");
!         assert(delegate);
!         clr_prop_method = mono_class_get_property_from_name(delegate,"Method");
!         assert(clr_prop_method);
! 
!         // static objects to avoid allocation at method call time
!         clr_objarr_1 = mono_array_new(monodomain,mono_get_object_class(),1);
!         clr_objarr_2 = mono_array_new(monodomain,mono_get_object_class(),2);
!         clr_obj_single = mono_object_new(monodomain,mono_get_single_class());
!         clr_obj_symbol = mono_object_new(monodomain,clr_symbol);
!         clr_obj_pointer = mono_object_new(monodomain,clr_pointer);
!         clr_obj_atomlist = mono_object_new(monodomain,clr_atomlist);
!         // unboxed addresses
!         clr_val_single = (float *)mono_object_unbox(clr_obj_single);
!         clr_val_symbol = (t_symbol **)mono_object_unbox(clr_obj_symbol);
!         clr_val_pointer = (void **)mono_object_unbox(clr_obj_pointer);
!         clr_val_atomlist = (AtomList *)mono_object_unbox(clr_obj_atomlist);
  
          // install loader hook





More information about the Pd-cvs mailing list