summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/BasicStream.java
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2013-12-18 17:22:40 +0100
committerBenoit Foucher <benoit@zeroc.com>2013-12-18 17:22:40 +0100
commite9251a94dda7f28c332ff5f98741960d06bdd67a (patch)
tree895ac497d008cc1ee6ccdf8bb37eed208b77c527 /java/src/IceInternal/BasicStream.java
parentVisual Studio 2013 support (diff)
downloadice-e9251a94dda7f28c332ff5f98741960d06bdd67a.tar.bz2
ice-e9251a94dda7f28c332ff5f98741960d06bdd67a.tar.xz
ice-e9251a94dda7f28c332ff5f98741960d06bdd67a.zip
Fix for ICE-5481: stream startSize/endSize can't be nested
Diffstat (limited to 'java/src/IceInternal/BasicStream.java')
-rw-r--r--java/src/IceInternal/BasicStream.java23
1 files changed, 13 insertions, 10 deletions
diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java
index b241147a0e8..c5bcbf53472 100644
--- a/java/src/IceInternal/BasicStream.java
+++ b/java/src/IceInternal/BasicStream.java
@@ -62,7 +62,7 @@ public class BasicStream
_unlimited = unlimited;
_startSeq = -1;
- _sizePos = -1;
+ _sizeStack = null;
}
//
@@ -155,9 +155,9 @@ public class BasicStream
other._minSeqSize = _minSeqSize;
_minSeqSize = tmpMinSeqSize;
- int tmpSizePos = other._sizePos;
- other._sizePos = _sizePos;
- _sizePos = tmpSizePos;
+ java.util.Deque<Integer> tmpSizeStack = other._sizeStack;
+ other._sizeStack = _sizeStack;
+ _sizeStack = tmpSizeStack;
}
public void
@@ -715,16 +715,20 @@ public class BasicStream
public void
startSize()
{
- _sizePos = _buf.b.position();
+ if(_sizeStack == null)
+ {
+ _sizeStack = new java.util.ArrayDeque<Integer>();
+ }
+ _sizeStack.push(_buf.b.position());
writeInt(0); // Placeholder for 32-bit size
}
public void
endSize()
{
- assert(_sizePos >= 0);
- rewriteInt(_buf.b.position() - _sizePos - 4, _sizePos);
- _sizePos = -1;
+ assert(!_sizeStack.isEmpty());
+ int sizePos = _sizeStack.pop();
+ rewriteInt(_buf.b.position() - sizePos - 4, sizePos);
}
public void
@@ -2779,6 +2783,7 @@ public class BasicStream
private Object _closure;
private byte[] _stringBytes; // Reusable array for reading strings.
private char[] _stringChars; // Reusable array for reading strings.
+ private java.util.Deque<Integer> _sizeStack;
private enum SliceType { NoSlice, ObjectSlice, ExceptionSlice }
@@ -4618,8 +4623,6 @@ public class BasicStream
private int _startSeq;
private int _minSeqSize;
- private int _sizePos;
-
private static final int OPTIONAL_END_MARKER = 0xFF;
private static final byte FLAG_HAS_TYPE_ID_STRING = (byte)(1<<0);