|
48 | 48 | import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_del; |
49 | 49 | import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_free; |
50 | 50 | import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_vectorcall_offset; |
| 51 | +import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_weaklistoffset; |
51 | 52 | import static com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TYPE_ALLOC; |
52 | 53 |
|
53 | 54 | import com.oracle.graal.python.builtins.PythonBuiltinClassType; |
|
70 | 71 | import com.oracle.graal.python.builtins.objects.dict.PDict; |
71 | 72 | import com.oracle.graal.python.builtins.objects.method.PDecoratedMethod; |
72 | 73 | import com.oracle.graal.python.builtins.objects.str.PString; |
| 74 | +import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; |
73 | 75 | import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; |
74 | 76 | import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; |
75 | 77 | import com.oracle.graal.python.builtins.objects.type.TypeBuiltins; |
|
80 | 82 | import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroStorageNode; |
81 | 83 | import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesNode; |
82 | 84 | import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetTypeFlagsNode; |
83 | | -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetWeakListOffsetNode; |
84 | 85 | import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetDictOffsetNodeGen; |
85 | 86 | import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetTypeFlagsNodeGen; |
86 | 87 | import com.oracle.graal.python.nodes.PNodeWithContext; |
87 | 88 | import com.oracle.graal.python.nodes.SpecialAttributeNames; |
| 89 | +import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; |
| 90 | +import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONodeGen; |
88 | 91 | import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; |
89 | 92 | import com.oracle.graal.python.nodes.attributes.LookupNativeSlotNode; |
90 | 93 | import com.oracle.graal.python.nodes.attributes.LookupNativeSlotNodeGen.LookupNativeGetattroSlotNodeGen; |
@@ -262,6 +265,7 @@ static void initializeType(PythonClassNativeWrapper obj, Object mem, |
262 | 265 |
|
263 | 266 | PythonToNativeNode toNative = PythonToNativeNodeGen.getUncached(); |
264 | 267 | PythonToNativeNewRefNode toNativeNewRef = PythonToNativeNewRefNodeGen.getUncached(); |
| 268 | + LookupAttributeInMRONode.Dynamic lookupAttrNode = LookupAttributeInMRONodeGen.DynamicNodeGen.getUncached(); |
265 | 269 | CastToTruffleStringNode castToStringNode = CastToTruffleStringNode.getUncached(); |
266 | 270 | CStructAccess.WritePointerNode writePtrNode = CStructAccessFactory.WritePointerNodeGen.getUncached(); |
267 | 271 | CStructAccess.WriteLongNode writeI64Node = CStructAccessFactory.WriteLongNodeGen.getUncached(); |
@@ -292,7 +296,19 @@ static void initializeType(PythonClassNativeWrapper obj, Object mem, |
292 | 296 | writePtrNode.write(mem, CFields.PyTypeObject__tp_name, clazz.getClassNativeWrapper().getNameWrapper()); |
293 | 297 | writeI64Node.write(mem, CFields.PyTypeObject__tp_basicsize, GetBasicSizeNode.executeUncached(clazz)); |
294 | 298 | writeI64Node.write(mem, CFields.PyTypeObject__tp_itemsize, GetItemSizeNode.executeUncached(clazz)); |
295 | | - writeI64Node.write(mem, CFields.PyTypeObject__tp_weaklistoffset, GetWeakListOffsetNode.executeUncached(clazz)); |
| 299 | + // writeI64Node.write(mem, CFields.PyTypeObject__tp_weaklistoffset, |
| 300 | + // GetWeakListOffsetNode.executeUncached(clazz)); |
| 301 | + /* |
| 302 | + * TODO msimacek: this should use GetWeakListOffsetNode as in the commented out code |
| 303 | + * above. Unfortunately, it causes memory corruption in several libraries |
| 304 | + */ |
| 305 | + long weaklistoffset; |
| 306 | + if (clazz instanceof PythonBuiltinClass builtin) { |
| 307 | + weaklistoffset = builtin.getType().getWeaklistoffset(); |
| 308 | + } else { |
| 309 | + weaklistoffset = LookupNativeI64MemberInMRONodeGen.getUncached().execute(clazz, PyTypeObject__tp_weaklistoffset, SpecialAttributeNames.T___WEAKLISTOFFSET__); |
| 310 | + } |
| 311 | + writeI64Node.write(mem, CFields.PyTypeObject__tp_weaklistoffset, weaklistoffset); |
296 | 312 | writePtrNode.write(mem, CFields.PyTypeObject__tp_dealloc, lookup(clazz, PyTypeObject__tp_dealloc, TypeBuiltins.TYPE_DEALLOC)); |
297 | 313 | writeI64Node.write(mem, CFields.PyTypeObject__tp_vectorcall_offset, lookupSize(clazz, PyTypeObject__tp_vectorcall_offset, TypeBuiltins.TYPE_VECTORCALL_OFFSET)); |
298 | 314 | writePtrNode.write(mem, CFields.PyTypeObject__tp_getattr, nullValue); |
|
0 commit comments