From 589866504dc45b4fe403cd5545b9b21a1f7bea1b Mon Sep 17 00:00:00 2001 From: Jeongseop Lim Date: Fri, 30 Oct 2026 03:21:42 +0900 Subject: [PATCH] Accept and ignore extra _thread.RLock() arguments The constructor took only cls, so _thread.RLock(0) and threading.RLock(0) raised TypeError. CPython 3.12 and 3.13 accept and ignore any arguments, and threading.RLock passes them on after a DeprecationWarning that announces the removal for 3.15. Signed-off-by: Jeongseop Lim --- .../src/tests/test_threading.py | 7 +++++++ .../python/builtins/objects/thread/RLockBuiltins.java | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_threading.py b/graalpython/com.oracle.graal.python.test/src/tests/test_threading.py index e3af32a7e8..0bf2a6ecfa 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_threading.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_threading.py @@ -173,3 +173,10 @@ def test_blocking_os_read_thread_does_not_deadlock_import_re(): ) assert result.returncode == 0, result.stderr assert result.stdout.rstrip().endswith("ok"), result.stdout + + +def test_rlock_new_ignores_arguments(): + import _thread + + assert type(_thread.RLock(0)) is _thread.RLock + assert type(_thread.RLock(x=1)) is _thread.RLock diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/RLockBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/RLockBuiltins.java index 7e39fd9078..b0f93cb3ea 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/RLockBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/RLockBuiltins.java @@ -52,6 +52,7 @@ import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; @@ -62,6 +63,7 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.util.CastToJavaUnsignedLongNode; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.exception.PythonErrorType; @@ -85,11 +87,12 @@ protected List> getNodeFa } @Slot(value = SlotKind.tp_new, isComplex = true) - @SlotSignature(name = "RLock", minNumOfPositionalArgs = 1) + @SlotSignature(name = "RLock", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory - public abstract static class ConstructRLockNode extends PythonUnaryBuiltinNode { + public abstract static class ConstructRLockNode extends PythonVarargsBuiltinNode { + @SuppressWarnings("unused") @Specialization - PRLock construct(Object cls, + PRLock construct(Object cls, Object[] arguments, PKeyword[] keywords, @Cached TypeNodes.GetInstanceShape getInstanceShape) { return PFactory.createRLock(cls, getInstanceShape.execute(cls)); }