Index: src/SynTree/GcTracer.h
===================================================================
--- src/SynTree/GcTracer.h	(revision b5aa3d831cb931cbeaf366eb8027a527929bf767)
+++ src/SynTree/GcTracer.h	(revision fb97252f0e9f4779bc5cc9874715a695350b3660)
@@ -38,10 +38,8 @@
 	void previsit( BaseSyntaxNode * node ) {
 		// skip tree if already seen
-		// xxx - this should be uncommented (it breaks object cycles), but at the moment it seems 
-		// like the object cycles don't happen and other bugs do
-		// if ( node->mark == gc.mark ) {
-		// 	visit_children = false;
-		// 	return;
-		// }
+		if ( node->mark == gc.mark ) {
+			visit_children = false;
+			return;
+		}
 
 		// mark node
@@ -50,4 +48,8 @@
 
 	// add visits left out by PassVisitor
+
+	void postvisit( Constant* con ) {
+		maybeAccept( con->get_type(), *visitor );
+	}
 
 	void postvisit( Expression* expr ) {
@@ -58,4 +60,9 @@
 		postvisit( static_cast<Expression*>(expr) );
 		maybeAccept( expr->function, *visitor );
+	}
+
+	void postvisit( VariableExpr* expr ) {
+		postvisit( static_cast<Expression*>(expr) );
+		maybeAccept( expr->var, *visitor );  // not in PassVisitor because it causes cycle
 	}
 
