Hi all,

I recently tried to create a ffi-binding to gmp in ghc, and
failed miserably. After a few days of debugging, simplifying the
code and tearing my hear out, I'm slightly completely stumped,
and crying for help ;)

In short: calling gmp-functions from GHCI *with a prompt between*
them seems to do Really Bad Things. (read: memory corruption)


The long story:
---------------

mpz_t p;

str_test()
{
        gmp_printf("%Zd\n", p);
}

void mpz_new()
{
        mpz_init_set_si(p, 1);
}

foreign import ccall mpz_new    :: IO ()
foreign import ccall str_test   :: IO ()


Prelude Main> mpz_new
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
1
Prelude Main> str_test
142833060
Prelude Main> str_test
142833060


Using other flags, importing extra modules, using CVS 6.3 (a few
weeks old) or not compiling it before loading it in GHCI slightly
changes the symptoms (other wrong numbers or make it happen
later/earlier) but copypasting the code from main some 10 to 20
times seems to be a sure way to reproduce it.

Simply running main doesn't seem to expose the problem.
Now of course, GHCI uses Integer-ops during it's REPL, which I
suspect is exactly what causes/exposes the problem.

Am I doing (Un)Officially Forbidden Things? Is it time for a
bug-report? Do I finally have to learn drinking coffee? ;)
I'd be delighted to know.

The full code is attached.

TIA,
Remi

-- 
Nobody can be exactly like me. Even I have trouble doing it.
.PHONY: clean ghci

CC=gcc
CFLAGS=-Wall -g
GHCFLAGS=util.o -\#include util.h

main_src=PrimMpz.hs

ghci: util.o
        ghci $(GHCFLAGS) $(main_src)

exe: util.o
        ghc --make $(GHCFLAGS) $(main_src)

util.o: util.c
        $(CC) $(CFLAGS) -c $<

clean:
        rm -f a.out *.o *.hi
{-# OPTIONS -fffi #-}
module Main where

foreign import ccall mpz_new    :: IO ()
foreign import ccall str_test   :: IO ()

main= do
    mpz_new
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
    str_test
#include <stdio.h>

#include "util.h"

mpz_t p;

void str_test()
{
        gmp_printf("%Zd\n", p);
}

void mpz_new()
{
        mpz_init_set_si(p, 1);
}
#ifndef _UTIL_H
#define _UTIL_H

#include <gmp.h>

void str_test();
void mpz_new();

#endif /* _UTIL_H */
_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to