From 140272b5068a823c3db00b927b7bc79cebac70d2 Mon Sep 17 00:00:00 2001
From: Tassilo Horn <tassilo@member.fsf.org>
Date: Fri, 16 Dec 2011 18:39:05 +0100
Subject: [PATCH] Only capture a shallow copy of the current Frame in
 binding-conveyor-fn, so that sends in agent actions don't
 built infinite Frame stacks.  Fixes CLJ-898.

---
 src/clj/clojure/core.clj      |    2 +-
 src/jvm/clojure/lang/Var.java |   14 ++++++++++++++
 2 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index c99d111..e1878d3 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -1812,7 +1812,7 @@
   {:private true
    :added "1.3"}
   [f]
-  (let [frame (clojure.lang.Var/getThreadBindingFrame)]
+  (let [frame (clojure.lang.Var/cloneThreadBindingFrame)]
     (fn 
       ([]
          (clojure.lang.Var/resetThreadBindingFrame frame)
diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java
index 3be479b..213beef 100644
--- a/src/jvm/clojure/lang/Var.java
+++ b/src/jvm/clojure/lang/Var.java
@@ -61,6 +61,13 @@ static class Frame{
 		this.bindings = bindings;
 		this.prev = prev;
 	}
+
+    	protected Object clone() {
+		Frame f = new Frame();
+		f.bindings = this.bindings;
+		return f;
+    	}
+
 }
 
 static final ThreadLocal<Frame> dvals = new ThreadLocal<Frame>(){
@@ -95,6 +102,13 @@ public static Object getThreadBindingFrame(){
 	return new Frame();
 }
 
+public static Object cloneThreadBindingFrame(){
+	Frame f = (Frame) dvals.get().clone();
+	if(f != null)
+		return f;
+	return new Frame();
+}
+
 public static void resetThreadBindingFrame(Object frame){
 	dvals.set((Frame) frame);
 }
-- 
1.7.8

