Skip to content

Commit f3f031a

Browse files
committed
Support native subclasses in PyBytes_AsString
1 parent f72e3b7 commit f3f031a

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBytesBuiltins.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import com.oracle.graal.python.builtins.objects.cext.capi.CApiGuards;
7575
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
7676
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
77+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToSulongNode;
7778
import com.oracle.graal.python.builtins.objects.cext.capi.NativeMember;
7879
import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper;
7980
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper;
@@ -86,6 +87,7 @@
8687
import com.oracle.graal.python.builtins.objects.str.PString;
8788
import com.oracle.graal.python.builtins.objects.str.StringBuiltins.EncodeNode;
8889
import com.oracle.graal.python.builtins.objects.str.StringBuiltins.ModNode;
90+
import com.oracle.graal.python.lib.PyBytesCheckNode;
8991
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
9092
import com.oracle.graal.python.lib.PyObjectLookupAttr;
9193
import com.oracle.graal.python.lib.PyObjectSizeNode;
@@ -101,6 +103,7 @@
101103
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
102104
import com.oracle.graal.python.util.OverflowException;
103105
import com.oracle.truffle.api.CompilerDirectives;
106+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
104107
import com.oracle.truffle.api.dsl.Bind;
105108
import com.oracle.truffle.api.dsl.Cached;
106109
import com.oracle.truffle.api.dsl.Cached.Exclusive;
@@ -118,14 +121,28 @@ public final class PythonCextBytesBuiltins {
118121
@CApiBuiltin(ret = Py_ssize_t, args = {PyObject}, call = Direct)
119122
public abstract static class PyBytes_Size extends CApiUnaryBuiltinNode {
120123
@Specialization
121-
public static int size(PBytes obj,
124+
static int doPBytes(PBytes obj,
122125
@Cached PyObjectSizeNode sizeNode) {
123126
return sizeNode.execute(null, obj);
124127
}
125128

129+
@Specialization
130+
Object doOther(PythonAbstractNativeObject obj,
131+
@Bind("this") Node inliningTarget,
132+
@Cached InlinedGetClassNode getClassNode,
133+
@Cached IsSubtypeNode isSubtypeNode,
134+
@Cached ToSulongNode toSulongNode,
135+
@Cached CExtNodes.PCallCapiFunction callMemberGetterNode) {
136+
if (PyBytesCheckNode.check(null, obj, inliningTarget, getClassNode, isSubtypeNode)) {
137+
return callMemberGetterNode.call(NativeMember.OB_SIZE.getGetterFunctionName(), toSulongNode.execute(obj));
138+
}
139+
return fallback(obj);
140+
}
141+
126142
@Fallback
127-
public int fallback(Object obj) {
128-
throw raiseFallback(obj, PythonBuiltinClassType.PBytes);
143+
@TruffleBoundary
144+
int fallback(Object obj) {
145+
throw raise(TypeError, ErrorMessages.EXPECTED_BYTES_P_FOUND, obj);
129146
}
130147
}
131148

0 commit comments

Comments
 (0)