]> granicus.if.org Git - icu/commitdiff
ICU-8612 Remove exception usage in normal code path of CharsetASCII and Charset88591
authorMichael Ow <mow@svn.icu-project.org>
Mon, 27 Jun 2011 18:06:05 +0000 (18:06 +0000)
committerMichael Ow <mow@svn.icu-project.org>
Mon, 27 Jun 2011 18:06:05 +0000 (18:06 +0000)
X-SVN-Rev: 30238

icu4j/main/classes/charset/src/com/ibm/icu/charset/Charset88591.java
icu4j/main/classes/charset/src/com/ibm/icu/charset/CharsetASCII.java

index a74a1f75e73971b0fd26ecc0d2e7acf9c80520f8..761fd103da4861b3cffdb5d30791c0f1d6392ee5 100644 (file)
@@ -1,14 +1,12 @@
 /**
  *******************************************************************************
- * Copyright (C) 2006-2008, International Business Machines Corporation and    *
+ * Copyright (C) 2006-2011, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  */
 
 package com.ibm.icu.charset;
 
-import java.nio.BufferOverflowException;
-import java.nio.BufferUnderflowException;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.CharsetDecoder;
@@ -40,15 +38,22 @@ class Charset88591 extends CharsetASCII {
             return null;
         }
 
-        protected CoderResult decodeLoopCoreUnoptimized(ByteBuffer source, CharBuffer target)
-                throws BufferUnderflowException, BufferOverflowException {
-
+        protected CoderResult decodeLoopCoreUnoptimized(ByteBuffer source, CharBuffer target) {
+            byte ch;
             /*
              * perform 88591 conversion from the source buffer to the target buffer. no range check
-             * is necessary (an exception will be generated to end the loop).
+             * is necessary.
              */
-            while (true)
-                target.put((char) (source.get() & 0xff));
+            while (source.hasRemaining()) {
+                ch = source.get();
+                if (target.hasRemaining()) {
+                    target.put((char) (ch & 0xff));
+                } else {
+                    return CoderResult.OVERFLOW;
+                }
+            }
+            
+            return CoderResult.UNDERFLOW;
         }
     }
 
@@ -88,8 +93,7 @@ class Charset88591 extends CharsetASCII {
                 return null;
         }
 
-        protected final CoderResult encodeLoopCoreUnoptimized(CharBuffer source, ByteBuffer target,
-                boolean flush) throws BufferUnderflowException, BufferOverflowException {
+        protected final CoderResult encodeLoopCoreUnoptimized(CharBuffer source, ByteBuffer target, boolean flush) {
             int ch;
 
             /*
@@ -97,19 +101,24 @@ class Charset88591 extends CharsetASCII {
              * each char in the source is within the correct range
              */
             
-            while (true) {
+            while (source.hasRemaining()) {
                 ch = (int) source.get();
                 if ((ch & 0xff00) == 0) {
-                    target.put((byte) ch);
+                    if (target.hasRemaining()) {
+                        target.put((byte) ch);
+                    } else {
+                        return CoderResult.OVERFLOW;
+                    }
                 } else {
-                    break;
+                    /*
+                     * if we reach here, it's because a character was not in the correct range, and we need
+                     * to deal with this by calling encodeMalformedOrUnmappable.
+                     */
+                    return encodeMalformedOrUnmappable(source, ch, flush);
                 }
             }
-            /*
-             * if we reach here, it's because a character was not in the correct range, and we need
-             * to deak with this by calling encodeMalformedOrUnmappable.
-             */
-            return encodeMalformedOrUnmappable(source, ch, flush);
+            
+            return CoderResult.UNDERFLOW;
         }
 
     }
index 419a4601aeba1646051c9f68480bc86408fcc5b6..8bfc291bfe43a20b2a61320d9f7bfeed0b61950a 100644 (file)
@@ -1,6 +1,6 @@
 /**
  *******************************************************************************
- * Copyright (C) 2006-2008, International Business Machines Corporation and    *
+ * Copyright (C) 2006-2011, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  *
@@ -8,8 +8,6 @@
  */
 package com.ibm.icu.charset;
 
-import java.nio.BufferOverflowException;
-import java.nio.BufferUnderflowException;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.IntBuffer;
@@ -90,21 +88,10 @@ class CharsetASCII extends CharsetICU {
                 }
             } else {
                 /* unoptimized loop */
-
-                try {
-                    /*
-                     * perform the core loop... if it throws an exception, it must be due to an
-                     * overflow or underflow
-                     */
-                    cr = decodeLoopCoreUnoptimized(source, target);
-
-                } catch (BufferUnderflowException ex) {
-                    /* all of the source has been read */
-                    cr = CoderResult.UNDERFLOW;
-                } catch (BufferOverflowException ex) {
+                cr = decodeLoopCoreUnoptimized(source, target);
+                if (cr == CoderResult.OVERFLOW) {
                     /* the target is full */
                     source.position(source.position() - 1); /* rewind by 1 */
-                    cr = CoderResult.OVERFLOW;
                 }
             }
 
@@ -142,22 +129,32 @@ class CharsetASCII extends CharsetICU {
                 return null;
         }
 
-        protected CoderResult decodeLoopCoreUnoptimized(ByteBuffer source, CharBuffer target)
-                throws BufferUnderflowException, BufferOverflowException {
+        protected CoderResult decodeLoopCoreUnoptimized(ByteBuffer source, CharBuffer target) {
             int ch = 0;
 
             /*
              * perform ascii conversion from the source buffer to the target buffer, making sure
              * each byte in the source is within the correct range
              */
-            while (((ch = (source.get() & 0xff)) & 0x80) == 0)
-                target.put((char) ch);
-
-            /*
-             * if we reach here, it's because a character was not in the correct range, and we need
-             * to deak with this by calling decodeMalformedOrUnmappable
-             */
-            return decodeMalformedOrUnmappable(ch);
+            while (source.hasRemaining()) {
+                ch = source.get() & 0xff;
+                
+                if ((ch & 0x80) == 0) {
+                    if (target.hasRemaining()) {
+                        target.put((char)ch);
+                    } else {
+                        return CoderResult.OVERFLOW;
+                    }
+                } else {
+                    /*
+                     * if we reach here, it's because a character was not in the correct range, and we need
+                     * to deak with this by calling decodeMalformedOrUnmappable
+                     */
+                    return decodeMalformedOrUnmappable(ch);
+                }
+            }
+            
+            return CoderResult.UNDERFLOW;
         }
 
         protected CoderResult decodeMalformedOrUnmappable(int ch) {
@@ -247,19 +244,11 @@ class CharsetASCII extends CharsetICU {
                     }
                 } else {
                     /* unoptimized loop */
-
-                    try {
-                        /*
-                         * perform the core loop... if it throws an exception, it must be due to an
-                         * overflow or underflow
-                         */
-                        cr = encodeLoopCoreUnoptimized(source, target, flush);
-
-                    } catch (BufferUnderflowException ex) {
-                        cr = CoderResult.UNDERFLOW;
-                    } catch (BufferOverflowException ex) {
+                    
+                    cr = encodeLoopCoreUnoptimized(source, target, flush);
+                    
+                    if (cr == CoderResult.OVERFLOW) {
                         source.position(source.position() - 1); /* rewind by 1 */
-                        cr = CoderResult.OVERFLOW;
                     }
                 }
             }
@@ -299,22 +288,32 @@ class CharsetASCII extends CharsetICU {
                 return null;
         }
 
-        protected CoderResult encodeLoopCoreUnoptimized(CharBuffer source, ByteBuffer target,
-                boolean flush) throws BufferUnderflowException, BufferOverflowException {
+        protected CoderResult encodeLoopCoreUnoptimized(CharBuffer source, ByteBuffer target, boolean flush) {
             int ch;
-
+            
             /*
              * perform ascii conversion from the source buffer to the target buffer, making sure
              * each char in the source is within the correct range
              */
-            while (((ch = (int) source.get()) & 0xff80) == 0)
-                target.put((byte) ch);
-
-            /*
-             * if we reach here, it's because a character was not in the correct range, and we need
-             * to deak with this by calling encodeMalformedOrUnmappable.
-             */
-            return encodeMalformedOrUnmappable(source, ch, flush);
+            while (source.hasRemaining()) {
+                ch = (int) source.get();
+                
+                if ((ch & 0xff80) == 0) {
+                    if (target.hasRemaining()) {
+                        target.put((byte) ch);
+                    } else {
+                        return CoderResult.OVERFLOW;
+                    }
+                } else {
+                    /*
+                     * if we reach here, it's because a character was not in the correct range, and we need
+                     * to deak with this by calling encodeMalformedOrUnmappable.
+                     */
+                    return encodeMalformedOrUnmappable(source, ch, flush);
+                }
+            }
+            
+            return CoderResult.UNDERFLOW;
         }
 
         protected final CoderResult encodeMalformedOrUnmappable(CharBuffer source, int ch, boolean flush) {