Author: Med Ismail Bennani Date: 2023-11-07T13:04:01-08:00 New Revision: c2ad9f8b607931430e86da7420493599c48e62a0
URL: https://github.com/llvm/llvm-project/commit/c2ad9f8b607931430e86da7420493599c48e62a0 DIFF: https://github.com/llvm/llvm-project/commit/c2ad9f8b607931430e86da7420493599c48e62a0.diff LOG: Revert "[lldb] Check for abstract methods implementation in Scripted Plugin Objects (#71260)" This reverts commit cc9ad72713405ef8f2468c7a714a137b4a3343ba since it breaks some tests upstream: https://lab.llvm.org/buildbot/#/builders/68/builds/63112 ******************** Failed Tests (4): lldb-api :: functionalities/gdb_remote_client/TestThreadSelectionBug.py lldb-api :: functionalities/plugins/python_os_plugin/TestPythonOSPlugin.py lldb-api :: functionalities/plugins/python_os_plugin/stepping_plugin_threads/TestOSPluginStepping.py lldb-api :: functionalities/postmortem/mach-core/TestMachCore.py Added: Modified: lldb/include/lldb/Interpreter/Interfaces/ScriptedInterface.h lldb/include/lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h lldb/include/lldb/Interpreter/Interfaces/ScriptedProcessInterface.h lldb/include/lldb/Interpreter/Interfaces/ScriptedThreadInterface.h lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.h lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.h lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPythonInterface.h lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp Removed: lldb/test/API/functionalities/scripted_process/missing_methods_scripted_process.py ################################################################################ diff --git a/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterface.h b/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterface.h index 9753a916243b7be..e4816352daa5db6 100644 --- a/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterface.h +++ b/lldb/include/lldb/Interpreter/Interfaces/ScriptedInterface.h @@ -30,8 +30,6 @@ class ScriptedInterface { return m_object_instance_sp; } - virtual llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const = 0; - template <typename Ret> static Ret ErrorWithMessage(llvm::StringRef caller_name, llvm::StringRef error_msg, Status &error, diff --git a/lldb/include/lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h b/lldb/include/lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h index 167149cbf5b8f89..7feaa01fe89b860 100644 --- a/lldb/include/lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h +++ b/lldb/include/lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h @@ -24,10 +24,6 @@ class ScriptedPlatformInterface : virtual public ScriptedInterface { StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj = nullptr) = 0; - llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const override { - return {}; - } - virtual StructuredData::DictionarySP ListProcesses() { return {}; } virtual StructuredData::DictionarySP GetProcessInfo(lldb::pid_t) { diff --git a/lldb/include/lldb/Interpreter/Interfaces/ScriptedProcessInterface.h b/lldb/include/lldb/Interpreter/Interfaces/ScriptedProcessInterface.h index e41f488d201e2cb..10203b1f8baa7aa 100644 --- a/lldb/include/lldb/Interpreter/Interfaces/ScriptedProcessInterface.h +++ b/lldb/include/lldb/Interpreter/Interfaces/ScriptedProcessInterface.h @@ -26,10 +26,6 @@ class ScriptedProcessInterface : virtual public ScriptedInterface { StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj = nullptr) = 0; - llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const override { - return {}; - } - virtual StructuredData::DictionarySP GetCapabilities() { return {}; } virtual Status Attach(const ProcessAttachInfo &attach_info) { diff --git a/lldb/include/lldb/Interpreter/Interfaces/ScriptedThreadInterface.h b/lldb/include/lldb/Interpreter/Interfaces/ScriptedThreadInterface.h index 0520b6905e2501f..a7cfc690b67dc74 100644 --- a/lldb/include/lldb/Interpreter/Interfaces/ScriptedThreadInterface.h +++ b/lldb/include/lldb/Interpreter/Interfaces/ScriptedThreadInterface.h @@ -25,10 +25,6 @@ class ScriptedThreadInterface : virtual public ScriptedInterface { StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj = nullptr) = 0; - llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const override { - return {}; - } - virtual lldb::tid_t GetThreadID() { return LLDB_INVALID_THREAD_ID; } virtual std::optional<std::string> GetName() { return std::nullopt; } diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h index e27f4dd28010662..ee24e0ee30f91b3 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h @@ -29,13 +29,6 @@ class OperatingSystemPythonInterface StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj = nullptr) override; - llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const override { - return llvm::SmallVector<llvm::StringLiteral>({"get_thread_info" - "get_register_data", - "get_stop_reason", - "get_register_context"}); - } - StructuredData::DictionarySP CreateThread(lldb::tid_t tid, lldb::addr_t context) override; diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.h index 0842d3a00342914..e04f2d02ab1d120 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPlatformPythonInterface.h @@ -28,12 +28,6 @@ class ScriptedPlatformPythonInterface : public ScriptedPlatformInterface, StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj = nullptr) override; - llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const override { - return llvm::SmallVector<llvm::StringLiteral>( - {"list_processes", "attach_to_process", "launch_process", - "kill_process"}); - } - StructuredData::DictionarySP ListProcesses() override; StructuredData::DictionarySP GetProcessInfo(lldb::pid_t) override; diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.h index c75caa9340f2504..f3cff619f6624f0 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedProcessPythonInterface.h @@ -29,11 +29,6 @@ class ScriptedProcessPythonInterface : public ScriptedProcessInterface, StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj = nullptr) override; - llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const override { - return llvm::SmallVector<llvm::StringLiteral>( - {"read_memory_at_address", "is_alive", "get_scripted_thread_plugin"}); - } - StructuredData::DictionarySP GetCapabilities() override; Status Attach(const ProcessAttachInfo &attach_info) override; diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h index 163659234466d38..7af981639709997 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedPythonInterface.h @@ -32,45 +32,6 @@ class ScriptedPythonInterface : virtual public ScriptedInterface { ScriptedPythonInterface(ScriptInterpreterPythonImpl &interpreter); ~ScriptedPythonInterface() override = default; - enum class AbstractMethodCheckerCases { - eNotImplemented, - eNotAllocated, - eNotCallable, - eValid - }; - - llvm::Expected<std::map<llvm::StringLiteral, AbstractMethodCheckerCases>> - CheckAbstractMethodImplementation( - const python::PythonDictionary &class_dict) const { - - using namespace python; - - std::map<llvm::StringLiteral, AbstractMethodCheckerCases> checker; -#define SET_ERROR_AND_CONTINUE(method_name, error) \ - { \ - checker[method_name] = error; \ - continue; \ - } - - for (const llvm::StringLiteral &method_name : GetAbstractMethods()) { - if (!class_dict.HasKey(method_name)) - SET_ERROR_AND_CONTINUE(method_name, - AbstractMethodCheckerCases::eNotImplemented) - auto callable_or_err = class_dict.GetItem(method_name); - if (!callable_or_err) - SET_ERROR_AND_CONTINUE(method_name, - AbstractMethodCheckerCases::eNotAllocated) - if (!PythonCallable::Check(callable_or_err.get().get())) - SET_ERROR_AND_CONTINUE(method_name, - AbstractMethodCheckerCases::eNotCallable) - checker[method_name] = AbstractMethodCheckerCases::eValid; - } - -#undef HANDLE_ERROR - - return checker; - } - template <typename... Args> llvm::Expected<StructuredData::GenericSP> CreatePluginObject(llvm::StringRef class_name, @@ -78,20 +39,20 @@ class ScriptedPythonInterface : virtual public ScriptedInterface { using namespace python; using Locker = ScriptInterpreterPythonImpl::Locker; - auto create_error = [](std::string message) { - return llvm::createStringError(llvm::inconvertibleErrorCode(), message); - }; - bool has_class_name = !class_name.empty(); bool has_interpreter_dict = !(llvm::StringRef(m_interpreter.GetDictionaryName()).empty()); if (!has_class_name && !has_interpreter_dict && !script_obj) { if (!has_class_name) - return create_error("Missing script class name."); + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "Missing script class name."); else if (!has_interpreter_dict) - return create_error("Invalid script interpreter dictionary."); + return llvm::createStringError( + llvm::inconvertibleErrorCode(), + "Invalid script interpreter dictionary."); else - return create_error("Missing scripting object."); + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "Missing scripting object."); } Locker py_lock(&m_interpreter, Locker::AcquireLock | Locker::NoSTDIN, @@ -106,23 +67,26 @@ class ScriptedPythonInterface : virtual public ScriptedInterface { auto dict = PythonModule::MainModule().ResolveName<python::PythonDictionary>( m_interpreter.GetDictionaryName()); - if (!dict.IsAllocated()) - return create_error( - llvm::formatv("Could not find interpreter dictionary: %s", - m_interpreter.GetDictionaryName())); + if (!dict.IsAllocated()) { + return llvm::createStringError( + llvm::inconvertibleErrorCode(), + "Could not find interpreter dictionary: %s", + m_interpreter.GetDictionaryName()); + } - auto init = + auto method = PythonObject::ResolveNameWithDictionary<python::PythonCallable>( class_name, dict); - if (!init.IsAllocated()) - return create_error(llvm::formatv("Could not find script class: %s", - class_name.data())); + if (!method.IsAllocated()) + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "Could not find script class: %s", + class_name.data()); std::tuple<Args...> original_args = std::forward_as_tuple(args...); auto transformed_args = TransformArgs(original_args); std::string error_string; - llvm::Expected<PythonCallable::ArgInfo> arg_info = init.GetArgInfo(); + llvm::Expected<PythonCallable::ArgInfo> arg_info = method.GetArgInfo(); if (!arg_info) { llvm::handleAllErrors( arg_info.takeError(), @@ -135,87 +99,25 @@ class ScriptedPythonInterface : virtual public ScriptedInterface { } llvm::Expected<PythonObject> expected_return_object = - create_error("Resulting object is not initialized."); + llvm::createStringError(llvm::inconvertibleErrorCode(), + "Resulting object is not initialized."); std::apply( - [&init, &expected_return_object](auto &&...args) { + [&method, &expected_return_object](auto &&...args) { llvm::consumeError(expected_return_object.takeError()); - expected_return_object = init(args...); + expected_return_object = method(args...); }, transformed_args); - if (!expected_return_object) - return expected_return_object.takeError(); - result = expected_return_object.get(); + if (llvm::Error e = expected_return_object.takeError()) + return std::move(e); + result = std::move(expected_return_object.get()); } if (!result.IsValid()) - return create_error("Resulting object is not a valid Python Object."); - if (!result.HasAttribute("__class__")) - return create_error("Resulting object doesn't have '__class__' member."); - - PythonObject obj_class = result.GetAttributeValue("__class__"); - if (!obj_class.IsValid()) - return create_error("Resulting class object is not a valid."); - if (!obj_class.HasAttribute("__name__")) - return create_error( - "Resulting object class doesn't have '__name__' member."); - PythonString obj_class_name = - obj_class.GetAttributeValue("__name__").AsType<PythonString>(); - - PythonObject object_class_mapping_proxy = - obj_class.GetAttributeValue("__dict__"); - if (!obj_class.HasAttribute("__dict__")) - return create_error( - "Resulting object class doesn't have '__dict__' member."); - - PythonCallable dict_converter = PythonModule::BuiltinsModule() - .ResolveName("dict") - .AsType<PythonCallable>(); - if (!dict_converter.IsAllocated()) - return create_error( - "Python 'builtins' module doesn't have 'dict' class."); - - PythonDictionary object_class_dict = - dict_converter(object_class_mapping_proxy).AsType<PythonDictionary>(); - if (!object_class_dict.IsAllocated()) - return create_error("Coudn't create dictionary from resulting object " - "class mapping proxy object."); - - auto checker_or_err = CheckAbstractMethodImplementation(object_class_dict); - if (!checker_or_err) - return checker_or_err.takeError(); - - for (const auto &method_checker : *checker_or_err) - switch (method_checker.second) { - case AbstractMethodCheckerCases::eNotImplemented: - LLDB_LOG(GetLog(LLDBLog::Script), - "Abstract method {0}.{1} not implemented.", - obj_class_name.GetString(), method_checker.first); - break; - case AbstractMethodCheckerCases::eNotAllocated: - LLDB_LOG(GetLog(LLDBLog::Script), - "Abstract method {0}.{1} not allocated.", - obj_class_name.GetString(), method_checker.first); - break; - case AbstractMethodCheckerCases::eNotCallable: - LLDB_LOG(GetLog(LLDBLog::Script), - "Abstract method {0}.{1} not callable.", - obj_class_name.GetString(), method_checker.first); - break; - case AbstractMethodCheckerCases::eValid: - LLDB_LOG(GetLog(LLDBLog::Script), - "Abstract method {0}.{1} implemented & valid.", - obj_class_name.GetString(), method_checker.first); - break; - } - - for (const auto &method_checker : *checker_or_err) - if (method_checker.second != AbstractMethodCheckerCases::eValid) - return create_error( - llvm::formatv("Abstract method {0}.{1} missing. Enable lldb " - "script log for more details.", - obj_class_name.GetString(), method_checker.first)); + return llvm::createStringError( + llvm::inconvertibleErrorCode(), + "Resulting object is not a valid Python Object."); m_object_instance_sp = StructuredData::GenericSP( new StructuredPythonObject(std::move(result))); diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPythonInterface.h index 5676f7f1d67528f..b7b7439461a03d6 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPythonInterface.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPythonInterface.h @@ -28,11 +28,6 @@ class ScriptedThreadPythonInterface : public ScriptedThreadInterface, StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj = nullptr) override; - llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const override { - return llvm::SmallVector<llvm::StringLiteral>( - {"get_stop_reason", "get_register_context"}); - } - lldb::tid_t GetThreadID() override; std::optional<std::string> GetName() override; diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp index ea0a1cdff40f1e9..fe3438c42471543 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp @@ -663,20 +663,6 @@ bool PythonDictionary::Check(PyObject *py_obj) { return PyDict_Check(py_obj); } -bool PythonDictionary::HasKey(const llvm::Twine &key) const { - if (!IsValid()) - return false; - - PythonString key_object(key.isSingleStringRef() ? key.getSingleStringRef() - : key.str()); - - if (int res = PyDict_Contains(m_py_obj, key_object.get()) > 0) - return res; - - PyErr_Print(); - return false; -} - uint32_t PythonDictionary::GetSize() const { if (IsValid()) return PyDict_Size(m_py_obj); diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h index 82eee76e42b27a2..012f16e95e770df 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h @@ -562,8 +562,6 @@ class PythonDictionary : public TypedPythonObject<PythonDictionary> { static bool Check(PyObject *py_obj); - bool HasKey(const llvm::Twine &key) const; - uint32_t GetSize() const; PythonList GetKeys() const; diff --git a/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py b/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py index 8c6b9c74bde4703..1761122999f848e 100644 --- a/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py +++ b/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py @@ -60,55 +60,6 @@ def move_blueprint_to_dsym(self, blueprint_name): ) shutil.copy(blueprint_origin_path, blueprint_destination_path) - def test_missing_methods_scripted_register_context(self): - """Test that we only instanciate scripted processes if they implement - all the required abstract methods.""" - self.build() - - os.environ["SKIP_SCRIPTED_PROCESS_LAUNCH"] = "1" - - def cleanup(): - del os.environ["SKIP_SCRIPTED_PROCESS_LAUNCH"] - - self.addTearDownHook(cleanup) - - target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) - self.assertTrue(target, VALID_TARGET) - log_file = self.getBuildArtifact("script.log") - self.runCmd("log enable lldb script -f " + log_file) - self.assertTrue(os.path.isfile(log_file)) - script_path = os.path.join( - self.getSourceDir(), "missing_methods_scripted_process.py" - ) - self.runCmd("command script import " + script_path) - - launch_info = lldb.SBLaunchInfo(None) - launch_info.SetProcessPluginName("ScriptedProcess") - launch_info.SetScriptedProcessClassName( - "missing_methods_scripted_process.MissingMethodsScriptedProcess" - ) - error = lldb.SBError() - - process = target.Launch(launch_info, error) - - self.assertFailure(error) - - with open(log_file, "r") as f: - log = f.read() - - self.assertIn( - "Abstract method MissingMethodsScriptedProcess.read_memory_at_address not implemented", - log, - ) - self.assertIn( - "Abstract method MissingMethodsScriptedProcess.is_alive not implemented", - log, - ) - self.assertIn( - "Abstract method MissingMethodsScriptedProcess.get_scripted_thread_plugin not implemented", - log, - ) - @skipUnlessDarwin def test_invalid_scripted_register_context(self): """Test that we can launch an lldb scripted process with an invalid diff --git a/lldb/test/API/functionalities/scripted_process/missing_methods_scripted_process.py b/lldb/test/API/functionalities/scripted_process/missing_methods_scripted_process.py deleted file mode 100644 index a1db0640033e0ed..000000000000000 --- a/lldb/test/API/functionalities/scripted_process/missing_methods_scripted_process.py +++ /dev/null @@ -1,19 +0,0 @@ -import os - - -class MissingMethodsScriptedProcess: - def __init__(self, exe_ctx, args): - pass - - -def __lldb_init_module(debugger, dict): - if not "SKIP_SCRIPTED_PROCESS_LAUNCH" in os.environ: - debugger.HandleCommand( - "process launch -C %s.%s" - % (__name__, MissingMethodsScriptedProcess.__name__) - ) - else: - print( - "Name of the class that will manage the scripted process: '%s.%s'" - % (__name__, MissingMethodsScriptedProcess.__name__) - ) diff --git a/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp b/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp index efb8f725f6739ae..0b816a8ae0a587e 100644 --- a/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp +++ b/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp @@ -504,9 +504,6 @@ TEST_F(PythonDataObjectsTest, TestPythonDictionaryManipulation) { dict.SetItemForKey(keys[i], values[i]); EXPECT_EQ(dict_entries, dict.GetSize()); - EXPECT_FALSE(dict.HasKey("not_in_dict")); - EXPECT_TRUE(dict.HasKey(key_0)); - EXPECT_TRUE(dict.HasKey(key_1)); // Verify that the keys and values match PythonObject chk_value1 = dict.GetItemForKey(keys[0]); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits