Skip to content

Commit b8fc9ff

Browse files
yoneymeta-codesync[bot]
authored andcommitted
Fix FT LIST_APPEND for lists and checked lists
Summary: Use PyList_Append for built-in lists while retaining the existing checked-list append path. Preserve stack-reference cleanup and regenerate the 3.14 interpreter cases. Reviewed By: alexmalyshev Differential Revision: D114353126 fbshipit-source-id: 85d41639fb7b273400d86f1d377b63fb393bf7de
1 parent 2dc04ed commit b8fc9ff

2 files changed

Lines changed: 30 additions & 10 deletions

File tree

cinderx/Interpreter/3.14/Includes/generated_cases.c.h

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9460,11 +9460,26 @@
94609460
v = stack_pointer[-1];
94619461
list = stack_pointer[-2 - (oparg-1)];
94629462
#ifdef Py_GIL_DISABLED
9463-
9464-
int err = _PyList_AppendTakeRef((PyListObject *)PyStackRef_AsPyObjectBorrow(list),
9465-
PyStackRef_AsPyObjectSteal(v));
9463+
PyObject *lst = PyStackRef_AsPyObjectBorrow(list);
9464+
int err;
9465+
if (PyList_Check(lst)) {
9466+
_PyFrame_SetStackPointer(frame, stack_pointer);
9467+
err = PyList_Append(lst, PyStackRef_AsPyObjectBorrow(v));
9468+
stack_pointer = _PyFrame_GetStackPointer(frame);
9469+
}
9470+
else {
9471+
_PyFrame_SetStackPointer(frame, stack_pointer);
9472+
err = Ci_ListOrCheckedList_Append(
9473+
(PyListObject *)lst, PyStackRef_AsPyObjectBorrow(v));
9474+
stack_pointer = _PyFrame_GetStackPointer(frame);
9475+
}
9476+
stack_pointer += -1;
9477+
assert(WITHIN_STACK_BOUNDS());
9478+
_PyFrame_SetStackPointer(frame, stack_pointer);
9479+
PyStackRef_CLOSE(v);
9480+
stack_pointer = _PyFrame_GetStackPointer(frame);
94669481
if (err < 0) {
9467-
JUMP_TO_LABEL(pop_1_error);
9482+
JUMP_TO_LABEL(error);
94689483
}
94699484
#else
94709485
_PyFrame_SetStackPointer(frame, stack_pointer);
@@ -9479,10 +9494,7 @@
94799494
if (err < 0) {
94809495
JUMP_TO_LABEL(error);
94819496
}
9482-
stack_pointer += 1;
94839497
#endif
9484-
stack_pointer += -1;
9485-
assert(WITHIN_STACK_BOUNDS());
94869498
DISPATCH();
94879499
}
94889500

cinderx/Interpreter/3.14/cinder-bytecodes.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -507,9 +507,17 @@ dummy_func(
507507

508508
override inst(LIST_APPEND, (list, unused[oparg-1], v -- list, unused[oparg-1])) {
509509
#ifdef Py_GIL_DISABLED
510-
// T250369690: Need thread-safe checked collections
511-
int err = _PyList_AppendTakeRef((PyListObject *)PyStackRef_AsPyObjectBorrow(list),
512-
PyStackRef_AsPyObjectSteal(v));
510+
PyObject *lst = PyStackRef_AsPyObjectBorrow(list);
511+
int err;
512+
if (PyList_Check(lst)) {
513+
err = PyList_Append(lst, PyStackRef_AsPyObjectBorrow(v));
514+
}
515+
else {
516+
// T250369690: Need thread-safe checked collections
517+
err = Ci_ListOrCheckedList_Append(
518+
(PyListObject *)lst, PyStackRef_AsPyObjectBorrow(v));
519+
}
520+
PyStackRef_CLOSE(v);
513521
ERROR_IF(err < 0);
514522
#else
515523
int err = Ci_ListOrCheckedList_Append(

0 commit comments

Comments
 (0)