https://github.com/medismailben created 
https://github.com/llvm/llvm-project/pull/170188

Extract `__func__` attribute from staticmethod/classmethod descriptors before 
treating them as callables. Python's @staticmethod and @classmethod decorators 
wrap methods in descriptor objects that are not directly usable as 
PythonCallable, when calling PyCallable_Check.

The actual callable function is stored in the `__func__` attribute of these 
descriptors, so we need to unwrap them to properly validate and invoke 
decorated methods in scripted interfaces.

>From 8811cbac1b81cdc42a2501a6eb2a92813d2977d2 Mon Sep 17 00:00:00 2001
From: Med Ismail Bennani <[email protected]>
Date: Sat, 29 Nov 2025 18:03:47 -0800
Subject: [PATCH] [lldb] Handle staticmethod/classmethod descriptors in
 ScriptedPythonInterface

Extract `__func__` attribute from staticmethod/classmethod descriptors
before treating them as callables. Python's @staticmethod and @classmethod
decorators wrap methods in descriptor objects that are not directly usable
as PythonCallable, when calling PyCallable_Check.

The actual callable function is stored in the `__func__` attribute of these
descriptors, so we need to unwrap them to properly validate and invoke
decorated methods in scripted interfaces.

Signed-off-by: Med Ismail Bennani <[email protected]>
---
 .../Python/Interfaces/ScriptedPythonInterface.h      | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git 
a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h
 
b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h
index af88a69e34a13..d9cebefff5ff5 100644
--- 
a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h
+++ 
b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h
@@ -81,7 +81,17 @@ class ScriptedPythonInterface : virtual public 
ScriptedInterface {
                               AbstractMethodCheckerCases::eNotAllocated)
       }
 
-      PythonCallable callable = callable_or_err->AsType<PythonCallable>();
+      PythonObject method_obj = *callable_or_err;
+
+      // Handle staticmethod/classmethod descriptors by extracting __func__
+      if (method_obj.HasAttribute("__func__")) {
+        method_obj = method_obj.GetAttributeValue("__func__");
+        if (!method_obj.IsAllocated())
+          SET_CASE_AND_CONTINUE(method_name,
+                                AbstractMethodCheckerCases::eNotAllocated)
+      }
+
+      PythonCallable callable = method_obj.AsType<PythonCallable>();
       if (!callable)
         SET_CASE_AND_CONTINUE(method_name,
                               AbstractMethodCheckerCases::eNotCallable)

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to