|
43 | 43 | import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PTR_ADD; |
44 | 44 | import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyMemoryViewObject__exports; |
45 | 45 | 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; |
46 | 48 | import static com.oracle.truffle.api.CompilerDirectives.shouldNotReachHere; |
47 | 49 |
|
48 | 50 | import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; |
|
52 | 54 | import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; |
53 | 55 | import com.oracle.graal.python.builtins.objects.cext.structs.CFields; |
54 | 56 | import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; |
| 57 | +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.AllocateNode; |
55 | 58 | import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.GetElementPtrNode; |
| 59 | +import com.oracle.graal.python.builtins.objects.cext.structs.CStructs; |
56 | 60 | import com.oracle.graal.python.builtins.objects.ints.PInt; |
57 | 61 | import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; |
58 | 62 | 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; |
59 | 67 | import com.oracle.truffle.api.CompilerDirectives; |
60 | 68 | import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; |
61 | 69 | import com.oracle.truffle.api.interop.InteropLibrary; |
@@ -86,8 +94,14 @@ private static long allocate(PMemoryView object) { |
86 | 94 | CStructAccess.WriteIntNode writeI32Node = CStructAccess.WriteIntNode.getUncached(); |
87 | 95 | CExtNodes.AsCharPointerNode asCharPointerNode = CExtNodes.AsCharPointerNode.getUncached(); |
88 | 96 |
|
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); |
91 | 105 | writeI32Node.write(mem, PyMemoryViewObject__flags, object.getFlags()); |
92 | 106 | writeI64Node.write(mem, PyMemoryViewObject__exports, object.getExports().get()); |
93 | 107 | // TODO: ignoring mbuf, hash and weakreflist for now |
|
0 commit comments