[mercury-users] C FFI for discriminated union types.
Guillaume Yziquel
guillaume.yziquel at citycable.ch
Sun Jun 19 23:54:00 AEST 2011
Le Sunday 19 Jun 2011 à 23:26:59 (+1000), Julien Fischer a écrit :
> >
> >However the tradeoff is:
> >
> >-1- Do the conversion in Mercury code, and take extra care for OCaml's
> >GC in every C stub that calls Mercury since it may trigger OCaml's GC.
> >
> >-2- Do the conversion in C code, no OCaml GC worries (or at least not
> >too much) in exchange for tedious conversion function in C level.
>
> There is a third possibility, do the conversion in C code that makes
> calls back to Mercury, via pragma foreign_export, in order to manipulate
> the d.u. type. For the type above, since presumably all you need to do
> is deconstruct it, is:
>
> :- pragma foreign_export("C", is_term_def(in, out), "C_is_term_def").
> :- pred is_term_def(term_def::in, term::out) is semidet.
> is_term_def(term_def(Term), Term).
>
> :- pragma foreign_export("C", is_term_def_str(in, out),
> "C_is_term_def").
> :- pred is_term_def_string(term_def::in, str::out) is semidet.
> is_term_def_str(term_def_string(Str), Str).
>
> The C code code that converts the Mercury values to OCaml values would
> look something like this:
>
> MR_Word TermDef;
> <Term> term;
> <Str> str;
>
> if (C_is_term_def(TermDef, &term)) {
> /* Convert term_def/1 with argument term to OCaml */
> } else if (C_is_term_def_string(TermDef, &str)) {
> /* Convert term_def_string/1 with argument str to OCaml */
> } else {
> /* error */
> }
>
> (<Term> and <Str> are whatever the C types of term/0 and str/0 are.)
Yes, that is exactly how I am handling it now, but I find this to be
quite brittle, and has caused a few segmentation faults while
refactoring things somewhat brutally. But, yes, with the given
documentation, it seems the designated road to follow.
> >Both are workable, but I'd appreciate having more background, if only
> >informally, about the design of data representation for discriminated
> >union datatypes in C grades.
>
> See section 3.2 of the following paper:
>
> The execution algorithm of Mercury: an efficient purely declarative
> logic programming language
> Zoltan Somogyi, Fergus Henderson and Thomas Conway. JLP, 1996.
>
> which is available from the papers section of the Mercury website, at
> <http://www.mercury.csse.unimelb.edu.au/information/papers.html#jlp>.
>
> Note that some of the implementation details have changed since that
> paper was written but the basic ideas are pretty much the same.
Sure. Thank you so much for that reference.
> Julien.
Best regards,
--
Guillaume Yziquel
--------------------------------------------------------------------------
mercury-users mailing list
Post messages to: mercury-users at csse.unimelb.edu.au
Administrative Queries: owner-mercury-users at csse.unimelb.edu.au
Subscriptions: mercury-users-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the users
mailing list