Skip to content

Commit 020d852

Browse files
committed
Check method flags when allocating native slots
1 parent 693a739 commit 020d852

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ToNativeTypeNode.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,15 @@ private static Object getSlot(PythonManagedClass obj, SlotMethodDef slot) {
107107
}
108108

109109
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;
111119
}
112120

113121
private static Object allocatePyAsyncMethods(PythonManagedClass obj, Object nullValue) {
@@ -175,16 +183,17 @@ private static Object allocatePySequenceMethods(PythonManagedClass obj, Object n
175183
Object mem = CStructAccess.AllocateNode.getUncached().alloc(CStructs.PyNumberMethods);
176184
CStructAccess.WritePointerNode writePointerNode = CStructAccess.WritePointerNode.getUncached();
177185
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
180186
writePointerNode.write(mem, CFields.PySequenceMethods__sq_concat, getSlot(obj, SlotMethodDef.SQ_CONCAT));
181187
writePointerNode.write(mem, CFields.PySequenceMethods__sq_repeat, getSlot(obj, SlotMethodDef.SQ_REPEAT));
182188
writePointerNode.write(mem, CFields.PySequenceMethods__sq_item, getSlot(obj, SlotMethodDef.SQ_ITEM));
183189
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));
185191
writePointerNode.write(mem, CFields.PySequenceMethods__was_sq_ass_slice, nullValue);
192+
// TODO populate sq_contains
186193
writePointerNode.write(mem, CFields.PySequenceMethods__sq_contains, nullValue);
194+
// TODO populate sq_inplace_concat
187195
writePointerNode.write(mem, CFields.PySequenceMethods__sq_inplace_concat, nullValue);
196+
// TODO populate sq_inplace_repeat
188197
writePointerNode.write(mem, CFields.PySequenceMethods__sq_inplace_repeat, nullValue);
189198
return mem;
190199
}
@@ -205,10 +214,6 @@ private static Object lookup(PythonManagedClass obj, SlotMethodDef slot) {
205214
return LookupNativeSlotNode.executeUncached(obj, slot);
206215
}
207216

208-
private static boolean hasSlot(PythonManagedClass clazz, SlotMethodDef slot) {
209-
return LookupNativeSlotNode.executeUncached(clazz, slot) != PythonContext.get(null).getNativeNull().getPtr();
210-
}
211-
212217
static void initializeType(PythonClassNativeWrapper obj, Object mem, boolean heaptype) {
213218
CompilerAsserts.neverPartOfCompilation();
214219

@@ -270,8 +275,8 @@ static void initializeType(PythonClassNativeWrapper obj, Object mem, boolean hea
270275
}
271276
Object asAsync = hasAsyncMethods(clazz) ? allocatePyAsyncMethods(clazz, nullValue) : nullValue;
272277
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;
275280
Object asBuffer = lookup(clazz, PyTypeObject__tp_as_buffer, TypeBuiltins.TYPE_AS_BUFFER);
276281
writeI64Node.write(mem, CFields.PyTypeObject__tp_weaklistoffset, weaklistoffset);
277282
writePtrNode.write(mem, CFields.PyTypeObject__tp_dealloc, lookup(clazz, PyTypeObject__tp_dealloc, TypeBuiltins.TYPE_DEALLOC));

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/MethodsFlags.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ public static boolean isSLOT1BINFULL(long methodsFlags, long op) {
131131
public static final long AM_SEND = 1L << 57;
132132

133133
public static final long ASYNC_METHODS = AM_AWAIT | AM_AITER | AM_ANEXT | AM_SEND;
134+
public static final long SEQUENCE_METHODS = SQ_LENGTH | SQ_ITEM | SQ_ASS_ITEM | SQ_CONCAT | SQ_INPLACE_CONCAT | SQ_INPLACE_REPEAT | SQ_REPEAT | SQ_CONTAINS;
135+
public static final long MAPPING_METHODS = MP_LENGTH | MP_SUBSCRIPT | MP_ASS_SUBSCRIPT;
134136

135137
// builtins methods flags
136138

0 commit comments

Comments
 (0)