Update of /cvsroot/pure-data/externals/clr In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15459
Modified Files: clr.c Log Message: added arguments at initialization time
Index: clr.c =================================================================== RCS file: /cvsroot/pure-data/externals/clr/clr.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** clr.c 16 Jan 2006 11:30:26 -0000 1.7 --- clr.c 16 Jan 2006 12:44:44 -0000 1.8 *************** *** 107,111 ****
// load the variables and init mono ! static void mono_load(t_clr *x) { // const char *file="D:\Davide\cygwin\home\Davide\externalTest1.dll"; --- 107,111 ----
// load the variables and init mono ! static void mono_load(t_clr *x, int argc, t_atom *argv) { // const char *file="D:\Davide\cygwin\home\Davide\externalTest1.dll"; *************** *** 113,121 **** MonoMethod *m = NULL, *ctor = NULL, *fail = NULL, *mvalues; gpointer iter; ! gpointer args [1]; int val; ! int i; !
if (x->loaded == 0) --- 113,124 ---- MonoMethod *m = NULL, *ctor = NULL, *fail = NULL, *mvalues; + MonoClassField *classPointer; gpointer iter; ! gpointer *args; int val; ! int i,j; ! int params; ! t_symbol *strsymbol; ! atom_simple *listparams;
if (x->loaded == 0) *************** *** 168,172 **** } x->obj = mono_object_new (x->domain, x->klass); ! mono_runtime_object_init (x->obj);
/* retrieve all the methods we need */ --- 171,181 ---- } x->obj = mono_object_new (x->domain, x->klass); ! ! //mono_runtime_object_init (x->obj); ! ! if (argc>2) ! params = argc - 2; ! else ! params = 0;
/* retrieve all the methods we need */ *************** *** 186,203 **** */ MonoMethodSignature * sig = mono_method_signature (m); ! if (mono_signature_get_param_count (sig) == 2) { ctor = m; } } } ! // call the base functions if (x->setUp) { ! val = x; ! args [0] = &val; ! mono_runtime_invoke (x->setUp, x->obj, args, NULL); post("SetUp() invoked"); - } else { --- 195,220 ---- */ MonoMethodSignature * sig = mono_method_signature (m); ! if (mono_signature_get_param_count (sig) == params) { ctor = m; } } } ! // set the pointer ! classPointer = 0; ! classPointer = mono_class_get_field_from_name (x->klass, "x"); ! if (classPointer) ! { ! mono_field_set_value (x->obj, classPointer, &x); ! ! } else ! { ! error("could not find the x field in %s, it is needed!", x->assemblyname->s_name); ! return; ! } // call the base functions if (x->setUp) { ! mono_runtime_invoke (x->setUp, x->obj, NULL, NULL); post("SetUp() invoked"); } else { *************** *** 205,208 **** --- 222,255 ---- return; } + // now call the class constructor + if (ctor) + { + args = malloc(sizeof(gpointer)*params); + listparams = malloc(sizeof(atom_simple)*params); + for (j=2; j<argc; j++) + { + switch ((argv+j)->a_type) + { + case A_FLOAT: + listparams[j-2].a_type = A_S_FLOAT; + listparams[j-2].float_value = (double) atom_getfloat(argv+j); + args[j-2] = &(listparams[j-2].float_value); + break; + case A_SYMBOL: + listparams[j-2].a_type = A_S_SYMBOL; + strsymbol = atom_getsymbol(argv+j); + listparams[j-2].string_value = mono_string_new (x->domain, strsymbol->s_name); + args[j-2] = listparams[j-2].string_value; + break; + } + } + mono_runtime_invoke (ctor, x->obj, args, NULL); + free(listparams); + free(args); + } else + { + error("%s doesn't have a constructor with %i parameters!",x->assemblyname->s_name, params); + } + // all done without errors x->loaded = 1; *************** *** 670,674 ****
// load mono, init the needed vars ! mono_load(x);
return (x); --- 717,721 ----
// load mono, init the needed vars ! mono_load(x, argc, argv);
return (x);