We're basically doing the same thing that the array.py is doing - the 
difference truly is just the item size.  Python is implicitly doing the check 
by calling range(n) and doing the size check on each read.  We're reading 
everything in at once and doing the same basic size check just doing it before 
intsead of at each read.  They should both be equivalent though.

Is there an issue w/ switching to using the I type for the array instead of the 
L type?  If that seems too cumbersome we could consider changing the default 
size of L to match CPython (I suspect this means 4 bytes on a 32-bit platform 
and 8 bytes on 64-bit but I don't have a 64-bit install of CPython).



________________________________________
From: [EMAIL PROTECTED] [EMAIL PROTECTED] On Behalf Of JoeSox [EMAIL PROTECTED]
Sent: Thursday, February 22, 2007 5:25 PM
To: Discussion of IronPython
Subject: Re: [IronPython] array.fromfile

Ok, I found out that the length value of 260759 appears to be pulled
from a file that holds that value.  So it is the same nomatter what
the environment is.

Now, here is the logic that my array.py file was using:
self.itemsize = self._descriptor[1] """I think _descriptor[1] =
typecode L, which in this case would be 4 bytes

    def fromfile(self, f, n):
        """Read n objects from the file object f and append them to the end of
        the array. Also called as read."""
        if not isinstance(f, file):
            raise TypeError("arg1 must be open file")
        for i in range(n):
            item = f.read(self.itemsize)
            if len(item) < self.itemsize:
                raise EOFError("not enough items in file")
            self.fromstring(item)

The full array.py may be found at
http://codespeak.net/svn/pypy/dist/pypy/module/array/app_array.py
--------------------------------
IronPython's:
            [PythonName("fromfile")]
            public void FromFile(PythonFile f, int n) {
                int bytesNeeded = n * ItemSize;
                string bytes = f.Read(bytesNeeded);
                if (bytes.Length < bytesNeeded) throw
Ops.EofError("file not large enough");

                FromString(bytes);
            }
----

I maybe incorrect but it seems that the 4 vs 8 bytes is an issue for
me. Using 1.1B, I can not use my array.py because it uses IP's first
when 'import array' is called.
Sorry, I can't think of a suggested fix right now as I have ran out of
time to look at this more today.  I am sort of confused why IP uses n
* ItemSize.

Thanks, Joe

On 2/22/07, Dino Viehland <[EMAIL PROTECTED]> wrote:
> Depending on how similar your array.py was to CPython's built-in array the 
> problem here may be that our long data type is 8 bytes instead of 4 like on 
> CPython.  The documentation defines the "minimum" size and we use the native 
> sizes for the similar .NET types.
>
> Try switching to using 'I' for the type instead.  You could also check the 
> itemsize on array.py's array and see if that's the case or not.
>
_______________________________________________
users mailing list
users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
_______________________________________________
users mailing list
users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to