Index: /pyyaml/trunk/ext/_yaml.pyx
===================================================================
--- /pyyaml/trunk/ext/_yaml.pyx	(revision 366)
+++ /pyyaml/trunk/ext/_yaml.pyx	(revision 377)
@@ -311,4 +311,7 @@
         yaml_parser_delete(&self.parser)
         yaml_event_delete(&self.parsed_event)
+
+    def dispose(self):
+        pass
 
     cdef object _parser_error(self):
@@ -993,4 +996,7 @@
     def __dealloc__(self):
         yaml_emitter_delete(&self.emitter)
+
+    def dispose(self):
+        pass
 
     cdef object _emitter_error(self):
Index: /pyyaml/trunk/tests/lib/canonical.py
===================================================================
--- /pyyaml/trunk/tests/lib/canonical.py	(revision 330)
+++ /pyyaml/trunk/tests/lib/canonical.py	(revision 377)
@@ -211,4 +211,7 @@
         self.events = []
         self.parsed = False
+
+    def dispose(self):
+        pass
 
     # stream: STREAM-START document* STREAM-END
Index: /pyyaml/trunk/tests/lib3/canonical.py
===================================================================
--- /pyyaml/trunk/tests/lib3/canonical.py	(revision 330)
+++ /pyyaml/trunk/tests/lib3/canonical.py	(revision 377)
@@ -212,4 +212,7 @@
         self.events = []
         self.parsed = False
+
+    def dispose(self):
+        pass
 
     # stream: STREAM-START document* STREAM-END
Index: /pyyaml/trunk/lib/yaml/parser.py
===================================================================
--- /pyyaml/trunk/lib/yaml/parser.py	(revision 302)
+++ /pyyaml/trunk/lib/yaml/parser.py	(revision 377)
@@ -87,4 +87,9 @@
         self.state = self.parse_stream_start
 
+    def dispose(self):
+        # Reset the state attributes (to clear self-references)
+        self.states = []
+        self.state = None
+
     def check_event(self, *choices):
         # Check the type of the next event.
Index: /pyyaml/trunk/lib/yaml/__init__.py
===================================================================
--- /pyyaml/trunk/lib/yaml/__init__.py	(revision 360)
+++ /pyyaml/trunk/lib/yaml/__init__.py	(revision 377)
@@ -22,6 +22,9 @@
     """
     loader = Loader(stream)
-    while loader.check_token():
-        yield loader.get_token()
+    try:
+        while loader.check_token():
+            yield loader.get_token()
+    finally:
+        loader.dispose()
 
 def parse(stream, Loader=Loader):
@@ -30,6 +33,9 @@
     """
     loader = Loader(stream)
-    while loader.check_event():
-        yield loader.get_event()
+    try:
+        while loader.check_event():
+            yield loader.get_event()
+    finally:
+        loader.dispose()
 
 def compose(stream, Loader=Loader):
@@ -39,5 +45,8 @@
     """
     loader = Loader(stream)
-    return loader.get_single_node()
+    try:
+        return loader.get_single_node()
+    finally:
+        loader.dispose()
 
 def compose_all(stream, Loader=Loader):
@@ -47,6 +56,9 @@
     """
     loader = Loader(stream)
-    while loader.check_node():
-        yield loader.get_node()
+    try:
+        while loader.check_node():
+            yield loader.get_node()
+    finally:
+        loader.dispose()
 
 def load(stream, Loader=Loader):
@@ -56,5 +68,8 @@
     """
     loader = Loader(stream)
-    return loader.get_single_data()
+    try:
+        return loader.get_single_data()
+    finally:
+        loader.dispose()
 
 def load_all(stream, Loader=Loader):
@@ -64,6 +79,9 @@
     """
     loader = Loader(stream)
-    while loader.check_data():
-        yield loader.get_data()
+    try:
+        while loader.check_data():
+            yield loader.get_data()
+    finally:
+        loader.dispose()
 
 def safe_load(stream):
@@ -97,6 +115,9 @@
     dumper = Dumper(stream, canonical=canonical, indent=indent, width=width,
             allow_unicode=allow_unicode, line_break=line_break)
-    for event in events:
-        dumper.emit(event)
+    try:
+        for event in events:
+            dumper.emit(event)
+    finally:
+        dumper.dispose()
     if getvalue:
         return getvalue()
@@ -123,8 +144,11 @@
             encoding=encoding, version=version, tags=tags,
             explicit_start=explicit_start, explicit_end=explicit_end)
-    dumper.open()
-    for node in nodes:
-        dumper.serialize(node)
-    dumper.close()
+    try:
+        dumper.open()
+        for node in nodes:
+            dumper.serialize(node)
+        dumper.close()
+    finally:
+        dumper.dispose()
     if getvalue:
         return getvalue()
@@ -161,8 +185,11 @@
             encoding=encoding, version=version, tags=tags,
             explicit_start=explicit_start, explicit_end=explicit_end)
-    dumper.open()
-    for data in documents:
-        dumper.represent(data)
-    dumper.close()
+    try:
+        dumper.open()
+        for data in documents:
+            dumper.represent(data)
+        dumper.close()
+    finally:
+        dumper.dispose()
     if getvalue:
         return getvalue()
Index: /pyyaml/trunk/lib/yaml/emitter.py
===================================================================
--- /pyyaml/trunk/lib/yaml/emitter.py	(revision 351)
+++ /pyyaml/trunk/lib/yaml/emitter.py	(revision 377)
@@ -103,4 +103,9 @@
         self.analysis = None
         self.style = None
+
+    def dispose(self):
+        # Reset the state attributes (to clear self-references)
+        self.states = []
+        self.state = None
 
     def emit(self, event):
Index: /pyyaml/trunk/lib/yaml/constructor.py
===================================================================
--- /pyyaml/trunk/lib/yaml/constructor.py	(revision 303)
+++ /pyyaml/trunk/lib/yaml/constructor.py	(revision 377)
@@ -59,9 +59,9 @@
 
     def construct_object(self, node, deep=False):
+        if node in self.constructed_objects:
+            return self.constructed_objects[node]
         if deep:
             old_deep = self.deep_construct
             self.deep_construct = True
-        if node in self.constructed_objects:
-            return self.constructed_objects[node]
         if node in self.recursive_objects:
             raise ConstructorError(None, None,
Index: /pyyaml/trunk/lib3/yaml/__init__.py
===================================================================
--- /pyyaml/trunk/lib3/yaml/__init__.py	(revision 360)
+++ /pyyaml/trunk/lib3/yaml/__init__.py	(revision 377)
@@ -23,6 +23,9 @@
     """
     loader = Loader(stream)
-    while loader.check_token():
-        yield loader.get_token()
+    try:
+        while loader.check_token():
+            yield loader.get_token()
+    finally:
+        loader.dispose()
 
 def parse(stream, Loader=Loader):
@@ -31,6 +34,9 @@
     """
     loader = Loader(stream)
-    while loader.check_event():
-        yield loader.get_event()
+    try:
+        while loader.check_event():
+            yield loader.get_event()
+    finally:
+        loader.dispose()
 
 def compose(stream, Loader=Loader):
@@ -40,5 +46,8 @@
     """
     loader = Loader(stream)
-    return loader.get_single_node()
+    try:
+        return loader.get_single_node()
+    finally:
+        loader.dispose()
 
 def compose_all(stream, Loader=Loader):
@@ -48,6 +57,9 @@
     """
     loader = Loader(stream)
-    while loader.check_node():
-        yield loader.get_node()
+    try:
+        while loader.check_node():
+            yield loader.get_node()
+    finally:
+        loader.dispose()
 
 def load(stream, Loader=Loader):
@@ -57,5 +69,8 @@
     """
     loader = Loader(stream)
-    return loader.get_single_data()
+    try:
+        return loader.get_single_data()
+    finally:
+        loader.dispose()
 
 def load_all(stream, Loader=Loader):
@@ -65,6 +80,9 @@
     """
     loader = Loader(stream)
-    while loader.check_data():
-        yield loader.get_data()
+    try:
+        while loader.check_data():
+            yield loader.get_data()
+    finally:
+        loader.dispose()
 
 def safe_load(stream):
@@ -97,6 +115,9 @@
     dumper = Dumper(stream, canonical=canonical, indent=indent, width=width,
             allow_unicode=allow_unicode, line_break=line_break)
-    for event in events:
-        dumper.emit(event)
+    try:
+        for event in events:
+            dumper.emit(event)
+    finally:
+        dumper.dispose()
     if getvalue:
         return getvalue()
@@ -122,8 +143,11 @@
             encoding=encoding, version=version, tags=tags,
             explicit_start=explicit_start, explicit_end=explicit_end)
-    dumper.open()
-    for node in nodes:
-        dumper.serialize(node)
-    dumper.close()
+    try:
+        dumper.open()
+        for node in nodes:
+            dumper.serialize(node)
+        dumper.close()
+    finally:
+        dumper.dispose()
     if getvalue:
         return getvalue()
@@ -159,8 +183,11 @@
             encoding=encoding, version=version, tags=tags,
             explicit_start=explicit_start, explicit_end=explicit_end)
-    dumper.open()
-    for data in documents:
-        dumper.represent(data)
-    dumper.close()
+    try:
+        dumper.open()
+        for data in documents:
+            dumper.represent(data)
+        dumper.close()
+    finally:
+        dumper.dispose()
     if getvalue:
         return getvalue()
Index: /pyyaml/trunk/lib3/yaml/emitter.py
===================================================================
--- /pyyaml/trunk/lib3/yaml/emitter.py	(revision 359)
+++ /pyyaml/trunk/lib3/yaml/emitter.py	(revision 377)
@@ -103,4 +103,9 @@
         self.analysis = None
         self.style = None
+
+    def dispose(self):
+        # Reset the state attributes (to clear self-references)
+        self.states = []
+        self.state = None
 
     def emit(self, event):
Index: /pyyaml/trunk/lib3/yaml/constructor.py
===================================================================
--- /pyyaml/trunk/lib3/yaml/constructor.py	(revision 361)
+++ /pyyaml/trunk/lib3/yaml/constructor.py	(revision 377)
@@ -52,9 +52,9 @@
 
     def construct_object(self, node, deep=False):
+        if node in self.constructed_objects:
+            return self.constructed_objects[node]
         if deep:
             old_deep = self.deep_construct
             self.deep_construct = True
-        if node in self.constructed_objects:
-            return self.constructed_objects[node]
         if node in self.recursive_objects:
             raise ConstructorError(None, None,
Index: /pyyaml/trunk/lib3/yaml/parser.py
===================================================================
--- /pyyaml/trunk/lib3/yaml/parser.py	(revision 328)
+++ /pyyaml/trunk/lib3/yaml/parser.py	(revision 377)
@@ -87,4 +87,9 @@
         self.state = self.parse_stream_start
 
+    def dispose(self):
+        # Reset the state attributes (to clear self-references)
+        self.states = []
+        self.state = None
+
     def check_event(self, *choices):
         # Check the type of the next event.
