From: Michael Ow Date: Mon, 27 Jun 2011 18:06:05 +0000 (+0000) Subject: ICU-8612 Remove exception usage in normal code path of CharsetASCII and Charset88591 X-Git-Tag: milestone-59-0-1~4714 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a2b657a9a337751087ad7d940d37d5cc0a06cc85;p=icu ICU-8612 Remove exception usage in normal code path of CharsetASCII and Charset88591 X-SVN-Rev: 30238 --- diff --git a/icu4j/main/classes/charset/src/com/ibm/icu/charset/Charset88591.java b/icu4j/main/classes/charset/src/com/ibm/icu/charset/Charset88591.java index a74a1f75e73..761fd103da4 100644 --- a/icu4j/main/classes/charset/src/com/ibm/icu/charset/Charset88591.java +++ b/icu4j/main/classes/charset/src/com/ibm/icu/charset/Charset88591.java @@ -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; } } diff --git a/icu4j/main/classes/charset/src/com/ibm/icu/charset/CharsetASCII.java b/icu4j/main/classes/charset/src/com/ibm/icu/charset/CharsetASCII.java index 419a4601aeb..8bfc291bfe4 100644 --- a/icu4j/main/classes/charset/src/com/ibm/icu/charset/CharsetASCII.java +++ b/icu4j/main/classes/charset/src/com/ibm/icu/charset/CharsetASCII.java @@ -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) {