From fac939e918558d88b80561e764989e95a5576b1c Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Tue, 18 Sep 2012 21:53:02 +0000 Subject: [PATCH] Fixing a problem where a Python command created in the same module where the target function is defined causes the help string not to come out llvm-svn: 164172 --- lldb/include/lldb/Interpreter/CommandObject.h | 2 +- .../lldb/Interpreter/ScriptInterpreter.h | 7 +++-- .../Interpreter/ScriptInterpreterPython.h | 4 +-- .../source/Commands/CommandObjectCommands.cpp | 28 +++++++++++++------ .../Interpreter/ScriptInterpreterPython.cpp | 17 ++++++++--- 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/lldb/include/lldb/Interpreter/CommandObject.h b/lldb/include/lldb/Interpreter/CommandObject.h index 76936c4c26be..54eaa8f9aa90 100644 --- a/lldb/include/lldb/Interpreter/CommandObject.h +++ b/lldb/include/lldb/Interpreter/CommandObject.h @@ -99,7 +99,7 @@ public: const char * GetHelp (); - const char * + virtual const char * GetHelpLong (); const char * diff --git a/lldb/include/lldb/Interpreter/ScriptInterpreter.h b/lldb/include/lldb/Interpreter/ScriptInterpreter.h index 1c0dcf7ec827..1ccab0d21afa 100644 --- a/lldb/include/lldb/Interpreter/ScriptInterpreter.h +++ b/lldb/include/lldb/Interpreter/ScriptInterpreter.h @@ -298,10 +298,11 @@ public: return false; } - virtual std::string - GetDocumentationForItem (const char* item) + virtual bool + GetDocumentationForItem (const char* item, std::string& dest) { - return std::string(""); + dest.clear(); + return false; } virtual bool diff --git a/lldb/include/lldb/Interpreter/ScriptInterpreterPython.h b/lldb/include/lldb/Interpreter/ScriptInterpreterPython.h index 7bc49a7a7d9b..c2105c76c04c 100644 --- a/lldb/include/lldb/Interpreter/ScriptInterpreterPython.h +++ b/lldb/include/lldb/Interpreter/ScriptInterpreterPython.h @@ -149,8 +149,8 @@ public: lldb::ScriptInterpreterObjectSP& callee_wrapper_sp, std::string& retval); - virtual std::string - GetDocumentationForItem (const char* item); + virtual bool + GetDocumentationForItem (const char* item, std::string& dest); virtual bool LoadScriptingModule (const char* filename, diff --git a/lldb/source/Commands/CommandObjectCommands.cpp b/lldb/source/Commands/CommandObjectCommands.cpp index a1a65ae4c91c..64f80a0f51da 100644 --- a/lldb/source/Commands/CommandObjectCommands.cpp +++ b/lldb/source/Commands/CommandObjectCommands.cpp @@ -1162,6 +1162,7 @@ class CommandObjectPythonFunction : public CommandObjectRaw private: std::string m_function_name; ScriptedCommandSynchronicity m_synchro; + bool m_fetched_help_long; public: @@ -1174,15 +1175,9 @@ public: (std::string("Run Python function ") + funct).c_str(), NULL), m_function_name(funct), - m_synchro(synch) + m_synchro(synch), + m_fetched_help_long(false) { - ScriptInterpreter* scripter = m_interpreter.GetScriptInterpreter(); - if (scripter) - { - std::string docstring = scripter->GetDocumentationForItem(funct.c_str()); - if (!docstring.empty()) - SetHelpLong(docstring); - } } virtual @@ -1208,6 +1203,23 @@ public: return m_synchro; } + virtual const char * + GetHelpLong () + { + if (!m_fetched_help_long) + { + ScriptInterpreter* scripter = m_interpreter.GetScriptInterpreter(); + if (scripter) + { + std::string docstring; + m_fetched_help_long = scripter->GetDocumentationForItem(m_function_name.c_str(),docstring); + if (!docstring.empty()) + SetHelpLong(docstring); + } + } + return CommandObjectRaw::GetHelpLong(); + } + protected: virtual bool DoExecute (const char *raw_command_line, CommandReturnObject &result) diff --git a/lldb/source/Interpreter/ScriptInterpreterPython.cpp b/lldb/source/Interpreter/ScriptInterpreterPython.cpp index fec70e301cc5..d0858739b12c 100644 --- a/lldb/source/Interpreter/ScriptInterpreterPython.cpp +++ b/lldb/source/Interpreter/ScriptInterpreterPython.cpp @@ -2542,9 +2542,12 @@ ScriptInterpreterPython::RunScriptBasedCommand(const char* impl_function, // in Python, a special attribute __doc__ contains the docstring // for an object (function, method, class, ...) if any is defined // Otherwise, the attribute's value is None -std::string -ScriptInterpreterPython::GetDocumentationForItem(const char* item) +bool +ScriptInterpreterPython::GetDocumentationForItem(const char* item, std::string& dest) { + dest.clear(); + if (!item || !*item) + return false; std::string command(item); command += ".__doc__"; @@ -2554,10 +2557,16 @@ ScriptInterpreterPython::GetDocumentationForItem(const char* item) ScriptInterpreter::eScriptReturnTypeCharStrOrNone, &result_ptr, false) && result_ptr) { - return std::string(result_ptr); + dest.assign(result_ptr); + return true; } else - return std::string(""); + { + StreamString str_stream; + str_stream.Printf("Function %s was not found. Containing module might be missing.",item); + dest.assign(str_stream.GetData()); + return false; + } } void -- GitLab