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);
}
}