@@ -25,7 +25,7 @@ static PyTypeObject partial_type;
2525static PyObject *
2626partial_new (PyTypeObject * type , PyObject * args , PyObject * kw )
2727{
28- PyObject * func ;
28+ PyObject * func , * pargs , * nargs , * pkw ;
2929 partialobject * pto ;
3030
3131 if (PyTuple_GET_SIZE (args ) < 1 ) {
@@ -34,7 +34,16 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw)
3434 return NULL ;
3535 }
3636
37+ pargs = pkw = Py_None ;
3738 func = PyTuple_GET_ITEM (args , 0 );
39+ if (Py_TYPE (func ) == & partial_type && type == & partial_type ) {
40+ partialobject * part = (partialobject * )func ;
41+ if (part -> dict == NULL ) {
42+ pargs = part -> args ;
43+ pkw = part -> kw ;
44+ func = part -> fn ;
45+ }
46+ }
3847 if (!PyCallable_Check (func )) {
3948 PyErr_SetString (PyExc_TypeError ,
4049 "the first argument must be callable" );
@@ -48,21 +57,53 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw)
4857
4958 pto -> fn = func ;
5059 Py_INCREF (func );
51- pto -> args = PyTuple_GetSlice (args , 1 , PY_SSIZE_T_MAX );
52- if (pto -> args == NULL ) {
60+
61+ nargs = PyTuple_GetSlice (args , 1 , PY_SSIZE_T_MAX );
62+ if (nargs == NULL ) {
63+ pto -> args = NULL ;
5364 pto -> kw = NULL ;
5465 Py_DECREF (pto );
5566 return NULL ;
5667 }
68+ if (pargs == Py_None || PyTuple_GET_SIZE (pargs ) == 0 ) {
69+ pto -> args = nargs ;
70+ Py_INCREF (nargs );
71+ }
72+ else if (PyTuple_GET_SIZE (nargs ) == 0 ) {
73+ pto -> args = pargs ;
74+ Py_INCREF (pargs );
75+ }
76+ else {
77+ pto -> args = PySequence_Concat (pargs , nargs );
78+ if (pto -> args == NULL ) {
79+ pto -> kw = NULL ;
80+ Py_DECREF (pto );
81+ return NULL ;
82+ }
83+ }
84+ Py_DECREF (nargs );
85+
5786 if (kw != NULL ) {
58- pto -> kw = PyDict_Copy (kw );
87+ if (pkw == Py_None ) {
88+ pto -> kw = PyDict_Copy (kw );
89+ }
90+ else {
91+ pto -> kw = PyDict_Copy (pkw );
92+ if (pto -> kw != NULL ) {
93+ if (PyDict_Merge (pto -> kw , kw , 1 ) != 0 ) {
94+ Py_DECREF (pto );
95+ return NULL ;
96+ }
97+ }
98+ }
5999 if (pto -> kw == NULL ) {
60100 Py_DECREF (pto );
61101 return NULL ;
62102 }
63- } else {
64- pto -> kw = Py_None ;
65- Py_INCREF (Py_None );
103+ }
104+ else {
105+ pto -> kw = pkw ;
106+ Py_INCREF (pkw );
66107 }
67108
68109 pto -> weakreflist = NULL ;
0 commit comments