@@ -107,7 +107,15 @@ private static Object getSlot(PythonManagedClass obj, SlotMethodDef slot) {
107
107
}
108
108
109
109
private static boolean hasAsyncMethods (PythonManagedClass obj ) {
110
- return (obj .getMethodsFlags () & MethodsFlags .ASYNC_METHODS ) > 0 ;
110
+ return (obj .getMethodsFlags () & MethodsFlags .ASYNC_METHODS ) != 0 ;
111
+ }
112
+
113
+ private static boolean hasSequenceMethods (PythonManagedClass obj ) {
114
+ return (obj .getMethodsFlags () & MethodsFlags .SEQUENCE_METHODS ) != 0 ;
115
+ }
116
+
117
+ private static boolean hasMappingMethods (PythonManagedClass obj ) {
118
+ return (obj .getMethodsFlags () & MethodsFlags .MAPPING_METHODS ) != 0 ;
111
119
}
112
120
113
121
private static Object allocatePyAsyncMethods (PythonManagedClass obj , Object nullValue ) {
@@ -175,16 +183,17 @@ private static Object allocatePySequenceMethods(PythonManagedClass obj, Object n
175
183
Object mem = CStructAccess .AllocateNode .getUncached ().alloc (CStructs .PyNumberMethods );
176
184
CStructAccess .WritePointerNode writePointerNode = CStructAccess .WritePointerNode .getUncached ();
177
185
writePointerNode .write (mem , CFields .PySequenceMethods__sq_length , getSlot (obj , SlotMethodDef .SQ_LENGTH ));
178
- // TODO: Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL in CPython, so
179
- // this may have unintended effects
180
186
writePointerNode .write (mem , CFields .PySequenceMethods__sq_concat , getSlot (obj , SlotMethodDef .SQ_CONCAT ));
181
187
writePointerNode .write (mem , CFields .PySequenceMethods__sq_repeat , getSlot (obj , SlotMethodDef .SQ_REPEAT ));
182
188
writePointerNode .write (mem , CFields .PySequenceMethods__sq_item , getSlot (obj , SlotMethodDef .SQ_ITEM ));
183
189
writePointerNode .write (mem , CFields .PySequenceMethods__was_sq_slice , nullValue );
184
- writePointerNode .write (mem , CFields .PySequenceMethods__sq_ass_item , nullValue );
190
+ writePointerNode .write (mem , CFields .PySequenceMethods__sq_ass_item , getSlot ( obj , SlotMethodDef . SQ_ASS_ITEM ) );
185
191
writePointerNode .write (mem , CFields .PySequenceMethods__was_sq_ass_slice , nullValue );
192
+ // TODO populate sq_contains
186
193
writePointerNode .write (mem , CFields .PySequenceMethods__sq_contains , nullValue );
194
+ // TODO populate sq_inplace_concat
187
195
writePointerNode .write (mem , CFields .PySequenceMethods__sq_inplace_concat , nullValue );
196
+ // TODO populate sq_inplace_repeat
188
197
writePointerNode .write (mem , CFields .PySequenceMethods__sq_inplace_repeat , nullValue );
189
198
return mem ;
190
199
}
@@ -205,10 +214,6 @@ private static Object lookup(PythonManagedClass obj, SlotMethodDef slot) {
205
214
return LookupNativeSlotNode .executeUncached (obj , slot );
206
215
}
207
216
208
- private static boolean hasSlot (PythonManagedClass clazz , SlotMethodDef slot ) {
209
- return LookupNativeSlotNode .executeUncached (clazz , slot ) != PythonContext .get (null ).getNativeNull ().getPtr ();
210
- }
211
-
212
217
static void initializeType (PythonClassNativeWrapper obj , Object mem , boolean heaptype ) {
213
218
CompilerAsserts .neverPartOfCompilation ();
214
219
@@ -270,8 +275,8 @@ static void initializeType(PythonClassNativeWrapper obj, Object mem, boolean hea
270
275
}
271
276
Object asAsync = hasAsyncMethods (clazz ) ? allocatePyAsyncMethods (clazz , nullValue ) : nullValue ;
272
277
Object asNumber = IsBuiltinClassExactProfile .profileClassSlowPath (clazz , PythonBuiltinClassType .PythonObject ) ? nullValue : allocatePyNumberMethods (clazz , nullValue );
273
- Object asSequence = ( hasSlot ( clazz , SlotMethodDef . SQ_LENGTH ) || hasSlot ( clazz , SlotMethodDef . SQ_ITEM ) ) ? allocatePySequenceMethods (clazz , nullValue ) : nullValue ;
274
- Object asMapping = hasSlot (clazz , SlotMethodDef . MP_LENGTH ) ? allocatePyMappingMethods (clazz ) : nullValue ;
278
+ Object asSequence = hasSequenceMethods ( clazz ) ? allocatePySequenceMethods (clazz , nullValue ) : nullValue ;
279
+ Object asMapping = hasMappingMethods (clazz ) ? allocatePyMappingMethods (clazz ) : nullValue ;
275
280
Object asBuffer = lookup (clazz , PyTypeObject__tp_as_buffer , TypeBuiltins .TYPE_AS_BUFFER );
276
281
writeI64Node .write (mem , CFields .PyTypeObject__tp_weaklistoffset , weaklistoffset );
277
282
writePtrNode .write (mem , CFields .PyTypeObject__tp_dealloc , lookup (clazz , PyTypeObject__tp_dealloc , TypeBuiltins .TYPE_DEALLOC ));
0 commit comments