--- /dev/null
+commit b24bde4302b0f85aa1bc0382299d41923eab614e
+Author: Alexey Borzenkov <snaury@gmail.com>
+Date: Fri Feb 21 22:32:13 2014 +0400
+
+ green_dealloc: don't use trashcan on non-GC'ible greenlets
+
+ There's an assert in Python's object.c that checks trashcan
+ is only used for garbage collectible objects. Since not all
+ greenlets are garbage collectible trashcan use must be
+ conditional.
+
+diff --git a/greenlet.c b/greenlet.c
+index c99f13f..580bf7d 100644
+--- a/greenlet.c
++++ b/greenlet.c
+@@ -941,14 +941,10 @@ static int green_clear(PyGreenlet* self)
+ }
+ #endif
+
+-static void green_dealloc(PyGreenlet* self)
++static void green_dealloc_safe(PyGreenlet* self)
+ {
+ PyObject *error_type, *error_value, *error_traceback;
+
+-#if GREENLET_USE_GC
+- PyObject_GC_UnTrack((PyObject *)self);
+- Py_TRASHCAN_SAFE_BEGIN(self);
+-#endif /* GREENLET_USE_GC */
+ if (PyGreenlet_ACTIVE(self) && self->run_info != NULL && !PyGreenlet_MAIN(self)) {
+ /* Hacks hacks hacks copied from instance_dealloc() */
+ /* Temporarily resurrect the greenlet. */
+@@ -995,7 +991,7 @@ static void green_dealloc(PyGreenlet* self)
+ --Py_TYPE(self)->tp_frees;
+ --Py_TYPE(self)->tp_allocs;
+ #endif /* COUNT_ALLOCS */
+- goto green_dealloc_end;
++ return;
+ }
+ }
+ if (self->weakreflist != NULL)
+@@ -1007,12 +1003,24 @@ static void green_dealloc(PyGreenlet* self)
+ Py_CLEAR(self->exc_traceback);
+ Py_CLEAR(self->dict);
+ Py_TYPE(self)->tp_free((PyObject*) self);
+-green_dealloc_end:
++}
++
+ #if GREENLET_USE_GC
+- Py_TRASHCAN_SAFE_END(self);
+-#endif /* GREENLET_USE_GC */
+- return;
++static void green_dealloc(PyGreenlet* self)
++{
++ PyObject_GC_UnTrack((PyObject *)self);
++ if (PyObject_IS_GC(self)) {
++ Py_TRASHCAN_SAFE_BEGIN(self);
++ green_dealloc_safe(self);
++ Py_TRASHCAN_SAFE_END(self);
++ } else {
++ /* This object cannot be garbage collected, so trashcan is not allowed */
++ green_dealloc_safe(self);
++ }
+ }
++#else
++#define green_dealloc green_dealloc_safe
++#endif
+
+ static PyObject* single_result(PyObject* results)
+ {
+
+commit 07b799de4e8f12a5cada4124184c772340a8c675 (HEAD, origin/master, origin/HEAD, master)
+Author: Alexey Borzenkov <snaury@gmail.com>
+Date: Fri Feb 21 22:43:10 2014 +0400
+
+ green_dealloc: cast to PyObject * in PyObject_IS_GC
+
+diff --git a/greenlet.c b/greenlet.c
+index 580bf7d..a1a27c0 100644
+--- a/greenlet.c
++++ b/greenlet.c
+@@ -1009,7 +1009,7 @@ static void green_dealloc_safe(PyGreenlet* self)
+ static void green_dealloc(PyGreenlet* self)
+ {
+ PyObject_GC_UnTrack((PyObject *)self);
+- if (PyObject_IS_GC(self)) {
++ if (PyObject_IS_GC((PyObject *)self)) {
+ Py_TRASHCAN_SAFE_BEGIN(self);
+ green_dealloc_safe(self);
+ Py_TRASHCAN_SAFE_END(self);