[Mono-dev] Big Arrays, Many Changes --- Request for Advice

Luis F. Ortiz LuisOrtiz at Verizon.Net
Mon Sep 3 14:48:22 EDT 2007


Folks:

I was porting a small test application that was written in C# that  
allocated
an array with a large number of elements (> 2^32).  While it   
compiled and ran
in Visual Studio's C# under WindowsXP-64bit without a hitch, when I  
compiled
and ran it under mcs/mono (1.2.4) on the same hardware, but booted up  
under
Fedora7-x86_64, I ran into a few problems.

Digging into it a bit, I discovered that:

1)  MCS assumed that the arguments to NEWARR were always U4 or I4,  
which does not seem
     to be the case as far as ECMA-335v4.
2)  MONO assumes that array lengths and bounds can always be  
represented as guint32's,
     [ like mono_array_new_specific (MonoVTable *vtable, guint32 n) ]


Would folks object to a series of patches to:

A)  Fix mcs/expression.cs to emit OpCodes.Conv_Ovf_U/I instead of  
OpCodes.Conv_Ovf_U4/I4
     for array size arguments,
B)  Modify mono/metadata/object.h to change the base type for array  
lengths/bounds to
     XXX instead of guint32,
C)  Change mono/metadata/object.c to change the functions that create/ 
access arrays to
     take XXX instead of guint32 length/bounds arguments.  Also  
perhaps update some of
     the lower level object allocation functions to use XXX as needed.
D)  Modify the execution of NEWARR be able to deal with I/U native  
types.  No doubt something
     in the JIT needs tweaking as well.
E)  Double check that array indexing not only takes native int types,  
but uses them right.
F)  Add a few new test cases for large array allocation.
G)  Whatever else needs to be done that I'll bump into after I try  
making the above changes
     and realize what I forgot.  Warnings of known hazards gratefully  
accepted.

My big question is what the right type for the size ought to be?   
I've seen int, size_t, gsize,
and guint32 used in Mono.  I suspect that int and guint32 are wrong  
from a portability perspective,
but would prefer that someone more intimately involved with Mono to  
say if guint or gsize or size_t
were preferred. I'm guessing Bug 81774 is related to this as well.

BTW, is this too big for a newby to tackle?

--Luis F. Ortiz
Follower of the "Selfish Way"



More information about the Mono-devel-list mailing list