Version française
Home     About     Download     Resources     Contact us    
Browse thread
Caml interface with C on x86_64
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Xavier Leroy <Xavier.Leroy@i...>
Subject: Re: [Caml-list] Allocating caml lists from C : possible bug on amd64
> I have already tried to be GC-friendly, and use the "standard" way to do
> things. For example the following function also works using a 32-bit
> chroot, but also fails with the 64-bit compiler. The question is : why
> does it fail with the 64-bit compiler?

Because your C code is wrong.  gcc -Wall is your friend.

> #include <stdio.h>
> #include <caml/mlvalues.h>
> #include <caml/memory.h>
> #include <caml/bigarray.h>
>
> test_liste (value str) {

Should be "value test_list(value str)".

>    // test function to return a list to caml
> //   value cons;
> //   cons = caml_alloc_small (2,0);
> //   caml_modify(&Field(cons,0),Val_int(0));
> //   caml_modify(&Field(cons,1),Val_int(0));
>
>    CAMLparam1(str);
>    CAMLlocal1(cons);
>    cons = caml_alloc (2,0);

You haven't declared caml_alloc (include <caml/alloc.h>), so the C
compiler assumes it returns an int instead of a value, and generates
wrong code.

>    Store_field(cons,0, Val_int(1));
>    Store_field(cons,1, Val_int(0));
>
>    printf("This is test_liste.\n");
>    printf(String_val(str));

Should be:  printf("%s", String_val(str));

(Hint: what happens if str contains "%s" ?)

>    fflush(stdout);
>
>    if (Is_block(cons)) { printf("true\n");};
>    fflush(stdout);
>    printf("cons has size %i \n",Wosize_val(cons));
>    fflush(stdout);
>    CAMLreturn (cons);
> }
>

- Xavier Leroy