Skip to content

Commit f57dfe2

Browse files
committed
Respect metaclass basicsize when allocating native types
1 parent 2b95924 commit f57dfe2

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.cext.capi;
4242

43+
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
4344
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper;
4445
import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CStringWrapper;
4546
import com.oracle.graal.python.builtins.objects.cext.structs.CFields;
@@ -49,12 +50,14 @@
4950
import com.oracle.graal.python.builtins.objects.type.PythonClass;
5051
import com.oracle.graal.python.builtins.objects.type.PythonManagedClass;
5152
import com.oracle.graal.python.builtins.objects.type.TypeFlags;
53+
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
5254
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetTypeFlagsNode;
5355
import com.oracle.graal.python.builtins.objects.type.TypeNodes.SetTypeFlagsNode;
5456
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.SetBasicSizeNodeGen;
5557
import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.SetItemSizeNodeGen;
5658
import com.oracle.graal.python.nodes.HiddenAttr;
5759
import com.oracle.graal.python.nodes.PGuards;
60+
import com.oracle.graal.python.nodes.object.GetClassNode;
5861
import com.oracle.graal.python.util.PythonUtils;
5962
import com.oracle.truffle.api.CompilerAsserts;
6063
import com.oracle.truffle.api.CompilerDirectives;
@@ -188,7 +191,15 @@ public Object getReplacement(InteropLibrary lib) {
188191
*/
189192
PythonManagedClass clazz = (PythonManagedClass) getDelegate();
190193
boolean heaptype = (GetTypeFlagsNode.executeUncached(clazz) & TypeFlags.HEAPTYPE) != 0;
191-
Object pointerObject = AllocateNode.allocUncached(heaptype ? CStructs.PyHeapTypeObject : CStructs.PyTypeObject);
194+
long size = CStructs.PyTypeObject.size();
195+
if (heaptype) {
196+
size = CStructs.PyHeapTypeObject.size();
197+
if (GetClassNode.executeUncached(clazz) instanceof PythonAbstractNativeObject nativeMetatype) {
198+
// TODO should call the metatype's tp_alloc
199+
size = TypeNodes.GetBasicSizeNode.executeUncached(nativeMetatype);
200+
}
201+
}
202+
Object pointerObject = AllocateNode.allocUncached(size);
192203
replacement = registerReplacement(pointerObject, true, lib);
193204

194205
ToNativeTypeNode.initializeType(this, pointerObject, heaptype);

0 commit comments

Comments
 (0)