Browse thread
Caml interface with C on x86_64
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ 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