Skip to content

Commit 744f243

Browse files
eregontimfel
authored andcommitted
Catch errors related to Charset lookup closer to the lookup and use more specific error classes
1 parent 20a5436 commit 744f243

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@
5050
import java.nio.charset.CharacterCodingException;
5151
import java.nio.charset.Charset;
5252
import java.nio.charset.CodingErrorAction;
53+
import java.nio.charset.IllegalCharsetNameException;
5354
import java.nio.charset.StandardCharsets;
55+
import java.nio.charset.UnsupportedCharsetException;
5456
import java.util.Arrays;
5557
import java.util.HashMap;
5658
import java.util.List;
@@ -411,15 +413,18 @@ Object encode(Object str, @SuppressWarnings("unused") Object encoding, @Suppress
411413
@TruffleBoundary
412414
private PBytes encodeString(String self, String encoding, String errors) {
413415
CodingErrorAction errorAction = convertCodingErrorAction(errors);
416+
Charset charset;
417+
try {
418+
charset = getCharset(encoding);
419+
} catch (UnsupportedCharsetException | IllegalCharsetNameException e) {
420+
throw raise(LookupError, "unknown encoding: %s", encoding);
421+
}
414422
try {
415-
Charset charset = getCharset(encoding);
416423
ByteBuffer encoded = charset.newEncoder().onMalformedInput(errorAction).onUnmappableCharacter(errorAction).encode(CharBuffer.wrap(self));
417424
int n = encoded.remaining();
418425
byte[] data = new byte[n];
419426
encoded.get(data);
420427
return factory().createBytes(data);
421-
} catch (IllegalArgumentException e) {
422-
throw raise(LookupError, "unknown encoding: %s", encoding);
423428
} catch (CharacterCodingException e) {
424429
throw raise(UnicodeEncodeError, e);
425430
}
@@ -541,12 +546,15 @@ private ByteBuffer getBytesBuffer(PIBytesLike bytesLike) {
541546
@TruffleBoundary
542547
String decodeBytes(ByteBuffer bytes, String encoding, String errors) {
543548
CodingErrorAction errorAction = convertCodingErrorAction(errors);
549+
Charset charset;
550+
try {
551+
charset = getCharset(encoding);
552+
} catch (UnsupportedCharsetException | IllegalCharsetNameException e) {
553+
throw raise(LookupError, "unknown encoding: %s", encoding);
554+
}
544555
try {
545-
Charset charset = getCharset(encoding);
546556
CharBuffer decoded = charset.newDecoder().onMalformedInput(errorAction).onUnmappableCharacter(errorAction).decode(bytes);
547557
return String.valueOf(decoded);
548-
} catch (IllegalArgumentException e) {
549-
throw raise(LookupError, "unknown encoding: %s", encoding);
550558
} catch (CharacterCodingException e) {
551559
throw raise(UnicodeDecodeError, e);
552560
}
@@ -623,7 +631,7 @@ Object lookup(String encoding) {
623631
try {
624632
getCharset(encoding);
625633
return true;
626-
} catch (IllegalArgumentException e) {
634+
} catch (UnsupportedCharsetException | IllegalCharsetNameException e) {
627635
return PNone.NONE;
628636
}
629637
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
import java.nio.charset.CharacterCodingException;
5656
import java.nio.charset.Charset;
5757
import java.nio.charset.CodingErrorAction;
58+
import java.nio.charset.IllegalCharsetNameException;
59+
import java.nio.charset.UnsupportedCharsetException;
5860
import java.util.Arrays;
5961
import java.util.List;
6062

@@ -1493,15 +1495,18 @@ private Object encodeString(String self, String encoding, String errors) {
14931495
break;
14941496
}
14951497

1498+
Charset cs;
1499+
try {
1500+
cs = Charset.forName(encoding);
1501+
} catch (UnsupportedCharsetException | IllegalCharsetNameException e) {
1502+
throw raise(LookupError, "unknown encoding: %s", encoding);
1503+
}
14961504
try {
1497-
Charset cs = Charset.forName(encoding);
14981505
ByteBuffer encoded = cs.newEncoder().onMalformedInput(errorAction).onUnmappableCharacter(errorAction).encode(CharBuffer.wrap(self));
14991506
int n = encoded.remaining();
15001507
byte[] data = new byte[n];
15011508
encoded.get(data);
15021509
return factory().createBytes(data);
1503-
} catch (IllegalArgumentException e) {
1504-
throw raise(LookupError, "unknown encoding: %s", encoding);
15051510
} catch (CharacterCodingException e) {
15061511
throw raise(UnicodeEncodeError, e);
15071512
}

0 commit comments

Comments
 (0)