From: Guillaume Yziquel <guillaume.yziquel@citycable.ch>
To: OCaml List <caml-list@inria.fr>
Cc: Florent Monnier <fmonnier@linux-nantes.fr.eu.org>
Subject: Re: [Caml-list] Wrapping var_args, or C ... in ocaml?
Date: Sat, 20 Feb 2010 03:41:16 +0100 [thread overview]
Message-ID: <4B7F4BCC.9000604@citycable.ch> (raw)
In-Reply-To: <4B7F3FED.4010100@citycable.ch>
Guillaume Yziquel a écrit :
> Florent Monnier a écrit :
>> Le dimanche 14 février 2010 23:46:10, Guillaume Yziquel a écrit :
>>> I mean, it seems that varargs means on the receiving end "the number
>>> of arguments you'r giving me, as a function, is not limited", whereas
>>> on the sending end, you hard-code the number of arguments in your C
>>> code.
>>>
>>> Is there a way to map an OCaml list to an ellipsis? Or is it a C
>>> limitation?
>>
>> Yes, as long as I know, for this you should use these kind of tools:
>> http://sourceware.org/libffi/
>> http://www.gnu.org/software/libffcall/avcall.html
>> http://www.nongnu.org/cinvoke/
>
> Phew! These tools are quite tough to handle! (I just tried to use
> avcall.h on this ellipsis.)
Got it.
The correct code is:
> CAMLprim value ocamlpython_py_tuple_pack (value ml_len, value ml_pyobjs) {
>
> av_alist argList;
> PyObject * retVal;
> av_start_ptr(argList, &PyTuple_Pack, PyObject*, &retVal);
>
> #if defined(__s390__) || defined(__hppa__) || defined(__cris__)
> #define av_Py_ssize_t av_long
> #else
> #define av_Py_ssize_t av_int
> #endif
>
> av_Py_ssize_t(argList, Pyoffset_val(ml_len));
> while (ml_pyobjs != Val_emptylist) {
> av_ptr(argList, PyObject*, Pyobj_val(Field(ml_pyobjs, 0)));
> ml_pyobjs = Field(ml_pyobjs, 1);
> }
>
> av_call(argList);
> return(Val_owned_pyobj(retVal));
> }
Hope that will be useful to people wishing to wrap up varargs (though
it's probably a bad idea, since the stack is limited...)
Python function calls are now possible by constructing the argument tuple.
--
Guillaume Yziquel
http://yziquel.homelinux.org/
prev parent reply other threads:[~2010-02-20 2:40 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-14 15:46 Guillaume Yziquel
2010-02-14 18:06 ` [Caml-list] " Richard Jones
2010-02-14 20:26 ` Richard Jones
2010-02-14 22:46 ` Guillaume Yziquel
2010-02-14 22:59 ` Richard Jones
2010-02-14 23:13 ` Guillaume Yziquel
2010-02-14 23:19 ` Richard Jones
2010-02-15 1:34 ` Guillaume Yziquel
2010-02-15 2:37 ` Thomas Fischbacher
2010-02-14 23:31 ` Richard Jones
2010-02-15 10:16 ` Florent Monnier
[not found] ` <201002151106.23642.fmonnier@linux-nantes.fr.eu.org>
[not found] ` <4B7F3FED.4010100@citycable.ch>
2010-02-20 2:41 ` Guillaume Yziquel [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B7F4BCC.9000604@citycable.ch \
--to=guillaume.yziquel@citycable.ch \
--cc=caml-list@inria.fr \
--cc=fmonnier@linux-nantes.fr.eu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox