96 lines
3.1 KiB
Diff
96 lines
3.1 KiB
Diff
# read_boolean() now only adjusts positions if the chunk_end_pos == pos, no longer calling
|
|
# handle_chunking(). The problem with handle_chunking() is that it aligns the current position
|
|
# and this can cause CDRInputStream to "skip" valid boolean values, as those are not padded.
|
|
|
|
--- src/org/jacorb/orb/CDRInputStream.java 2009-05-03 18:35:54.000000000 -0300
|
|
+++ src/org/jacorb/orb/CDRInputStream.java 2009-07-27 21:43:13.654728303 -0300
|
|
@@ -460,51 +460,52 @@
|
|
|
|
private final void handle_chunking()
|
|
{
|
|
- int remainder = 4 - (index % 4);
|
|
- int aligned_pos = (remainder != 4) ? pos + remainder : pos;
|
|
+ int remainder = 4 - (this.index % 4);
|
|
+ int aligned_pos = (remainder != 4) ? this.pos + remainder : this.pos;
|
|
|
|
- if (chunk_end_pos >= pos && chunk_end_pos <= aligned_pos)
|
|
+ if (this.chunk_end_pos >= pos && this.chunk_end_pos <= aligned_pos)
|
|
{
|
|
- chunk_end_pos = -1;
|
|
- int saved_pos = pos;
|
|
- int saved_index = index;
|
|
- int tag = read_long();
|
|
+ this.adjust_positions();
|
|
+ }
|
|
+ }
|
|
|
|
- if (tag < 0) {
|
|
+ private final void adjust_positions()
|
|
+ {
|
|
+ this.chunk_end_pos = -1;
|
|
+ int saved_pos = this.pos;
|
|
+ int saved_index = this.index;
|
|
+ int tag = this.read_long();
|
|
|
|
+ if (tag < 0)
|
|
+ {
|
|
// tag is an end tag
|
|
-
|
|
- if (-tag > valueNestingLevel)
|
|
+ if (-tag > this.valueNestingLevel)
|
|
{
|
|
throw new INTERNAL
|
|
(
|
|
"received end tag " + tag +
|
|
" with value nesting level " +
|
|
- valueNestingLevel
|
|
+ this.valueNestingLevel
|
|
);
|
|
}
|
|
- valueNestingLevel = -tag;
|
|
- valueNestingLevel--;
|
|
-
|
|
- if (valueNestingLevel > 0)
|
|
+ this.valueNestingLevel = -tag;
|
|
+ this.valueNestingLevel--;
|
|
+ if (this.valueNestingLevel > 0)
|
|
{
|
|
- chunk_end_pos = pos;
|
|
- handle_chunking();
|
|
+ this.chunk_end_pos = pos;
|
|
+ this.handle_chunking();
|
|
}
|
|
}
|
|
else if (tag > 0 && tag < 0x7fffff00)
|
|
{
|
|
// tag is the chunk size tag of another chunk
|
|
-
|
|
- chunk_end_pos = pos + tag;
|
|
+ this.chunk_end_pos = this.pos + tag;
|
|
}
|
|
else // (tag == 0 || tag >= 0x7fffff00)
|
|
{
|
|
// tag is the null value tag or the value tag of a nested value
|
|
-
|
|
- pos = saved_pos; // "unread" the tag
|
|
- index = saved_index;
|
|
- }
|
|
+ this.pos = saved_pos; // "unread" the tag
|
|
+ this.index = saved_index;
|
|
}
|
|
}
|
|
|
|
@@ -711,7 +712,11 @@
|
|
|
|
public final boolean read_boolean()
|
|
{
|
|
- handle_chunking();
|
|
+ // handle_chunking();
|
|
+ if (this.chunk_end_pos == this.pos)
|
|
+ {
|
|
+ this.adjust_positions();
|
|
+ }
|
|
index++;
|
|
byte value = buffer[pos++];
|
|
|