The issue is described by Xavier Leroy:
http://caml.inria.fr/pub/ml-archives/caml-list/2006/09/977818689f4ceb2178c592453df7a343.en.html
As far as my understanding goes, what happens is that the OCaml
compare function (or some C equivalent in the runtime) looks at the
two string pointers and decides that since both are out of the normal
heap they are just opaque objects. Thus it won't compare the content
of the strings, but will just do pointer equality. This massively
breaks assumptions in some ordinary OCaml code, in this instance in
Hashtbl.
> which mean I have to transform my code using Hashtbl.xxx into one
> using the functorized version of hashtbl ? I have hashtbl of strings
> to complex data type. What would be a good hash function for
> strings ?
It may be that Map also has the same problems. You wouldn't really
know except by examining the code.
Later you wrote:
> Actually it seems I have the problem only with Hashtbl from strings
> to whatever. I also have some Hashtbl from int to whatever and they
> work fine after the Ancient.mark.
ints aren't compared in the same way. They are always compared using
pointer equality, so there's no issue.
I've only used ancient to store simple arrays, and when we needed to
do string equality I remember writing a function which was aware of
the above issue (you can compare them byte for byte just fine, even
from OCaml code).
Rich.
--
Richard Jones
Red Hat
_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs
> On Tue, Sep 14, 2010 at 09:46:24PM +0100, Richard Jones wrote:
> Answering my own question, I guess you can use Map, but write a custom
> string comparison function. Ought to work but not tested it :-)
And in similar fashion, one could use Hashtbl.Make to construct a custom
hash table with Hashtbl.HashedType, but provide a custom hashing (and
comparison) function. I assume also the default hashing function stops
upon finding data that's outside O'Caml heap.
Also, the compiler recognizes when strings are compared and calls the
comparing function directly. So let cmp (a : string) b = a < b produces
a call directly to caml_string_lessthan, which I assume would not make
any special checks.
--
_____________________________________________________________________
/ __// /__ ____ __ http://www.modeemi.fi/~flux/\ \
/ /_ / // // /\ \/ / \ /
/_/ /_/ \___/ /_/\_\@modeemi.fi \/
There is now a way to change this. You can call caml_page_table_add
(since 3.11) to explicitly declare a memory region as containing Ocaml
values. The polymorphic comparison, the hash primitive, and marshalling
work then.
There is support for this in Ocamlnet-3:
http://projects.camlcity.org/projects/dl/ocamlnet-3.0.3/doc/html-main/Netsys_mem.html#VALvalue_area
Gerd
>
> > which mean I have to transform my code using Hashtbl.xxx into one
> > using the functorized version of hashtbl ? I have hashtbl of strings
> > to complex data type. What would be a good hash function for
> > strings ?
>
> It may be that Map also has the same problems. You wouldn't really
> know except by examining the code.
>
> Later you wrote:
> > Actually it seems I have the problem only with Hashtbl from strings
> > to whatever. I also have some Hashtbl from int to whatever and they
> > work fine after the Ancient.mark.
>
> ints aren't compared in the same way. They are always compared using
> pointer equality, so there's no issue.
>
> I've only used ancient to store simple arrays, and when we needed to
> do string equality I remember writing a function which was aware of
> the above issue (you can compare them byte for byte just fine, even
> from OCaml code).
>
> Rich.
>
--
------------------------------------------------------------
Gerd Stolpmann, Bad Nauheimer Str.3, 64289 Darmstadt,Germany
ge...@gerd-stolpmann.de http://www.gerd-stolpmann.de
Phone: +49-6151-153855 Fax: +49-6151-997714
------------------------------------------------------------