Skip to content

Commit 82cedff

Browse files
committed
[GR-71227] Correctly allocate _PyGC_Head for PyMemoryViewObject.
PullRequest: graalpython/4090
2 parents 2314319 + d9224a5 commit 82cedff

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PTR_ADD;
4444
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyMemoryViewObject__exports;
4545
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyMemoryViewObject__flags;
46+
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyObject__ob_refcnt;
47+
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyObject__ob_type;
4648
import static com.oracle.truffle.api.CompilerDirectives.shouldNotReachHere;
4749

4850
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
@@ -52,10 +54,16 @@
5254
import com.oracle.graal.python.builtins.objects.cext.common.NativePointer;
5355
import com.oracle.graal.python.builtins.objects.cext.structs.CFields;
5456
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
57+
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.AllocateNode;
5558
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.GetElementPtrNode;
59+
import com.oracle.graal.python.builtins.objects.cext.structs.CStructs;
5660
import com.oracle.graal.python.builtins.objects.ints.PInt;
5761
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
5862
import com.oracle.graal.python.builtins.objects.object.PythonObject;
63+
import com.oracle.graal.python.builtins.objects.type.TypeFlags;
64+
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetTypeFlagsNode;
65+
import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode;
66+
import com.oracle.graal.python.util.PythonUtils;
5967
import com.oracle.truffle.api.CompilerDirectives;
6068
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6169
import com.oracle.truffle.api.interop.InteropLibrary;
@@ -86,8 +94,14 @@ private static long allocate(PMemoryView object) {
8694
CStructAccess.WriteIntNode writeI32Node = CStructAccess.WriteIntNode.getUncached();
8795
CExtNodes.AsCharPointerNode asCharPointerNode = CExtNodes.AsCharPointerNode.getUncached();
8896

89-
long taggedPointer = CApiTransitions.FirstToNativeNode.executeUncached(object.getNativeWrapper(), true /*- TODO: immortal for now */);
90-
long mem = CApiTransitions.HandlePointerConverter.pointerToStub(taggedPointer);
97+
Object type = GetPythonObjectClassNode.executeUncached(object);
98+
boolean gc = (GetTypeFlagsNode.executeUncached(type) & TypeFlags.HAVE_GC) != 0;
99+
long presize = gc ? CStructs.PyGC_Head.size() : 0;
100+
long memWithHead = PythonUtils.coerceToLong(AllocateNode.allocUncached(CStructs.PyMemoryViewObject.size() + presize), InteropLibrary.getUncached());
101+
long mem = memWithHead + presize;
102+
103+
writePointerNode.write(mem, PyObject__ob_type, PythonToNativeNewRefNode.executeUncached(type));
104+
writeI64Node.write(mem, PyObject__ob_refcnt, PythonAbstractObjectNativeWrapper.IMMORTAL_REFCNT);
91105
writeI32Node.write(mem, PyMemoryViewObject__flags, object.getFlags());
92106
writeI64Node.write(mem, PyMemoryViewObject__exports, object.getExports().get());
93107
// TODO: ignoring mbuf, hash and weakreflist for now

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@
9696
import com.oracle.graal.python.builtins.objects.floats.PFloat;
9797
import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorDeleteMarker;
9898
import com.oracle.graal.python.builtins.objects.ints.PInt;
99-
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
10099
import com.oracle.graal.python.builtins.objects.object.PythonObject;
101100
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
102101
import com.oracle.graal.python.builtins.objects.type.TypeFlags;
@@ -1080,8 +1079,6 @@ static long doOther(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapp
10801079
ctype = CStructs.GraalPyVarObject;
10811080
} else if (isFloatObjectProfile.profile(inliningTarget, delegate instanceof PFloat)) {
10821081
ctype = CStructs.GraalPyFloatObject;
1083-
} else if (isMemViewObjectProfile.profile(inliningTarget, delegate instanceof PMemoryView)) {
1084-
ctype = CStructs.PyMemoryViewObject;
10851082
} else {
10861083
ctype = CStructs.GraalPyObject;
10871084
}

0 commit comments

Comments
 (0)