[clean-list] Is freadi broken in 64-bit Clean?

Maks Verver maksverver at geocities.com
Sun Sep 6 15:13:52 MEST 2009


Hi everyone,

I'm trying to do some simple I/O with Clean and I've run into some very 
strange behaviour which I think is a bug in the 64-bit edition of Clean.

Consider this program (Test.icl):

   module Test

   import StdEnv

   doCase :: *File Int -> *File
   doCase fp c
   # (ok, n, fp) = freadi fp
   = fwrites ("Case #" +++ toString c +++ ": "
               +++ toString n +++ " (" +++ toString ok +++ ")\n") fp

   Start world
   # (fp, world) = stdio world
   = fclose (do (freadi fp)) world
   where
       do (False, _, fp) = fp
       do (True,  n, fp) = foldl doCase fp [1..n]

And the following data file (test.in):

   3
   123
   456
   789

When I try to compile and run this, the result is as follows:

   $ clm Test
   Compiling Test
   Warning [StdFile.abc,11,stdio;33]: no inline code for this rule
   Warning [StdFile.abc,11,fclose;30]: no inline code for this rule
   Generating code for Test
   Linking Test

   $ ./a.out < test.in
   Case #1: 140733193388155 (True)
   Case #2: 456 (True)
   Case #3: 789 (True)
   (True,65536)
   Execution: 0.00  Garbage collection: 0.00  Total: 0.00

Of course this is very strange: I expected Case #1 to print 123. As you 
can see, reading does succeed, and the following values are read 
correctly. Now, 140733193388155 is 0x7fff0000007b and 0x7b is indeed 
123, so it appears that freadi actually only reads a 32-bit integer and 
leaves garbage in the upper 32 bits of the resulting integer.

Is this a known problem? Any suggestions on how to fix this or work 
around it?

Kind regards,
Maks Verver.


More information about the clean-list mailing list