[Mono-dev] gmcs and The Future

Marek Safar marek.safar at seznam.cz
Thu Feb 5 04:41:22 EST 2009


Hi,

Thank you for tracking this down. Could you fill a bug report at 
http://www.mono-project.com/Bugs so we can address the issue.

Marek
> I try to use these voodoo keywords and have a small report:
>
> 1) gmcs currently supports only __arglist keyword, but sometimes 
> generates incorrect CIL. That code works while compiling with csc.exe, 
> but leads to segmentation fault after gmsc (I try it on Mac OS 10.5, 
> Mono 2.2 ):
> ================== CODE ===========================
>  private static void TestArglistMethod()
> {
>   ArglistMethod( __arglist( 1, 2, 3 ) );
> }
>  
> private static void ArglistMethod(__arglist )
> {
>   var iter = new ArgIterator( __arglist );
>  
>   for( var n = iter.GetRemainingCount(); n > 0; n-- )
>   Console.WriteLine( TypedReference.ToObject( iter.GetNextArg() ) );
> }
> ===================================================
> 2) Mono VES currently supports mkrefany, refanyval, refanytype, 
> arglist instructions for non-P/Invoke scenario.
>
> 3) Mono JIT & P/Invoke layer don't like __arglist parameters and 
> reports something like this: Invalid IL code in 
> NObjective.Program:Main (string[]): IL_0021: ret
> ================== CODE ===========================
> [DllImport( "libc.dylib" )]
> public extern static void printf( string format, __arglist );
>
> ...
>  
> printf( "ytu", __arglist( "44" ) );
> ===================================================
> If compiler will be able generate correct CIL it will be useful for 
> debugging future P/Invoke layer that will able to work with __arglist
> NObjective contains about of 43000 generated methods (generated from 
> Objective-C method signatures) accessible by user that looks like:
>
> ================== CODE ===========================
> unsafe public static bool writeToURL_atomically_( this NSData ___this, 
> NSURL url, bool atomically ) {
>   RuntimeObject ___occuredException;
>   var ___result = NativeMethods.writeToURL_atomically_( ___this, 
> CachedSelectors.writeToURL_atomically_, out ___occuredException, 
> sizeof( NSURL ) + sizeof( bool ), url, atomically );
>   if( ___occuredException != RuntimeObject.Null ) throw 
> RuntimeException.Create( ___occuredException );  
>   return ___result;
> }
>
> unsafe public static bool writeToURL_options_error_( this NSData 
> ___this, NSURL url, uint options, ref NSError error ) {
>   RuntimeObject ___occuredException;
>   var ___result = NativeMethods.writeToURL_options_error_( ___this, 
> CachedSelectors.writeToURL_options_error_, out ___occuredException, 
> sizeof( NSURL ) + sizeof( uint ) + sizeof( IntPtr ), url, options, ref 
> error );
>   if( ___occuredException != RuntimeObject.Null ) throw 
> RuntimeException.Create( ___occuredException ); 
>   return ___result;
> }
> ===================================================
> Each generated method have a generated P/Invoke counterpart with same 
> entry point and nearly same signature (another 43000 methods!):
> ================== CODE ===========================
> [DllImport(Runtime.InteropLibrary, EntryPoint = "objc_msgSend_eh2")]
> public static extern bool writeToURL_atomically_( RuntimeObject 
> ___object, Selector ___selector, out RuntimeObject 
> ___occuredException, int ___stackSize, NSURL url, bool atomically );
>
> [DllImport(Runtime.InteropLibrary, EntryPoint = "objc_msgSend_eh2")]
> public static extern bool writeToURL_options_error_( RuntimeObject 
> ___object, Selector ___selector, out RuntimeObject 
> ___occuredException, int ___stackSize, NSURL url, uint options, ref 
> NSError error );
> ===================================================
>
> With proper __arglist support in VES/gmcs unnecessary P/Invokes can be 
> easily removed ( -43000 methods = assembly will hold much less 
> metadata ) and calls redirected to SINGLE __arglist method:
>  
> ================== CODE ===========================
> unsafe public static bool writeToURL_atomically_( this NSData ___this, 
> NSURL url, bool atomically ) {
>   RuntimeObject ___occuredException;
>   var ___result = NativeMethods.FutureArglistMethod( ___this, 
> CachedSelectors.writeToURL_atomically_, out ___occuredException, 
> sizeof( NSURL ) + sizeof( bool ), __arglist( url, atomically ) );
>   if( ___occuredException != RuntimeObject.Null ) throw 
> RuntimeException.Create( ___occuredException );  
>   return ___result;
> }
>
> unsafe public static bool writeToURL_options_error_( this NSData 
> ___this, NSURL url, uint options, ref NSError error ) {
>   RuntimeObject ___occuredException;
>   var ___result = NativeMethods.FutureArglistMethod( ___this, 
> CachedSelectors.writeToURL_options_error_, out ___occuredException, 
> sizeof( NSURL ) + sizeof( uint ) + sizeof( IntPtr ), __arglist( url, 
> options, ref error ) );
>   if( ___occuredException != RuntimeObject.Null ) throw 
> RuntimeException.Create( ___occuredException ); 
>   return ___result;
> }
>
> ...
>  
>
> [DllImport(Runtime.InteropLibrary, EntryPoint = "objc_msgSend_eh2")]
> public static extern bool FutureArglistMethod( RuntimeObject 
> ___object, Selector ___selector, out RuntimeObject 
> ___occuredException, int ___stackSize, __arglist );
> ===================================================
>
> WBR,
> Eugeny Grishul
>
>
> 2009/2/5 Miguel de Icaza <miguel at novell.com <mailto:miguel at novell.com>>
>
>     Hello,
>
>     > > gmcs Compiler already not 100% compatible with csc - __arglist
>     > > <http://bartdesmet.net/blogs/bart/archive/2006/09/28/4473.aspx>,
>     > > __refvalue
>     > > <http://bartdesmet.net/blogs/bart/archive/2006/09/28/4473.aspx>,
>     > > __makeref
>     > >
>     <http://bartdesmet.net/blogs/bart/archive/2006/09/28/4473.aspx> not
>     > > supported ( it can significatly reduce P/Invokes in bridging
>     code of
>     > > NObjective <http://code.google.com/p/nobjective/>)
>     > >
>     > __arglist is fully supported.
>     >
>     > We have not implemented __reftype/__makeref mainly because
>     nobody raised
>     > any interested in these undocumented keyword. If you missing this
>     > support please fill a bug report.
>
>     I agree.   Until today I did not even know those existed.
>
>     What is their use case and how do you use these in NObjective?  I
>     would
>     like to know more about this.
>
>     As Marek said, please file a bug report, that will help us track this
>     task.
>
>     miguel
>
>
>
>
> -- 
> WBR,
> Eugeny Grishul
> ------------------------------------------------------------------------
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list



More information about the Mono-devel-list mailing list