Skip to content

Commit ce94a52

Browse files
committed
make PyUnicodeDecode and PyUnicodeFromEncodedObject available uncached
1 parent 6b13437 commit ce94a52

File tree

3 files changed

+50
-40
lines changed

3 files changed

+50
-40
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeDecode.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,45 +40,45 @@
4040
*/
4141
package com.oracle.graal.python.lib;
4242

43-
import static com.oracle.graal.python.lib.PyUnicodeAsEncodedString.ENC_UTF8;
43+
import static com.oracle.graal.python.nodes.BuiltinNames._CODECS;
4444
import static com.oracle.graal.python.nodes.ErrorMessages.DECODER_S_RETURNED_P_INSTEAD_OF_STR;
45+
import static com.oracle.graal.python.nodes.SpecialMethodNames.DECODE;
4546
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
4647

4748
import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins;
48-
import com.oracle.graal.python.builtins.objects.PNone;
4949
import com.oracle.graal.python.nodes.PGuards;
50-
import com.oracle.graal.python.nodes.PNodeWithRaise;
50+
import com.oracle.graal.python.nodes.PNodeWithContext;
51+
import com.oracle.graal.python.nodes.PRaiseNode;
52+
import com.oracle.graal.python.runtime.PythonContext;
5153
import com.oracle.truffle.api.dsl.Cached;
54+
import com.oracle.truffle.api.dsl.GenerateUncached;
5255
import com.oracle.truffle.api.dsl.ImportStatic;
5356
import com.oracle.truffle.api.dsl.Specialization;
57+
import com.oracle.truffle.api.frame.Frame;
5458
import com.oracle.truffle.api.frame.VirtualFrame;
5559

5660
/**
5761
* Equivalent of CPython's {@code PyUnicode_Decode}.
5862
*/
5963
@ImportStatic(PyUnicodeAsEncodedString.class)
60-
public abstract class PyUnicodeDecode extends PNodeWithRaise {
61-
public abstract Object execute(VirtualFrame frame, Object object, Object encoding, Object errors);
64+
@GenerateUncached
65+
public abstract class PyUnicodeDecode extends PNodeWithContext {
66+
public abstract Object execute(Frame frame, Object object, Object encoding, Object errors);
6267

63-
@Specialization(guards = "isCommon(encoding)")
64-
Object doCommon(VirtualFrame frame, Object object, String encoding, String errors,
65-
@Cached CodecsModuleBuiltins.CodecsDecodeNode decodeNode) {
66-
return decodeNode.execute(frame, object, encoding, errors, false);
67-
}
68-
69-
@Specialization(guards = "!isCommon(encoding)")
70-
Object doRegistry(VirtualFrame frame, Object object, String encoding, String errors,
71-
@Cached CodecsModuleBuiltins.DecodeNode decodeNode) {
68+
@Specialization(guards = "frame != null")
69+
Object doFast(VirtualFrame frame, Object object, Object encoding, Object errors,
70+
@Cached CodecsModuleBuiltins.DecodeNode decodeNode,
71+
@Cached PRaiseNode raiseNode) {
7272
final Object unicode = decodeNode.execute(frame, object, encoding, errors);
7373
if (!PGuards.isString(unicode)) {
74-
throw raise(TypeError, DECODER_S_RETURNED_P_INSTEAD_OF_STR, encoding, unicode);
74+
throw raiseNode.raise(TypeError, DECODER_S_RETURNED_P_INSTEAD_OF_STR, encoding, unicode);
7575
}
7676
return unicode;
7777
}
7878

79-
@Specialization(guards = "isNoValue(encoding)")
80-
Object doNoEncoding(VirtualFrame frame, Object object, @SuppressWarnings("unused") PNone encoding, Object errors,
81-
@Cached CodecsModuleBuiltins.CodecsDecodeNode decodeNode) {
82-
return decodeNode.execute(frame, object, ENC_UTF8, errors, false);
79+
@Specialization(replaces = "doFast")
80+
Object doWithCall(Object object, Object encoding, Object errors,
81+
@Cached PyObjectCallMethodObjArgs callNode) {
82+
return callNode.execute(null, PythonContext.get(this).getCore().lookupBuiltinModule(_CODECS), DECODE, object, encoding, errors);
8383
}
8484
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeFromEncodedObject.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,25 @@
4747
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
4848
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
4949
import com.oracle.graal.python.builtins.objects.str.PString;
50-
import com.oracle.graal.python.nodes.PNodeWithRaiseAndIndirectCall;
50+
import com.oracle.graal.python.nodes.PNodeWithIndirectCall;
51+
import com.oracle.graal.python.nodes.PRaiseNode;
5152
import com.oracle.graal.python.util.PythonUtils;
53+
import com.oracle.truffle.api.Truffle;
5254
import com.oracle.truffle.api.dsl.Cached;
55+
import com.oracle.truffle.api.dsl.Cached.Shared;
56+
import com.oracle.truffle.api.dsl.GenerateUncached;
5357
import com.oracle.truffle.api.dsl.Specialization;
58+
import com.oracle.truffle.api.frame.Frame;
5459
import com.oracle.truffle.api.frame.VirtualFrame;
5560
import com.oracle.truffle.api.library.CachedLibrary;
5661
import com.oracle.truffle.api.profiles.ConditionProfile;
5762

5863
/**
5964
* Equivalent of CPython's {@code PyUnicode_FromEncodedObject}.
6065
*/
61-
public abstract class PyUnicodeFromEncodedObject extends PNodeWithRaiseAndIndirectCall {
62-
public abstract Object execute(VirtualFrame frame, Object object, Object encoding, Object errors);
66+
@GenerateUncached
67+
public abstract class PyUnicodeFromEncodedObject extends PNodeWithIndirectCall {
68+
public abstract Object execute(Frame frame, Object object, Object encoding, Object errors);
6369

6470
@Specialization
6571
Object doBytes(VirtualFrame frame, PBytes object, Object encoding, Object errors,
@@ -75,14 +81,16 @@ Object doBytes(VirtualFrame frame, PBytes object, Object encoding, Object errors
7581

7682
@Specialization
7783
@SuppressWarnings("unused")
78-
Object doString(VirtualFrame frame, String object, Object encoding, Object errors) {
79-
throw raise(PythonBuiltinClassType.TypeError, DECODING_STR_NOT_SUPPORTED);
84+
Object doString(VirtualFrame frame, String object, Object encoding, Object errors,
85+
@Shared("raiseNode") @Cached PRaiseNode raiseNode) {
86+
throw raiseNode.raise(PythonBuiltinClassType.TypeError, DECODING_STR_NOT_SUPPORTED);
8087
}
8188

8289
@Specialization
8390
@SuppressWarnings("unused")
84-
Object doPString(VirtualFrame frame, PString object, Object encoding, Object errors) {
85-
throw raise(PythonBuiltinClassType.TypeError, DECODING_STR_NOT_SUPPORTED);
91+
Object doPString(VirtualFrame frame, PString object, Object encoding, Object errors,
92+
@Shared("raiseNode") @Cached PRaiseNode raiseNode) {
93+
throw raiseNode.raise(PythonBuiltinClassType.TypeError, DECODING_STR_NOT_SUPPORTED);
8694
}
8795

8896
@Specialization(guards = {"!isPBytes(object)", "!isString(object)"}, limit = "3")
@@ -101,4 +109,8 @@ Object doBuffer(VirtualFrame frame, Object object, Object encoding, Object error
101109
bufferLib.release(object, frame, this);
102110
}
103111
}
112+
113+
public static PyUnicodeFromEncodedObject create() {
114+
return PyUnicodeFromEncodedObjectNodeGen.create(Truffle.getRuntime().createAssumption(), Truffle.getRuntime().createAssumption());
115+
}
104116
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PNodeWithIndirectCall.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,30 +41,28 @@
4141
package com.oracle.graal.python.nodes;
4242

4343
import com.oracle.truffle.api.Assumption;
44-
import com.oracle.truffle.api.CompilerDirectives;
45-
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
46-
import com.oracle.truffle.api.Truffle;
44+
import com.oracle.truffle.api.dsl.NodeField;
45+
import com.oracle.truffle.api.dsl.NodeFields;
4746

48-
public class PNodeWithIndirectCall extends PNodeWithContext implements IndirectCallNode {
47+
@NodeFields({@NodeField(name = "dontNeedExceptionState", type = Assumption.class), @NodeField(name = "dontNeedFrame", type = Assumption.class)})
48+
public abstract class PNodeWithIndirectCall extends PNodeWithContext implements IndirectCallNode {
49+
protected abstract Assumption getDontNeedExceptionState();
4950

50-
@CompilationFinal private Assumption nativeCodeDoesntNeedExceptionState;
51-
@CompilationFinal private Assumption nativeCodeDoesntNeedMyFrame;
51+
protected abstract Assumption getDontNeedFrame();
5252

5353
@Override
5454
public final Assumption needNotPassFrameAssumption() {
55-
if (nativeCodeDoesntNeedMyFrame == null) {
56-
CompilerDirectives.transferToInterpreterAndInvalidate();
57-
nativeCodeDoesntNeedMyFrame = Truffle.getRuntime().createAssumption();
55+
if (isAdoptable()) {
56+
return getDontNeedFrame();
5857
}
59-
return nativeCodeDoesntNeedMyFrame;
58+
return Assumption.NEVER_VALID;
6059
}
6160

6261
@Override
6362
public final Assumption needNotPassExceptionAssumption() {
64-
if (nativeCodeDoesntNeedExceptionState == null) {
65-
CompilerDirectives.transferToInterpreterAndInvalidate();
66-
nativeCodeDoesntNeedExceptionState = Truffle.getRuntime().createAssumption();
63+
if (isAdoptable()) {
64+
return getDontNeedExceptionState();
6765
}
68-
return nativeCodeDoesntNeedExceptionState;
66+
return Assumption.NEVER_VALID;
6967
}
7068
}

0 commit comments

Comments
 (0)