74
74
import com .oracle .graal .python .builtins .objects .cext .capi .CApiGuards ;
75
75
import com .oracle .graal .python .builtins .objects .cext .capi .CExtNodes ;
76
76
import com .oracle .graal .python .builtins .objects .cext .capi .CExtNodes .AsPythonObjectNode ;
77
+ import com .oracle .graal .python .builtins .objects .cext .capi .CExtNodes .ToSulongNode ;
77
78
import com .oracle .graal .python .builtins .objects .cext .capi .NativeMember ;
78
79
import com .oracle .graal .python .builtins .objects .cext .capi .PySequenceArrayWrapper ;
79
80
import com .oracle .graal .python .builtins .objects .cext .capi .PythonNativeWrapper ;
86
87
import com .oracle .graal .python .builtins .objects .str .PString ;
87
88
import com .oracle .graal .python .builtins .objects .str .StringBuiltins .EncodeNode ;
88
89
import com .oracle .graal .python .builtins .objects .str .StringBuiltins .ModNode ;
90
+ import com .oracle .graal .python .lib .PyBytesCheckNode ;
89
91
import com .oracle .graal .python .lib .PyNumberAsSizeNode ;
90
92
import com .oracle .graal .python .lib .PyObjectLookupAttr ;
91
93
import com .oracle .graal .python .lib .PyObjectSizeNode ;
101
103
import com .oracle .graal .python .runtime .sequence .storage .SequenceStorage ;
102
104
import com .oracle .graal .python .util .OverflowException ;
103
105
import com .oracle .truffle .api .CompilerDirectives ;
106
+ import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
104
107
import com .oracle .truffle .api .dsl .Bind ;
105
108
import com .oracle .truffle .api .dsl .Cached ;
106
109
import com .oracle .truffle .api .dsl .Cached .Exclusive ;
@@ -118,14 +121,28 @@ public final class PythonCextBytesBuiltins {
118
121
@ CApiBuiltin (ret = Py_ssize_t , args = {PyObject }, call = Direct )
119
122
public abstract static class PyBytes_Size extends CApiUnaryBuiltinNode {
120
123
@ Specialization
121
- public static int size (PBytes obj ,
124
+ static int doPBytes (PBytes obj ,
122
125
@ Cached PyObjectSizeNode sizeNode ) {
123
126
return sizeNode .execute (null , obj );
124
127
}
125
128
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
+
126
142
@ 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 );
129
146
}
130
147
}
131
148
0 commit comments