<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
John Platts wrote:
<blockquote cite="mid:SNT116-W62BBA27A3F8D564C2C21F29D380@phx.gbl"
 type="cite">
  <style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>Here
is the current implementation of slice in java.nio.StringCharBuffer (as
found in OpenJDK 7):<br>
  <font style="" face="Courier New">44     public CharBuffer slice() {</font><font
 style="" face="Courier New"><br>
  </font><font style="" face="Courier New">45         return new
StringCharBuffer(str,</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">46                                    
-1,</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">47                                    
0,</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">48                                    
this.remaining(),</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">49                                    
this.remaining(),</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">50                                    
this.position());</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">51     }</font><br>
  <br>
Here is the implementation of slice used for heap-based byte buffers,
which is found in java/nio/Heap-X-Buffer.java.template:<br>
  <font style="" face="Courier New"> 97     public $Type$Buffer slice()
{</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New"> 98         return new
Heap$Type$Buffer$RW$(hb,</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New"> 99                                        
-1,</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">100                                        
0,</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">101                                        
this.remaining(),</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">102                                        
this.remaining(),</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">103                                        
this.position() + offset);</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">104     }</font><br>
  <br>
It appears that the slice() method fails to return the correct region
of the string for CharBuffer objects that wrap a string whenever offset
is non-zero. Here is the corrected code, with the correction in red:<br>
  <font style="" face="Courier New">44     public CharBuffer slice() {</font><font
 style="" face="Courier New"><br>
  </font><font style="" face="Courier New">45         return new
StringCharBuffer(str,</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">46                                    
-1,</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">47                                    
0,</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">48                                    
this.remaining(),</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">49                                    
this.remaining(),</font><font style="" face="Courier New"><br>
  </font><font style="" face="Courier New">50                                    
  <font style="" color="#ff0000">offset + this.position()</font>);</font><font
 style="" face="Courier New"><br>
  </font><font style="" face="Courier New">51     }<br>
  <font style="" face="Tahoma"><br>
  </font><font style="" face="Tahoma">Is this bug limited to OpenJDK 7,
or is this bug found in OpenJDK 6, JDK 6, JDK 5, and JDK 1.4? This bug
might be affecting code that uses CharBuffers.</font><br>
  </font> </blockquote>
Thanks for the bug report. I've created a bug to track it:<br>
7000913: (bf) CharBuffer.wrap, slice, position, slice leads to
CharBuffer with incorrect offset<br>
<br>
I'm kinda surprised this hasn't been noticed before but it may be that
it's rare to slice a buffer that itself was created by slicing a
wrapped char sequence. It does highlight a hole in our tests so part of
fixing this will adding further tests.<br>
<br>
So are you contributing the fix to this? I see a John Platts on the SCA
list but I'm not sure if that is you.<br>
<br>
As regards versions, then it is likely to exist in all versions. <br>
<br>
-Alan<br>
</body>
</html>