Bugs item #1648268, was opened at 2007-01-30 22:15
Message generated for change (Comment added) made by ked-tao
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1648268&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Python Interpreter Core
Group: Python 2.5
Status: Open
Resolution: None
Priority: 5
Private: No
Submitted By: ked-tao (ked-tao)
Assigned to: Nobody/Anonymous (nobody)
Summary: Parameter list mismatches (portation problem)

Initial Comment:
On the system I'm porting to(*), an application will trap if the caller does 
not pass the exact parameter list that the callee requires. This is causing 
problems running Python.

One common instance where this appears to be causing problems is where 
functions are registered as METH_NOARGS methods. For example, in 
Obejcts/dictobject.c, dict_popitem() is declared:

static PyObject *dict_popitem(dictobject *mp);

However, as it is declared in the method array as METH_NOARGS, it will be 
called by Objects/methodobject.c:PyCFunction_Call() as "(*meth)(self, NULL)" 
(i.e., an extra NULL parameter is passed for some reason). This will fail on my 
target system.

I've no problem submitting a patch for this (dictobject.c is by no means the 
only place this is happening - it's just the first one encountered because it's 
used so much - though some places _do_ correctly declare a second, ignored 
parameter). However, I'd like to get agreement on the correct form it should be 
changed to before I put the effort in to produce a patch (it's going to be a 
fairly tedious process to identify and fix all these).

In various modules, the functions are called internally as well as being 
registered as METH_NOARGS methods.

Therefore, the change can either be:

static PyObject *foo(PyObject *self)
{
  ...
}

static PyObject *foo_noargs(PyObject *self, void *noargs_null)
{
   return foo(self);
}

... where 'foo' is called internally and 'foo_noargs' is registered as a 
METH_NOARGS method.

or:

static PyObject *foo(PyObject *self, void *noargs_null)
{
  ...
}

... and any internal calls in the module have to pass a second, NULL, argument 
in each call.

The former favours internal module calls over METH_NOARGS calls, the latter 
penalises them. Which is preferred? Should this be raised on a different forum? 
Does anyone care? ;)

Thanks, Kev.

(*) Details on request.

----------------------------------------------------------------------

>Comment By: ked-tao (ked-tao)
Date: 2007-02-16 16:42

Message:
Logged In: YES 
user_id=1703158
Originator: YES

File Added: tested.diff

----------------------------------------------------------------------

Comment By: Martin v. Löwis (loewis)
Date: 2007-02-06 19:49

Message:
Logged In: YES 
user_id=21627
Originator: NO

The current specification says that these should be PyCFunction pointers,
see

http://docs.python.org/api/common-structs.html

My initial implementation of METH_NOARGS had it differently, and nobody
ever bothered fixing them all when this was changed. Please do submit a
patch to correct all such errors, both in code and documentation.

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1648268&group_id=5470
_______________________________________________
Python-bugs-list mailing list 
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to