@@ -715,9 +715,13 @@ type_repr(PyTypeObject *type)
715715 return rtn ;
716716}
717717
718+ static int
719+ slot_tp_init (PyObject * self , PyObject * args , PyObject * kwds );
720+
718721static PyObject *
719722type_call (PyTypeObject * type , PyObject * args , PyObject * kwds )
720723{
724+ STACKLESS_GETARG ();
721725 PyObject * obj ;
722726
723727 if (type -> tp_new == NULL ) {
@@ -741,10 +745,29 @@ type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
741745 if (!PyType_IsSubtype (Py_TYPE (obj ), type ))
742746 return obj ;
743747 type = Py_TYPE (obj );
744- if (type -> tp_init != NULL &&
745- type -> tp_init (obj , args , kwds ) < 0 ) {
746- Py_DECREF (obj );
747- obj = NULL ;
748+ if (type -> tp_init != NULL ) {
749+ initproc tp_init = type -> tp_init ;
750+ int ret ;
751+ #ifdef STACKLESS
752+ int is_stackless ;
753+ if (tp_init == slot_tp_init )
754+ STACKLESS_PROMOTE_ALL ();
755+ is_stackless = slp_try_stackless ;
756+ #endif
757+ ret = tp_init (obj , args , kwds );
758+ #ifdef STACKLESS
759+ STACKLESS_ASSERT ();
760+ if (is_stackless && ret == STACKLESS_UNWINDING_MAGIC ) {
761+ /* It is a stackless call and it is unwinding.
762+ * the real result is in Py_UnwindToken */
763+ Py_DECREF (obj );
764+ return (PyObject * )Py_UnwindToken ;
765+ }
766+ #endif
767+ if (ret < 0 ) {
768+ Py_DECREF (obj );
769+ obj = NULL ;
770+ }
748771 }
749772 }
750773 return obj ;
@@ -3008,6 +3031,7 @@ PyTypeObject PyType_Type = {
30083031 (inquiry )type_is_gc , /* tp_is_gc */
30093032};
30103033
3034+ STACKLESS_DECLARE_METHOD (& PyType_Type , tp_call )
30113035
30123036/* The base type of all types (eventually)... except itself. */
30133037
@@ -5696,18 +5720,67 @@ slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
56965720 return 0 ;
56975721}
56985722
5723+ #ifdef STACKLESS
5724+ PyObject *
5725+ slp_tp_init_callback (PyFrameObject * f , int exc , PyObject * retval )
5726+ {
5727+ PyThreadState * ts = PyThreadState_GET ();
5728+ PyCFrameObject * cf = (PyCFrameObject * ) f ;
5729+
5730+ f = cf -> f_back ;
5731+ if (retval != NULL ) {
5732+ if (retval != Py_None ) {
5733+ PyErr_Format (PyExc_TypeError ,
5734+ "__init__() should return None, not '%.200s'" ,
5735+ Py_TYPE (retval )-> tp_name );
5736+ Py_DECREF (retval );
5737+ retval = NULL ;
5738+ } else {
5739+ Py_DECREF (retval );
5740+ retval = cf -> ob1 ;
5741+ cf -> ob1 = NULL ;
5742+ }
5743+ }
5744+ ts -> frame = f ;
5745+ Py_DECREF (cf );
5746+ return STACKLESS_PACK (retval );
5747+ }
5748+ #endif
5749+
56995750static int
57005751slot_tp_init (PyObject * self , PyObject * args , PyObject * kwds )
57015752{
5702- STACKLESS_GETARG (); /* not yet supported */
5753+ STACKLESS_GETARG ();
57035754 _Py_IDENTIFIER (__init__ );
57045755 PyObject * meth = lookup_method (self , & PyId___init__ );
57055756 PyObject * res ;
57065757
57075758 if (meth == NULL )
57085759 return -1 ;
5760+ #ifdef STACKLESS
5761+ if (stackless ) {
5762+ PyCFrameObject * f = slp_cframe_new (slp_tp_init_callback , 1 );
5763+ if (f == NULL )
5764+ return -1 ;
5765+ Py_INCREF (self );
5766+ f -> ob1 = self ;
5767+ PyThreadState_GET ()-> frame = (PyFrameObject * ) f ;
5768+ }
5769+ #endif
5770+ STACKLESS_PROMOTE_ALL ();
57095771 res = PyObject_Call (meth , args , kwds );
5772+ STACKLESS_ASSERT ();
57105773 Py_DECREF (meth );
5774+ #ifdef STACKLESS
5775+ if (stackless && !STACKLESS_UNWINDING (res )) {
5776+ /* required, because added a C-frame */
5777+ STACKLESS_PACK (res );
5778+ return STACKLESS_UNWINDING_MAGIC ;
5779+ }
5780+ if (STACKLESS_UNWINDING (res )) {
5781+ return STACKLESS_UNWINDING_MAGIC ;
5782+ }
5783+ #endif
57115784 if (res == NULL )
57125785 return -1 ;
57135786 if (res != Py_None ) {
0 commit comments