@@ -199,29 +199,43 @@ init_icall_table (void)
199199static  void * 
200200get_native_to_interp  (MonoMethod  * method , void  * extra_arg )
201201{
202- 	void  * addr ;
203- 
202+ 	void  * addr  =  NULL ;
204203	MONO_ENTER_GC_UNSAFE ;
205204	MonoClass  * klass  =  mono_method_get_class  (method );
206205	MonoImage  * image  =  mono_class_get_image  (klass );
207206	MonoAssembly  * assembly  =  mono_image_get_assembly  (image );
208207	MonoAssemblyName  * aname  =  mono_assembly_get_name  (assembly );
209208	const  char  * name  =  mono_assembly_name_get_name  (aname );
209+ 	const  char  * namespace  =  mono_class_get_namespace  (klass );
210210	const  char  * class_name  =  mono_class_get_name  (klass );
211211	const  char  * method_name  =  mono_method_get_name  (method );
212- 	char  key  [128 ];
212+ 	MonoMethodSignature  * sig  =  mono_method_signature  (method );
213+ 	uint32_t  param_count  =  mono_signature_get_param_count  (sig );
214+ 	uint32_t  token  =  mono_method_get_token  (method );
215+ 
216+ 	char  buf  [128 ];
217+ 	char  * key  =  buf ;
213218	int  len ;
219+ 	if  (name  !=  NULL ) {
220+ 		// the key must match the one used in PInvokeTableGenerator 
221+ 		len  =  snprintf  (key , sizeof (buf ), "%s#%d:%s:%s:%s" , method_name , param_count , name , namespace , class_name );
222+ 
223+ 		if  (len  >= sizeof  (buf )) {
224+ 			// The key is too long, try again with a larger buffer 
225+ 			key  =  g_new  (char , len  +  1 );
226+ 			snprintf  (key , len  +  1 , "%s#%d:%s:%s:%s" , method_name , param_count , name , namespace , class_name );
227+ 		}
214228
215- 	assert  ( strlen  ( name )  <   100 );
216- 	 snprintf  ( key ,  sizeof ( key ),  "%s_%s_%s" ,  name ,  class_name ,  method_name ); 
217- 	char   * fixedName   =   mono_fixup_symbol_name  ( "" ,  key ,  "" ); 
218- 	addr   =   wasm_dl_get_native_to_interp  ( fixedName ,  extra_arg );
219- 	free  ( fixedName ); 
229+ 		 addr   =   wasm_dl_get_native_to_interp  ( token ,  key ,  extra_arg );
230+ 
231+ 		 if  ( key   !=   buf ) 
232+ 			 free  ( key );
233+ 	} 
220234	MONO_EXIT_GC_UNSAFE ;
221235	return  addr ;
222236}
223237
224- static  void  * sysglobal_native_handle ;
238+ static  void  * sysglobal_native_handle   =  ( void   * ) 0xDeadBeef ;
225239
226240static  void * 
227241wasm_dl_load  (const  char  * name , int  flags , char  * * err , void  * user_data )
@@ -248,24 +262,33 @@ wasm_dl_load (const char *name, int flags, char **err, void *user_data)
248262	return  NULL ;
249263}
250264
265+ int 
266+ import_compare_name  (const  void  * k1 , const  void  * k2 )
267+ {
268+ 	const  PinvokeImport  * e1  =  (const  PinvokeImport * )k1 ;
269+ 	const  PinvokeImport  * e2  =  (const  PinvokeImport * )k2 ;
270+ 
271+ 	return  strcmp  (e1 -> name , e2 -> name );
272+ }
273+ 
251274static  void * 
252275wasm_dl_symbol  (void  * handle , const  char  * name , char  * * err , void  * user_data )
253276{
254- 	if  (handle  ==  sysglobal_native_handle )
255- 		assert  (0 );
277+ 	assert  (handle  !=  sysglobal_native_handle );
256278
257279#if  WASM_SUPPORTS_DLOPEN 
258280	if  (!wasm_dl_is_pinvoke_tables  (handle )) {
259281		return  dlsym  (handle , name );
260282	}
261283#endif 
262- 
263- 	PinvokeImport  * table  =  (PinvokeImport * )handle ;
264- 	for  (int  i  =  0 ; table  [i ].name ; ++ i ) {
265- 		if  (!strcmp  (table  [i ].name , name ))
266- 			return  table  [i ].func ;
267- 	}
268- 	return  NULL ;
284+ 	PinvokeTable *  index  =  (PinvokeTable * )handle ;
285+ 	PinvokeImport  key  =  { name , NULL  };
286+     PinvokeImport *  result  =  (PinvokeImport  * )bsearch (& key , index -> imports , index -> count , sizeof (PinvokeImport ), import_compare_name );
287+     if  (!result ) {
288+         // *err = g_strdup_printf ("Symbol not found: %s", name); 
289+         return  NULL ;
290+     }
291+     return  result -> func ;
269292}
270293
271294MonoDomain  * 
@@ -363,24 +386,50 @@ mono_wasm_assembly_find_method (MonoClass *klass, const char *name, int argument
363386	return  result ;
364387}
365388
389+ MonoMethod * 
390+ mono_wasm_get_method_matching  (MonoImage  * image , uint32_t  token , MonoClass  * klass , const  char *  name , int  param_count )
391+ {
392+ 	MonoMethod  * result  =  NULL ;
393+ 	MONO_ENTER_GC_UNSAFE ;
394+ 	MonoMethod  * method  =  mono_get_method  (image , token , klass );
395+ 	MonoMethodSignature  * sig  =  mono_method_signature  (method );
396+ 	// Lookp by token but verify the name and param count in case assembly was trimmed 
397+ 	if  (mono_signature_get_param_count  (sig ) ==  param_count ) {
398+ 		const  char  * method_name  =  mono_method_get_name  (method );
399+ 		if  (!strcmp  (method_name , name )) {
400+ 			result  =  method ;
401+ 		}
402+ 	}
403+ 	// If the token lookup failed, try to find the method by name and param count 
404+ 	if  (!result ) {
405+ 		result  =  mono_class_get_method_from_name  (klass , name , param_count );
406+ 	}
407+ 	MONO_EXIT_GC_UNSAFE ;
408+ 	return  result ;
409+ }
410+ 
366411/* 
367412 * mono_wasm_marshal_get_managed_wrapper: 
368413 * Creates a wrapper for a function pointer to a method marked with 
369414 * UnamangedCallersOnlyAttribute. 
370415 * This wrapper ensures that the interpreter initializes the pointers. 
371416 */ 
372417void 
373- mono_wasm_marshal_get_managed_wrapper  (const  char *  assemblyName , const  char *  namespaceName , const  char *  typeName , const  char *  methodName , int  num_params )
418+ mono_wasm_marshal_get_managed_wrapper  (const  char *  assemblyName , const  char *  namespaceName , const  char *  typeName , const  char *  methodName , uint32_t   token ,  int  param_count )
374419{
375420	MonoError  error ;
376421	mono_error_init  (& error );
422+ 	MONO_ENTER_GC_UNSAFE ;
377423	MonoAssembly *  assembly  =  mono_wasm_assembly_load  (assemblyName );
378424	assert  (assembly );
379- 	MonoClass *  class  =  mono_wasm_assembly_find_class  (assembly , namespaceName , typeName );
380- 	assert  (class );
381- 	MonoMethod *  method  =  mono_wasm_assembly_find_method  (class , methodName , num_params );
425+ 	MonoImage  * image  =  mono_assembly_get_image  (assembly );
426+ 	assert  (image );
427+ 	MonoClass *  klass  =  mono_class_from_name  (image , namespaceName , typeName );
428+ 	assert  (klass );
429+ 	MonoMethod  * method  =  mono_wasm_get_method_matching  (image , token , klass , methodName , param_count );
382430	assert  (method );
383431	MonoMethod  * managedWrapper  =  mono_marshal_get_managed_wrapper  (method , NULL , 0 , & error );
384432	assert  (managedWrapper );
385433	mono_compile_method  (managedWrapper );
386- }
434+ 	MONO_EXIT_GC_UNSAFE ;
435+ }
0 commit comments