Preston,

I see some of your code using ArrayBackedValueStorage incorrectly.

For example, look at this snippet from ValueEqComparisonOperation

@Override
public boolean operateTimeTime(XSTimePointable timep1, XSTimePointable timep2, DynamicContext dCtx)
            throws SystemException, IOException {
    abvs.reset();
    DateTime.getTimezoneDateTime(timep1, dCtx, dOut);
    byte[] bytes1 = abvs.getByteArray();

    abvs.reset();
    DateTime.getTimezoneDateTime(timep2, dCtx, dOut);
    byte[] bytes2 = abvs.getByteArray();

return XSDateTimePointable.getDayTime(bytes1, 0) == XSDateTimePointable.getDayTime(bytes2, 0);
}


ABVS reuses the byte array when the existing byte array is large enough to hold the new value. In effect bytes1 and bytes2 will point to the same byte[] in all likelihood and hence the comparison is wrong.

I saw some other places that reuse ABVSs and hold the byte array across resets on the same ABVS. Never do that.

The class should hold on to two different ABVS objects and use those in the two places instead of sharing the same ABVS for both the values.

Vinayak

Reply via email to