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