fixST bug in win32.

Sigbjorn Finne sof@galois.com
Wed, 12 Dec 2001 23:38:00 -0800


Hi,

thanks for a very fine bug report. The bug has now been fixed & the
upcoming release should have it included.

--sigbjorn

----- Original Message -----
From: "Ulf Norell" <d98ulf@dtek.chalmers.se>
To: <hugs-bugs@haskell.org>
Sent: Monday, December 03, 2001 03:48
Subject: fixST bug in win32.


>
> Hi.
>
> Short story
> -----------
>
> fixST does not work in Win32 implementation.
>
> Hugs version
> ------------
>
> I installed hugs from the Windows Installer package found at
>
> http://www.cse.ogi.edu/PacSoft/projects/Hugs/downloads/hugs98-Feb2001.msi
>
> The same problem seems to be present also in the February 2000 release.
>
> Specs
> -----
>
> I am running Windows 2000 Professional (Service Pack 2) on an Athlon
> Thunderbird machine.
>
> Details
> -------
>
> When using (strict) ST i get the following:
>
> ST> runST (fixST (\_ -> return 1))
> Show_default_show (Make.Show (Show_default_show (Make.Show ({Interrupted!}
>
> ST> $$
> ()
> ST> $$
>
> Program error: {_Gc Black Hole}
>
> ST> $$
> ()
> ST> $$
> ()
> ST> $$
> 1
> ST> $$
>
> Unexpected signal
>
> C:\Source\Haskell>
>
> It is also possible to get a control stack overflow. Another fascinating
> example is the following:
>
> funny = do ones <- fixST (\xs -> return (1:xs))
>            return (take 10 ones)
>
> Main> runST funny
>
> Program error: Prelude.take: negative argument
>
> Main>
>
> After doing this a few times you get an Unexpected signal.
>
> The LazyST module is a little more well-behaved (?). Instead of the
> unexpected signal you get control stack overflow in the first example,
> and the second example always gives the program error.
>
> If you define the above examples as functions (non-updatable)
>
> test1 _ = fixST (\_ -> return 1)
> funny _ = do xs <- fixST (\xs -> return (1:xs))
>              return (take 10 xs)
>
> Main> runST (test1 ())
> 1
> Main> runST (funny ())
>
> Program error: Prelude.take: negative argument
>
> The first example works while the second still gives an error. Now (of
> course) you get the same result every time.
>
> If you redefine funny using ($) in the fixST application it works a little
> better:
>
> funny' _ = do xs <- fixST $ \xs -> return (1:xs)
>               return (take 10 xs)
>
> Main> runST (funny' ())
> [1
> Program error: Prelude.take: negative argument
>
> Best Regards
> Ulf Norell
>
>  /----------------\ /-----------------------\
> ( Ulf Norell       | 031-18 68 74            )
> ( Uppstigen 108-21 | 073-676 40 54           )
> ( 412 80 Göteborg  | d98ulf@dtek.chalmers.se )
>  \----------------/ \-----------------------/
>
>
> _______________________________________________
> Hugs-Bugs mailing list
> Hugs-Bugs@haskell.org
> http://www.haskell.org/mailman/listinfo/hugs-bugs