[Python-Dev] Special-casing "O"
M.-A. Lemburg
mal@lemburg.com
Fri, 25 May 2001 23:38:15 +0200
"Martin v. Loewis" wrote:
>
> > Now this would be more flexible if you would implement a scheme
> > which lets us put the parser string into the method list. The
> > call mechanism could then easily figure out how to call the
> > method and it would also be more easily extensible:
> >
> > {"append", (PyCFunction)listappend, METH_DIRECT, append_doc, "O"},
>
> I'd like to hear other people's comment on this specific issue, so I
> guess I should probably write a PEP outlining the options.
>
> My immediate reaction to your proposal is that it only complicates the
> interface without any savings. We still can only support a limited
> number of calling conventions. E.g. it is not possible to write
> portable C code that does all the calling conventions for "l", "ll",
> "lll", "llll", and so on - you have to cast the function pointer to
> the right prototype, which must be done in source code.
>
> So with this interface, you may end up at run-time finding out that
> you cannot support the signature. With the current patch, you'd have
> to know to convert "OO" into METH_OO, which I think is not asked too
> much - and it gives you a compile-time error if you use an unsupported
> calling convention.
True. It's unfortunate that C doesn't offer the reverse of
varargs.h...
> > A parser marker "OO" would then call a method like this:
> >
> > method(self, arg0, arg1)
> >
> > and so on.
>
> That is indeed the plan, but since you have to code the parameter
> combinations in C code, you can only support so many of them.
>
> > allows implementing a generic scheme which
> > then again relies on PyArg_ParseTuple() to do the argument
> > parsing, e.g. "is#" could be implemented as:
>
> The point of the patch is to get rid of PyArg_ParseTuple in the
> "common case". For functions with complex calling conventions, getting
> rid of the PyArg_ParseTuple string parsing is not that important,
> since they are expensive, anyway (not that "is#" couldn't be
> supported, I'd call it METH_is_hash).
>
> > For optional arguments we'd need some convention which then
> > lets the called function add the default value as needed.
>
> For the moment, I'd only support "|O", and perhaps "|z"; an omitted
> argument would be represented as a NULL pointer. That means that "|i"
> couldn't participate in the fast calling convention - unless we
> translate that to
>
> void foo(PyObject*self, int i, bool ipresent);
>
> BTW, the most frequent function in my measurements that would make use
> of this convention is "OO|i:replace", which scores at 4.5%.
I was thinking of using pointer indirection for this:
foo(PyObject *self, int *i)
If i is given as argument, *i is set to the value, otherwise
i is set to NULL.
--
Marc-Andre Lemburg
CEO eGenix.com Software GmbH
______________________________________________________________________
Company & Consulting: http://www.egenix.com/
Python Software: http://www.lemburg.com/python/