@@ -105,12 +105,17 @@ public sealed class PythonGenerator : IEnumerator, IEnumerator<object>, ICodeFor
         /// </summary>
         [LightThrowing]
         public object @throw(object type) {
-            return @throw(type, null, null);
+            return @throw(type, null, null, false);
         }
 
         [LightThrowing]
         public object @throw(object type, object value) {
-            return @throw(type, value, null);
+            return @throw(type, value, null, false);
+        }
+
+        [LightThrowing]
+        public object @throw(object type, object value, object traceback) {
+            return @throw(type, value, traceback, false);
         }
 
         /// <summary>
@@ -121,7 +126,7 @@ public sealed class PythonGenerator : IEnumerator, IEnumerator<object>, ICodeFor
         /// If the generator catches the exception and yields another value, that is the return value of g.throw().
         /// </summary>
         [LightThrowing]
-        public object @throw(object type, object value, object traceback) {
+        private object @throw(object type, object value, object traceback, bool finalizing) {
             // The Pep342 explicitly says "The type argument must not be None". 
             // According to CPython 2.5's implementation, a null type argument should:
             // - throw a TypeError exception (just as Raise(None) would) *outside* of the generator's body
@@ -147,11 +152,13 @@ public sealed class PythonGenerator : IEnumerator, IEnumerator<object>, ICodeFor
                     return throwable;
                 }
             }
-            
+            if (finalizing) {
+                // we are running on the finalizer thread - things can be already collected
+                return LightExceptions.Throw(PythonOps.StopIteration());
+            }
             if (!((IEnumerator)this).MoveNext()) {
                 return LightExceptions.Throw(PythonOps.StopIteration());
             }
-
             return CurrentValue;
         }
 
@@ -174,21 +181,25 @@ public sealed class PythonGenerator : IEnumerator, IEnumerator<object>, ICodeFor
             return next();
         }
 
+        [LightThrowing]
+        public object close() {
+            return close(false);
+        }
+
         /// <summary>
         /// Close introduced in Pep 342.
         /// </summary>
         [LightThrowing]
-        public object close() {
+        private object close(bool finalizing) {
             // This is nop if the generator is already closed.
-
             // Optimization to avoid throwing + catching an exception if we're already closed.
             if (Closed) {
                 return null;
             }
 
             // This function body is the psuedo code straight from Pep 342.
             try {
-                object res = @throw(new GeneratorExitException());
+                object res = @throw(new GeneratorExitException(), null, null, finalizing);
                 Exception lightEh = LightExceptions.GetLightException(res);
                 if (lightEh != null) {
                     if (lightEh is StopIterationException || lightEh is GeneratorExitException) {
@@ -297,7 +308,7 @@ public sealed class PythonGenerator : IEnumerator, IEnumerator<object>, ICodeFor
             if (CanSetSysExcInfo || ContainsTryFinally) {
                 try {
                     // This may run the users generator.
-                    object res = close();
+                    object res = close(true);
                     Exception ex = LightExceptions.GetLightException(res);
                     if (ex != null) {
                         HandleFinalizerException(ex);