Skip to content

Commit ac1b054

Browse files
committed
[GR-64970] Add patch for pygobject that makes it work on 24.2.1
PullRequest: graalpython/3797
2 parents ebb99f6 + 283be5e commit ac1b054

File tree

6 files changed

+366
-4
lines changed

6 files changed

+366
-4
lines changed

graalpython/com.oracle.graal.python.cext/src/tupleobject.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -959,7 +959,6 @@ PyTypeObject PyTuple_Type = {
959959
};
960960

961961

962-
#if 0 // GraalPy change
963962
/* The following function breaks the notion that tuples are immutable:
964963
it changes the size of a tuple. We get away with this only if there
965964
is only one module referencing the object. You can also think of it
@@ -977,7 +976,8 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
977976

978977
v = (PyTupleObject *) *pv;
979978
if (v == NULL || !Py_IS_TYPE(v, &PyTuple_Type) ||
980-
(Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
979+
// GraalPy change: ignore refcnt
980+
/* (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1) */ 0) {
981981
*pv = 0;
982982
Py_XDECREF(v);
983983
PyErr_BadInternalCall();
@@ -990,7 +990,9 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
990990
}
991991
if (newsize == 0) {
992992
Py_DECREF(v);
993-
*pv = tuple_get_empty();
993+
// GraalPy change: no empty tuple singleton
994+
// *pv = tuple_get_empty();
995+
*pv = PyTuple_New(0);
994996
return 0;
995997
}
996998
if (oldsize == 0) {
@@ -1004,6 +1006,19 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
10041006
return *pv == NULL ? -1 : 0;
10051007
}
10061008

1009+
// Begin GraalPy change
1010+
if (points_to_py_handle_space(v)) {
1011+
GraalPyVarObject *o = (GraalPyVarObject *)pointer_to_stub(v);
1012+
PyObject** new_items = GraalPyTruffleTuple_Resize((PyObject *)v, newsize, o->ob_item);
1013+
if (new_items == NULL && o->ob_item != NULL) {
1014+
*pv = NULL;
1015+
return -1;
1016+
}
1017+
o->ob_size = newsize;
1018+
o->ob_item = new_items;
1019+
return 0;
1020+
}
1021+
// End GraalPy change
10071022
/* XXX UNREF/NEWREF interface should be more symmetrical */
10081023
#ifdef Py_REF_DEBUG
10091024
_Py_RefTotal--;
@@ -1034,6 +1049,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
10341049
return 0;
10351050
}
10361051

1052+
#if 0 // GraalPy change
10371053

10381054
PyStatus
10391055
_PyTuple_InitTypes(PyInterpreterState *interp)

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tuple.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ def _reference_setitem(args):
6767
return tuple(t)
6868

6969

70+
def _reference_resize(args):
71+
original = args[0]
72+
newsize = args[1]
73+
return original[:newsize] + (None,) * (newsize - len(original))
74+
return tuple(result)
75+
76+
7077
class MyStr(str):
7178

7279
def __init__(self, s):
@@ -259,6 +266,35 @@ class TestPyTuple(CPyExtTestCase):
259266
cmpfunc=unhandled_error_compare
260267
)
261268

269+
# _PyTuple_Resize
270+
test_PyTuple_Resize = CPyExtFunction(
271+
_reference_resize,
272+
lambda: (
273+
((1, 2, 3), 1),
274+
((), 1),
275+
((1, 2, 3), 5),
276+
),
277+
code="""
278+
PyObject* wrap_PyTuple_Resize(PyObject* original, int newsize) {
279+
int size = PyTuple_Size(original);
280+
PyObject *freshTuple = PyTuple_New(size);
281+
for (int i = 0; i < size; ++i) {
282+
PyTuple_SET_ITEM(freshTuple, i, Py_NewRef(PyTuple_GetItem(original, i)));
283+
}
284+
_PyTuple_Resize(&freshTuple, newsize);
285+
for (int i = size; i < newsize; i++) {
286+
PyTuple_SET_ITEM(freshTuple, i, Py_NewRef(Py_None));
287+
}
288+
return freshTuple;
289+
}
290+
""",
291+
resultspec="O",
292+
argspec='Oi',
293+
arguments=["PyObject* original", "Py_ssize_t newsize"],
294+
callfunction="wrap_PyTuple_Resize",
295+
cmpfunc=unhandled_error_compare,
296+
)
297+
262298

263299
class TestNativeSubclass(unittest.TestCase):
264300
def _verify(self, t):

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTupleBuiltins.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored;
4646
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
4747
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed;
48+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectPtr;
4849
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
4950
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t;
5051

@@ -59,10 +60,12 @@
5960
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
6061
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
6162
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
63+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.EnsureCapacityNode;
6264
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemNode;
6365
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemScalarNode;
6466
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode;
6567
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SetItemScalarNode;
68+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SetLenNode;
6669
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
6770
import com.oracle.graal.python.lib.PySliceNew;
6871
import com.oracle.graal.python.lib.PyTupleSizeNode;
@@ -71,6 +74,7 @@
7174
import com.oracle.graal.python.nodes.builtins.TupleNodes.GetNativeTupleStorage;
7275
import com.oracle.graal.python.runtime.object.PFactory;
7376
import com.oracle.graal.python.runtime.sequence.storage.NativeObjectSequenceStorage;
77+
import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage;
7478
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
7579
import com.oracle.truffle.api.dsl.Bind;
7680
import com.oracle.truffle.api.dsl.Cached;
@@ -206,4 +210,23 @@ private static Object doGetSlice(SequenceStorage storage, Node inliningTarget, O
206210
return getItemNode.execute(null, storage, sliceNode.execute(inliningTarget, iLow, iHigh, PNone.NONE));
207211
}
208212
}
213+
214+
@CApiBuiltin(ret = PyObjectPtr, args = {PyObject, Py_ssize_t, PyObjectPtr}, call = Ignored)
215+
abstract static class PyTruffleTuple_Resize extends CApiTernaryBuiltinNode {
216+
@Specialization
217+
public static Object size(PTuple tuple, long size, Object obItemsPtr,
218+
@Bind("this") Node inliningTarget,
219+
@Cached EnsureCapacityNode ensureCapacityNode,
220+
@Cached SetLenNode setLenNode) {
221+
SequenceStorage store = tuple.getSequenceStorage();
222+
int newLength = (int) Math.min(size, Integer.MAX_VALUE);
223+
ensureCapacityNode.execute(inliningTarget, store, newLength);
224+
setLenNode.execute(inliningTarget, store, newLength);
225+
if (store instanceof NativeSequenceStorage nativeStore) {
226+
return nativeStore.getPtr();
227+
} else {
228+
return obItemsPtr;
229+
}
230+
}
231+
}
209232
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,7 @@ public final class CApiFunction {
629629
@CApiBuiltin(name = "_PyTrash_cond", ret = Int, args = {PyObject, destructor}, call = CImpl)
630630
@CApiBuiltin(name = "_PyTrash_end", ret = Void, args = {PyThreadState}, call = CImpl)
631631
@CApiBuiltin(name = "_PyTuple_MaybeUntrack", ret = Void, args = {PyObject}, call = CImpl)
632+
@CApiBuiltin(name = "_PyTuple_Resize", ret = Int, args = {PyObjectPtr, Py_ssize_t}, call = CImpl)
632633
@CApiBuiltin(name = "_PyType_Name", ret = ConstCharPtrAsTruffleString, args = {PyTypeObject}, call = CImpl)
633634
@CApiBuiltin(name = "_PyUnicode_EqualToASCIIId", ret = Int, args = {PyObject, PY_IDENTIFIER}, call = CImpl)
634635
@CApiBuiltin(name = "_PyUnicode_FromId", ret = PyObject, args = {PY_IDENTIFIER}, call = CImpl)
@@ -1172,7 +1173,6 @@ public final class CApiFunction {
11721173
@CApiBuiltin(name = "_PyTime_localtime", ret = Int, args = {TIME_T, TM_PTR}, call = NotImplemented)
11731174
@CApiBuiltin(name = "_PyTraceMalloc_GetTraceback", ret = PyObject, args = {UNSIGNED_INT, UINTPTR_T}, call = NotImplemented)
11741175
@CApiBuiltin(name = "_PyTuple_DebugMallocStats", ret = Void, args = {FILE_PTR}, call = NotImplemented)
1175-
@CApiBuiltin(name = "_PyTuple_Resize", ret = Int, args = {PyObjectPtr, Py_ssize_t}, call = NotImplemented)
11761176
@CApiBuiltin(name = "_PyType_CalculateMetaclass", ret = PyTypeObject, args = {PyTypeObject, PyObject}, call = NotImplemented)
11771177
@CApiBuiltin(name = "_PyType_GetDocFromInternalDoc", ret = PyObject, args = {ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString}, call = NotImplemented)
11781178
@CApiBuiltin(name = "_PyType_GetTextSignatureFromInternalDoc", ret = PyObject, args = {ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString}, call = NotImplemented)

graalpython/lib-graalpython/patches/metadata.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,11 @@ version = '== 2.*'
531531
patch = 'pygame-2.patch'
532532
license = 'LGPL-2.0-or-later'
533533

534+
[[pygobject.rules]]
535+
version = '== 3.52.3'
536+
patch = 'pygobject-3.52.3.patch'
537+
license = 'LGPL-2.0-or-later'
538+
534539
[[pymongo.rules]]
535540
version = "< 4.8.0"
536541
patch = 'pymongo.patch'

0 commit comments

Comments
 (0)