Skip to content

Commit 8ce520f

Browse files
committed
make CharsetEncoder access threadsafe where necessary
1 parent 2a5e84c commit 8ce520f

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyUnicodeWrappers.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import com.oracle.graal.python.builtins.objects.str.StringNodes.StringMaterializeNode;
6565
import com.oracle.graal.python.runtime.GilNode;
6666
import com.oracle.truffle.api.CompilerDirectives;
67-
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
6867
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6968
import com.oracle.truffle.api.dsl.Cached;
7069
import com.oracle.truffle.api.dsl.Cached.Exclusive;
@@ -191,7 +190,7 @@ Object readMember(String member,
191190
*/
192191
@ExportLibrary(InteropLibrary.class)
193192
public static class PyUnicodeState extends PyUnicodeWrapper {
194-
@CompilationFinal private CharsetEncoder asciiEncoder;
193+
private volatile CharsetEncoder asciiEncoder;
195194

196195
public PyUnicodeState(PString delegate) {
197196
super(delegate);
@@ -280,6 +279,7 @@ private static CharsetEncoder newAsciiEncoder() {
280279

281280
@TruffleBoundary
282281
private static boolean doCheck(String value, CharsetEncoder asciiEncoder) {
282+
asciiEncoder.reset();
283283
return asciiEncoder.canEncode(value);
284284
}
285285

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CExtContext.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public final DynamicObject getSymbolCache() {
171171
*/
172172
@ValueType
173173
public static final class ModuleSpec {
174-
private static CharsetEncoder asciiEncoder;
174+
private volatile CharsetEncoder asciiEncoder;
175175

176176
public final String name;
177177
public final String path;
@@ -185,7 +185,7 @@ public ModuleSpec(String name, String path, Object originalModuleSpec) {
185185
this.originalModuleSpec = originalModuleSpec;
186186
}
187187

188-
private static CharsetEncoder ensureASCIIEncoder() {
188+
private CharsetEncoder ensureASCIIEncoder() {
189189
if (asciiEncoder == null) {
190190
asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
191191
}
@@ -206,7 +206,9 @@ public String getEncodedName() {
206206
// Get the short name (substring after last dot)
207207
String basename = name.substring(name.lastIndexOf('.') + 1);
208208

209-
if (ensureASCIIEncoder().canEncode(basename)) {
209+
boolean canEncode = canEncode(basename);
210+
211+
if (canEncode) {
210212
ascii = true;
211213
} else {
212214
ascii = false;
@@ -221,6 +223,13 @@ public String getEncodedName() {
221223
return (encodedName = basename.replace('-', '_'));
222224
}
223225

226+
@TruffleBoundary
227+
private boolean canEncode(String basename) {
228+
CharsetEncoder encoder = ensureASCIIEncoder();
229+
encoder.reset();
230+
return encoder.canEncode(basename);
231+
}
232+
224233
@TruffleBoundary
225234
public String getInitFunctionName(boolean hpy) {
226235
/*

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1917,18 +1917,23 @@ Object doGeneric(VirtualFrame frame, Object self, Object right,
19171917
@Builtin(name = "isascii", minNumOfPositionalArgs = 1)
19181918
@GenerateNodeFactory
19191919
abstract static class IsAsciiNode extends PythonUnaryBuiltinNode {
1920-
private static final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
1920+
private final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
19211921

19221922
@Specialization
1923-
@TruffleBoundary
19241923
boolean doString(String self) {
1925-
return asciiEncoder.canEncode(self);
1924+
return doStringImpl(self);
19261925
}
19271926

19281927
@Specialization(replaces = "doString")
19291928
boolean doGeneric(Object self,
19301929
@Cached CastToJavaStringCheckedNode castSelfNode) {
1931-
return doString(castSelfNode.cast(self, ErrorMessages.REQUIRES_STR_OBJECT_BUT_RECEIVED_P, "isascii", self));
1930+
return doStringImpl(castSelfNode.cast(self, ErrorMessages.REQUIRES_STR_OBJECT_BUT_RECEIVED_P, "isascii", self));
1931+
}
1932+
1933+
@TruffleBoundary
1934+
private synchronized boolean doStringImpl(String self) {
1935+
asciiEncoder.reset();
1936+
return asciiEncoder.canEncode(self);
19321937
}
19331938
}
19341939

0 commit comments

Comments
 (0)