[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