classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] Patch: FYI: partial patch for PR 23008


From: Tom Tromey
Subject: [cp-patches] Patch: FYI: partial patch for PR 23008
Date: 11 Aug 2005 17:46:34 -0600

I'm checking this in.

This is the obviously correct part of PR classpath/23008.
Namely, we needed some masking to avoid sign extension bugs when
converting UTF-16 characters.

Tom

Index: ChangeLog
from  Tom Tromey  <address@hidden>
        For PR classpath/23008:
        * gnu/java/nio/charset/UTF_16Decoder.java (decodeLoop): Correctly
        mask bytes when constructing characters.

Index: gnu/java/nio/charset/UTF_16Decoder.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/nio/charset/UTF_16Decoder.java,v
retrieving revision 1.5
diff -u -r1.5 UTF_16Decoder.java
--- gnu/java/nio/charset/UTF_16Decoder.java 2 Jul 2005 20:32:13 -0000 1.5
+++ gnu/java/nio/charset/UTF_16Decoder.java 11 Aug 2005 23:48:48 -0000
@@ -1,5 +1,5 @@
 /* UTF_16Decoder.java -- 
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2005 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -105,8 +105,9 @@
               }
 
            // FIXME: Change so you only do a single comparison here.
-            char c = byteOrder == BIG_ENDIAN ? (char) ((b1 << 8) | b2)
-                                             : (char) ((b2 << 8) | b1);
+            char c = (byteOrder == BIG_ENDIAN
+                     ? (char) (((b1 & 0xFF) << 8) | (b2 & 0xFF))
+                     : (char) (((b2 & 0xFF) << 8) | (b1 & 0xFF)));
 
             if (0xD800 <= c && c <= 0xDFFF)
               {
@@ -119,8 +120,9 @@
                   return CoderResult.UNDERFLOW;
                 byte b3 = in.get ();
                 byte b4 = in.get ();
-                char d = byteOrder == BIG_ENDIAN ? (char) ((b3 << 8) | b4)
-                                                 : (char) ((b4 << 8) | b3);
+                char d = (byteOrder == BIG_ENDIAN
+                         ? (char) (((b3 & 0xFF) << 8) | (b4 & 0xFF))
+                         : (char) (((b4 & 0xFF) << 8) | (b3 & 0xFF)));
                 // make sure d is a low surrogate
                 if (d < 0xDC00 || d > 0xDFFF)
                   return CoderResult.malformedForLength (2);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]