Skip to content

Commit 875e449

Browse files
committed
Synchronize lazy loading charsets
1 parent 76e4190 commit 875e449

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/util/CharsetMapping.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
import java.util.HashMap;
4747
import java.util.Locale;
4848
import java.util.Map;
49+
import java.util.concurrent.ConcurrentHashMap;
50+
import java.util.concurrent.ConcurrentMap;
4951

5052
import com.ibm.icu.charset.CharsetICU;
5153
import com.oracle.graal.python.charset.PythonRawUnicodeEscapeCharset;
@@ -56,7 +58,8 @@
5658
* Utility class for mapping Python encodings to Java charsets
5759
*/
5860
public class CharsetMapping {
59-
private static final Map<String, Charset> JAVA_CHARSETS = new HashMap<>();
61+
private static final ConcurrentMap<String, Charset> JAVA_CHARSETS = new ConcurrentHashMap<>();
62+
// Name maps are populated by static initializer and are immutable afterwards
6063
private static final Map<String, String> CHARSET_NAME_MAP = new HashMap<>();
6164
private static final Map<String, String> CHARSET_NAME_MAP_REVERSE = new HashMap<>();
6265

@@ -80,26 +83,23 @@ public static String normalize(String encoding) {
8083
}
8184

8285
private static Charset getJavaCharset(String name) {
83-
Charset charset = JAVA_CHARSETS.get(name);
84-
if (charset == null) {
86+
return JAVA_CHARSETS.computeIfAbsent(name, key -> {
8587
// Important: When adding additional ICU4J charset, the implementation class needs to be
8688
// added to reflect-config.json
8789
if (name.equals("UTF-7") || name.equals("HZ")) {
8890
try {
89-
charset = CharsetICU.forNameICU(name);
91+
return CharsetICU.forNameICU(name);
9092
} catch (UnsupportedCharsetException e) {
91-
// Let it stay null
93+
return null;
9294
}
9395
} else {
9496
try {
95-
charset = Charset.forName(name);
97+
return Charset.forName(name);
9698
} catch (UnsupportedCharsetException e) {
97-
// Let it stay null
99+
return null;
98100
}
99101
}
100-
JAVA_CHARSETS.put(name, charset);
101-
}
102-
return charset;
102+
});
103103
}
104104

105105
private static void addMapping(String pythonName, String javaName) {

0 commit comments

Comments
 (0)