[lldb] Remove lexical block and fix formatting LoadScriptingModule (NFC)

This commit is contained in:
Jonas Devlieghere
2020-10-13 21:45:56 -07:00
parent 1197ee35b8
commit 3b33b41604

View File

@@ -2734,6 +2734,8 @@ uint64_t replace_all(std::string &str, const std::string &oldStr,
bool ScriptInterpreterPythonImpl::LoadScriptingModule(
const char *pathname, bool init_session, lldb_private::Status &error,
StructuredData::ObjectSP *module_sp) {
namespace fs = llvm::sys::fs;
if (!pathname || !pathname[0]) {
error.SetErrorString("invalid pathname");
return false;
@@ -2741,142 +2743,137 @@ bool ScriptInterpreterPythonImpl::LoadScriptingModule(
lldb::DebuggerSP debugger_sp = m_debugger.shared_from_this();
{
FileSpec target_file(pathname);
FileSystem::Instance().Resolve(target_file);
FileSystem::Instance().Collect(target_file);
std::string basename(target_file.GetFilename().GetCString());
FileSpec target_file(pathname);
FileSystem::Instance().Resolve(target_file);
FileSystem::Instance().Collect(target_file);
std::string basename(target_file.GetFilename().GetCString());
StreamString command_stream;
// Before executing Python code, lock the GIL.
Locker py_lock(this,
Locker::AcquireLock |
(init_session ? Locker::InitSession : 0) | Locker::NoSTDIN,
Locker::FreeAcquiredLock |
(init_session ? Locker::TearDownSession : 0));
fs::file_status st;
std::error_code ec = status(target_file.GetPath(), st);
if (ec || st.type() == fs::file_type::status_error ||
st.type() == fs::file_type::type_unknown ||
st.type() == fs::file_type::file_not_found) {
// if not a valid file of any sort, check if it might be a filename still
// dot can't be used but / and \ can, and if either is found, reject
if (strchr(pathname, '\\') || strchr(pathname, '/')) {
error.SetErrorString("invalid pathname");
return false;
}
basename = pathname; // not a filename, probably a package of some sort,
// let it go through
} else if (is_directory(st) || is_regular_file(st)) {
if (target_file.GetDirectory().IsEmpty()) {
error.SetErrorString("invalid directory name");
return false;
}
std::string directory = target_file.GetDirectory().GetCString();
replace_all(directory, "\\", "\\\\");
replace_all(directory, "'", "\\'");
// now make sure that Python has "directory" in the search path
StreamString command_stream;
command_stream.Printf("if not (sys.path.__contains__('%s')):\n "
"sys.path.insert(1,'%s');\n\n",
directory.c_str(), directory.c_str());
bool syspath_retval =
ExecuteMultipleLines(command_stream.GetData(),
ScriptInterpreter::ExecuteScriptOptions()
.SetEnableIO(false)
.SetSetLLDBGlobals(false))
.Success();
if (!syspath_retval) {
error.SetErrorString("Python sys.path handling failed");
return false;
}
// Before executing Python code, lock the GIL.
Locker py_lock(this,
Locker::AcquireLock |
(init_session ? Locker::InitSession : 0) |
Locker::NoSTDIN,
Locker::FreeAcquiredLock |
(init_session ? Locker::TearDownSession : 0));
namespace fs = llvm::sys::fs;
fs::file_status st;
std::error_code ec = status(target_file.GetPath(), st);
} else {
error.SetErrorString("no known way to import this module specification");
return false;
}
if (ec || st.type() == fs::file_type::status_error ||
st.type() == fs::file_type::type_unknown ||
st.type() == fs::file_type::file_not_found) {
// if not a valid file of any sort, check if it might be a filename still
// dot can't be used but / and \ can, and if either is found, reject
if (strchr(pathname, '\\') || strchr(pathname, '/')) {
error.SetErrorString("invalid pathname");
return false;
}
basename = pathname; // not a filename, probably a package of some sort,
// let it go through
} else if (is_directory(st) || is_regular_file(st)) {
if (target_file.GetDirectory().IsEmpty()) {
error.SetErrorString("invalid directory name");
return false;
}
// Strip .py or .pyc extension
llvm::StringRef extension = target_file.GetFileNameExtension().GetCString();
if (!extension.empty()) {
if (extension == ".py")
basename.resize(basename.length() - 3);
else if (extension == ".pyc")
basename.resize(basename.length() - 4);
}
std::string directory = target_file.GetDirectory().GetCString();
replace_all(directory, "\\", "\\\\");
replace_all(directory, "'", "\\'");
// check if the module is already import-ed
command_stream.Clear();
command_stream.Printf("sys.modules.__contains__('%s')", basename.c_str());
bool does_contain = false;
// this call will succeed if the module was ever imported in any Debugger
// in the lifetime of the process in which this LLDB framework is living
bool was_imported_globally =
(ExecuteOneLineWithReturn(
command_stream.GetData(),
ScriptInterpreterPythonImpl::eScriptReturnTypeBool, &does_contain,
ScriptInterpreter::ExecuteScriptOptions()
.SetEnableIO(false)
.SetSetLLDBGlobals(false)) &&
does_contain);
// this call will fail if the module was not imported in this Debugger
// before
command_stream.Clear();
command_stream.Printf("sys.getrefcount(%s)", basename.c_str());
bool was_imported_locally = GetSessionDictionary()
.GetItemForKey(PythonString(basename))
.IsAllocated();
// now make sure that Python has "directory" in the search path
StreamString command_stream;
command_stream.Printf("if not (sys.path.__contains__('%s')):\n "
"sys.path.insert(1,'%s');\n\n",
directory.c_str(), directory.c_str());
bool syspath_retval =
ExecuteMultipleLines(command_stream.GetData(),
bool was_imported = (was_imported_globally || was_imported_locally);
// now actually do the import
command_stream.Clear();
if (was_imported) {
if (!was_imported_locally)
command_stream.Printf("import %s ; reload_module(%s)", basename.c_str(),
basename.c_str());
else
command_stream.Printf("reload_module(%s)", basename.c_str());
} else
command_stream.Printf("import %s", basename.c_str());
error = ExecuteMultipleLines(command_stream.GetData(),
ScriptInterpreter::ExecuteScriptOptions()
.SetEnableIO(false)
.SetSetLLDBGlobals(false))
.Success();
if (!syspath_retval) {
error.SetErrorString("Python sys.path handling failed");
return false;
}
.SetSetLLDBGlobals(false));
if (error.Fail())
return false;
} else {
error.SetErrorString("no known way to import this module specification");
return false;
}
// Strip .py or .pyc extension
llvm::StringRef extension = target_file.GetFileNameExtension().GetCString();
if (!extension.empty()) {
if (extension == ".py")
basename.resize(basename.length() - 3);
else if (extension == ".pyc")
basename.resize(basename.length() - 4);
}
// check if the module is already import-ed
command_stream.Clear();
command_stream.Printf("sys.modules.__contains__('%s')", basename.c_str());
bool does_contain = false;
// this call will succeed if the module was ever imported in any Debugger
// in the lifetime of the process in which this LLDB framework is living
bool was_imported_globally =
(ExecuteOneLineWithReturn(
command_stream.GetData(),
ScriptInterpreterPythonImpl::eScriptReturnTypeBool, &does_contain,
ScriptInterpreter::ExecuteScriptOptions()
.SetEnableIO(false)
.SetSetLLDBGlobals(false)) &&
does_contain);
// this call will fail if the module was not imported in this Debugger
// before
command_stream.Clear();
command_stream.Printf("sys.getrefcount(%s)", basename.c_str());
bool was_imported_locally = GetSessionDictionary()
.GetItemForKey(PythonString(basename))
.IsAllocated();
bool was_imported = (was_imported_globally || was_imported_locally);
// now actually do the import
command_stream.Clear();
if (was_imported) {
if (!was_imported_locally)
command_stream.Printf("import %s ; reload_module(%s)", basename.c_str(),
basename.c_str());
else
command_stream.Printf("reload_module(%s)", basename.c_str());
} else
command_stream.Printf("import %s", basename.c_str());
error = ExecuteMultipleLines(command_stream.GetData(),
ScriptInterpreter::ExecuteScriptOptions()
.SetEnableIO(false)
.SetSetLLDBGlobals(false));
if (error.Fail())
return false;
// if we are here, everything worked
// call __lldb_init_module(debugger,dict)
if (!LLDBSwigPythonCallModuleInit(basename.c_str(),
m_dictionary_name.c_str(), debugger_sp)) {
error.SetErrorString("calling __lldb_init_module failed");
return false;
}
if (module_sp) {
// everything went just great, now set the module object
command_stream.Clear();
command_stream.Printf("%s", basename.c_str());
void *module_pyobj = nullptr;
if (ExecuteOneLineWithReturn(
command_stream.GetData(),
ScriptInterpreter::eScriptReturnTypeOpaqueObject,
&module_pyobj) &&
module_pyobj)
*module_sp = std::make_shared<StructuredPythonObject>(module_pyobj);
}
return true;
// if we are here, everything worked
// call __lldb_init_module(debugger,dict)
if (!LLDBSwigPythonCallModuleInit(basename.c_str(), m_dictionary_name.c_str(),
debugger_sp)) {
error.SetErrorString("calling __lldb_init_module failed");
return false;
}
if (module_sp) {
// everything went just great, now set the module object
command_stream.Clear();
command_stream.Printf("%s", basename.c_str());
void *module_pyobj = nullptr;
if (ExecuteOneLineWithReturn(
command_stream.GetData(),
ScriptInterpreter::eScriptReturnTypeOpaqueObject, &module_pyobj) &&
module_pyobj)
*module_sp = std::make_shared<StructuredPythonObject>(module_pyobj);
}
return true;
}
bool ScriptInterpreterPythonImpl::IsReservedWord(const char *word) {