Patch for XALANJ-2204
diff --git a/src/org/apache/xpath/objects/XBoolean.java b/src/org/apache/xpath/objects/XBoolean.java
index f1fdad6..7507754 100644
--- a/src/org/apache/xpath/objects/XBoolean.java
+++ b/src/org/apache/xpath/objects/XBoolean.java
@@ -69,7 +69,7 @@
     super();
 
     m_val = b.booleanValue();
-    m_obj = b;
+    setObject(b);
   }
 
 
@@ -133,7 +133,7 @@
   public Object object()
   {
     if(null == m_obj)
-      m_obj = new Boolean(m_val);
+      setObject(new Boolean(m_val));
     return m_obj;
   }
 
diff --git a/src/org/apache/xpath/objects/XNodeSet.java b/src/org/apache/xpath/objects/XNodeSet.java
index 09697ab..dce5f66 100644
--- a/src/org/apache/xpath/objects/XNodeSet.java
+++ b/src/org/apache/xpath/objects/XNodeSet.java
@@ -55,12 +55,17 @@
   	super();
   	if(val instanceof XNodeSet)
   	{
-	    setIter(((XNodeSet)val).m_iter);
-	    m_dtmMgr = ((XNodeSet)val).m_dtmMgr;
-	    m_last = ((XNodeSet)val).m_last;
-	    if(!((XNodeSet)val).hasCache())
-	    	((XNodeSet)val).setShouldCacheNodes(true);
-	    m_obj = ((XNodeSet)val).m_obj;
+        final XNodeSet nodeSet = (XNodeSet) val;
+	    setIter(nodeSet.m_iter);
+	    m_dtmMgr = nodeSet.m_dtmMgr;
+	    m_last = nodeSet.m_last;
+        // First make sure the DTMIterator val has a cache,
+        // so if it doesn't have one, make one.
+	    if(!nodeSet.hasCache())
+	        nodeSet.setShouldCacheNodes(true);
+        
+        // Get the cache from val and use it ourselves (we share it).
+	    setObject(nodeSet.getIteratorCache());
   	}
   	else
     	setIter(val);
@@ -79,7 +84,7 @@
     m_last = val.m_last;
     if(!val.hasCache())
     	val.setShouldCacheNodes(true);
-    m_obj = val.m_obj;
+    setObject(val.m_obj);
   }
 
 
@@ -428,7 +433,7 @@
     else
     {
       mnl = new NodeSetDTM(iter());
-      m_obj = mnl;
+      setObject(mnl);
       setCurrentPos(0);
     }
 
diff --git a/src/org/apache/xpath/objects/XNodeSetForDOM.java b/src/org/apache/xpath/objects/XNodeSetForDOM.java
index eab7278..bc1e2b5 100644
--- a/src/org/apache/xpath/objects/XNodeSetForDOM.java
+++ b/src/org/apache/xpath/objects/XNodeSetForDOM.java
@@ -42,7 +42,7 @@
     m_dtmMgr = dtmMgr;
     m_origObj = node;
     int dtmHandle = dtmMgr.getDTMHandleFromNode(node);
-    m_obj = new NodeSetDTM(dtmMgr);
+    setObject(new NodeSetDTM(dtmMgr));
     ((NodeSetDTM) m_obj).addNode(dtmHandle);
   }
   
@@ -69,7 +69,7 @@
     // m_obj=new org.apache.xpath.NodeSetDTM(nodeList, xctxt);
     org.apache.xpath.NodeSetDTM nsdtm=new org.apache.xpath.NodeSetDTM(nodeList, xctxt);
     m_last=nsdtm.getLength();
-    m_obj = nsdtm;   
+    setObject(nsdtm);   
   }
 
   public XNodeSetForDOM(NodeIterator nodeIter, XPathContext xctxt)
@@ -83,7 +83,7 @@
     // m_obj = new org.apache.xpath.NodeSetDTM(nodeIter, xctxt);
     org.apache.xpath.NodeSetDTM nsdtm=new org.apache.xpath.NodeSetDTM(nodeIter, xctxt);
     m_last=nsdtm.getLength();
-    m_obj = nsdtm;   
+    setObject(nsdtm);   
   }
   
   /**
diff --git a/src/org/apache/xpath/objects/XNumber.java b/src/org/apache/xpath/objects/XNumber.java
index c2496da..5b053b1 100644
--- a/src/org/apache/xpath/objects/XNumber.java
+++ b/src/org/apache/xpath/objects/XNumber.java
@@ -60,7 +60,7 @@
     super();
 
     m_val = num.doubleValue();
-    m_obj = num;
+    setObject(num);
   }
 
   /**
@@ -377,7 +377,7 @@
   public Object object()
   {
     if(null == m_obj)
-      m_obj = new Double(m_val);
+      setObject(new Double(m_val));
     return m_obj;
   }
 
diff --git a/src/org/apache/xpath/objects/XObject.java b/src/org/apache/xpath/objects/XObject.java
index 199dcbe..6c3cf16 100644
--- a/src/org/apache/xpath/objects/XObject.java
+++ b/src/org/apache/xpath/objects/XObject.java
@@ -68,7 +68,11 @@
    */
   public XObject(Object obj)
   {
-    m_obj = obj;
+    setObject(obj);
+  }
+  
+  protected void setObject(Object obj) {
+      m_obj = obj;
   }
 
   /**
@@ -119,7 +123,7 @@
       allowDetachToRelease(true);
       detach();
 
-      m_obj = null;
+      setObject(null);
     }
   }
   
diff --git a/src/org/apache/xpath/objects/XRTreeFrag.java b/src/org/apache/xpath/objects/XRTreeFrag.java
index 9c4447c..ea19b39 100644
--- a/src/org/apache/xpath/objects/XRTreeFrag.java
+++ b/src/org/apache/xpath/objects/XRTreeFrag.java
@@ -118,7 +118,7 @@
   public void detach(){
     if(m_allowRelease){
     	m_DTMXRTreeFrag.destruct();
-      m_obj = null;
+      setObject(null);
     }
   }