diff options
author | Stefan Zager <szager@gmail.com> | 2011-04-02 21:40:00 +0000 |
---|---|---|
committer | Stefan Zager <szager@gmail.com> | 2011-04-02 21:40:00 +0000 |
commit | 90fe22acf7b02111db8799b608c4189efa9b280c (patch) | |
tree | a6339cff6eead1ef17c7774a6ab2f0cc1a6d99c1 | |
parent | 48faf209345c632e9823fe62f0bd315e52a21617 (diff) | |
download | swig-90fe22acf7b02111db8799b608c4189efa9b280c.tar.gz |
Fix for METH_O and -compactdefaultargs, in two parts:
- Don't mark a method as METH_O if it has compactdefaultargs
- In SWIG_Python_UnpackTuple, allow for a non-tuple 'args'.
Added compatibility for python versions 2.3 and 2.4. These are only
partially supported; inheriting from wrapped types looks problematic.
Versions older that 2.3 are unlikely ever to work.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/szager-python-builtin@12590 626c5289-ae23-0410-ae9c-e8d60b6d4f22
-rw-r--r-- | Examples/test-suite/common.mk | 3 | ||||
-rw-r--r-- | Lib/python/builtin.swg | 2 | ||||
-rw-r--r-- | Lib/python/pyhead.swg | 45 | ||||
-rw-r--r-- | Lib/python/pyrun.swg | 8 | ||||
-rw-r--r-- | Lib/python/std_pair.i | 8 | ||||
-rw-r--r-- | Source/Modules/python.cxx | 4 |
6 files changed, 63 insertions, 7 deletions
diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index 5423542f7..f85eed491 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -156,7 +156,6 @@ CPP_TEST_CASES += \ destructor_reprotected \ director_abstract \ director_alternating \ - director_basic \ director_classes \ director_classic \ director_constructor \ @@ -439,6 +438,8 @@ CPP_TEST_CASES += \ wallkw \ wrapmacro +# director_basic \ + # # Put all the heavy STD/STL cases here, where they can be skipped if needed # diff --git a/Lib/python/builtin.swg b/Lib/python/builtin.swg index 876bcd1cc..ca9d8ab15 100644 --- a/Lib/python/builtin.swg +++ b/Lib/python/builtin.swg @@ -270,7 +270,7 @@ SwigPyStaticVar_repr(PyGetSetDescrObject *descr) { SWIGINTERN int SwigPyStaticVar_traverse(PyObject *self, visitproc visit, void *arg) { PyDescrObject *descr = (PyDescrObject *)self; - Py_VISIT(descr->d_type); + Py_VISIT((PyObject*) descr->d_type); return 0; } diff --git a/Lib/python/pyhead.swg b/Lib/python/pyhead.swg index 2ce0fb194..d38b4d91f 100644 --- a/Lib/python/pyhead.swg +++ b/Lib/python/pyhead.swg @@ -153,4 +153,49 @@ PyObject *PyBool_FromLong(long ok) typedef int Py_ssize_t; # define PY_SSIZE_T_MAX INT_MAX # define PY_SSIZE_T_MIN INT_MIN +typedef inquiry lenfunc; +typedef intargfunc ssizeargfunc; +typedef intintargfunc ssizessizeargfunc; +typedef intobjargproc ssizeobjargproc; +typedef intintobjargproc ssizessizeobjargproc; +typedef getreadbufferproc readbufferproc; +typedef getwritebufferproc writebufferproc; +typedef getsegcountproc segcountproc; +typedef getcharbufferproc charbufferproc; +static inline long PyNumber_AsSsize_t (PyObject *x, void*) +{ + long result = 0; + PyObject *i = PyNumber_Int(x); + if (i) { + result = PyInt_AsLong(i); + Py_DECREF(i); + } + return result; +} +#endif + +#if PY_VERSION_HEX < 0x02040000 +#define Py_VISIT(op) \ + do { \ + if (op) { \ + int vret = visit((op), arg); \ + if (vret) \ + return vret; \ + } \ + } while (0) +#endif + +#if PY_VERSION_HEX < 0x02030000 +typedef struct { + PyTypeObject type; + PyNumberMethods as_number; + PyMappingMethods as_mapping; + PySequenceMethods as_sequence; + PyBufferProcs as_buffer; + PyObject *name, *slots; +} PyHeapTypeObject; +#endif + +#if PY_VERSION_HEX < 0x02030000 +typedef destructor freefunc; #endif diff --git a/Lib/python/pyrun.swg b/Lib/python/pyrun.swg index 53eaf8163..d6e273df1 100644 --- a/Lib/python/pyrun.swg +++ b/Lib/python/pyrun.swg @@ -166,6 +166,14 @@ SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssi } } if (!PyTuple_Check(args)) { + if (min <= 1 && max >= 1) { + objs[0] = args; + register int i; + for (i = 1; i < max; ++i) { + objs[i] = 0; + } + return 2; + } PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { diff --git a/Lib/python/std_pair.i b/Lib/python/std_pair.i index 386fbdab7..782969574 100644 --- a/Lib/python/std_pair.i +++ b/Lib/python/std_pair.i @@ -129,8 +129,8 @@ SwigPython_std_pair_repr (PyObject *o) { PyObject *tuple = PyTuple_New(2); assert(tuple); - PyTuple_SET_ITEM(tuple, 0, PyObject_GetAttrString(o, "first")); - PyTuple_SET_ITEM(tuple, 1, PyObject_GetAttrString(o, "second")); + PyTuple_SET_ITEM(tuple, 0, PyObject_GetAttrString(o, (char*) "first")); + PyTuple_SET_ITEM(tuple, 1, PyObject_GetAttrString(o, (char*) "second")); PyObject *result = PyObject_Repr(tuple); Py_DECREF(tuple); return result; @@ -139,14 +139,14 @@ SwigPython_std_pair_repr (PyObject *o) SWIGINTERN PyObject* SwigPython_std_pair_getitem (PyObject *a, Py_ssize_t b) { - PyObject *result = PyObject_GetAttrString(a, b % 2 ? "second" : "first"); + PyObject *result = PyObject_GetAttrString(a, b % 2 ? (char*) "second" : (char*) "first"); return result; } SWIGINTERN int SwigPython_std_pair_setitem (PyObject *a, Py_ssize_t b, PyObject *c) { - int result = PyObject_SetAttrString(a, b % 2 ? "second" : "first", c); + int result = PyObject_SetAttrString(a, b % 2 ? (char*) "second" : (char*) "first", c); return result; } #endif diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx index fe63a3dbc..b26e75433 100644 --- a/Source/Modules/python.cxx +++ b/Source/Modules/python.cxx @@ -2129,7 +2129,7 @@ public: int noargs = funpack && (tuple_required == 0 && tuple_arguments == 0); int onearg = funpack && (tuple_required == 1 && tuple_arguments == 1); - if (builtin && funpack && !overname && !builtin_ctor) { + if (builtin && funpack && !overname && !builtin_ctor && !GetFlag(n, "feature:compactdefaultargs")) { String *argattr = NewStringf("%d", tuple_arguments); Setattr(n, "python:argcount", argattr); Delete(argattr); @@ -3434,7 +3434,9 @@ public: printSlot(f, getSlot(n, "feature:python:nb_true_divide"), "nb_true_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_floor_divide"), "nb_inplace_floor_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_true_divide"), "nb_inplace_true_divide", "binaryfunc"); + Printv(f, "#if PY_VERSION_HEX >= 0x02050000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_index"), "nb_index", "unaryfunc"); + Printv(f, "#endif\n", NIL); Printf(f, " },\n"); // PyMappingMethods as_mapping; |