7474import com .oracle .graal .python .builtins .objects .cext .capi .CApiGuards ;
7575import com .oracle .graal .python .builtins .objects .cext .capi .CExtNodes ;
7676import com .oracle .graal .python .builtins .objects .cext .capi .CExtNodes .AsPythonObjectNode ;
77+ import com .oracle .graal .python .builtins .objects .cext .capi .CExtNodes .ToSulongNode ;
7778import com .oracle .graal .python .builtins .objects .cext .capi .NativeMember ;
7879import com .oracle .graal .python .builtins .objects .cext .capi .PySequenceArrayWrapper ;
7980import com .oracle .graal .python .builtins .objects .cext .capi .PythonNativeWrapper ;
8687import com .oracle .graal .python .builtins .objects .str .PString ;
8788import com .oracle .graal .python .builtins .objects .str .StringBuiltins .EncodeNode ;
8889import com .oracle .graal .python .builtins .objects .str .StringBuiltins .ModNode ;
90+ import com .oracle .graal .python .lib .PyBytesCheckNode ;
8991import com .oracle .graal .python .lib .PyNumberAsSizeNode ;
9092import com .oracle .graal .python .lib .PyObjectLookupAttr ;
9193import com .oracle .graal .python .lib .PyObjectSizeNode ;
101103import com .oracle .graal .python .runtime .sequence .storage .SequenceStorage ;
102104import com .oracle .graal .python .util .OverflowException ;
103105import com .oracle .truffle .api .CompilerDirectives ;
106+ import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
104107import com .oracle .truffle .api .dsl .Bind ;
105108import com .oracle .truffle .api .dsl .Cached ;
106109import 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