diff options
| author | Zachary Turner <zturner@google.com> | 2015-04-09 18:08:50 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2015-04-09 18:08:50 +0000 |
| commit | 4e8ddf53337ba922e85681400c16d51ef43ccd0a (patch) | |
| tree | 582dddbd4b632a06ffbd7dd661fb79445ab108bd /lldb/source | |
| parent | 37099d9afd9b08cea378f1c8b03d6160d4dc3e35 (diff) | |
| download | bcm5719-llvm-4e8ddf53337ba922e85681400c16d51ef43ccd0a.tar.gz bcm5719-llvm-4e8ddf53337ba922e85681400c16d51ef43ccd0a.zip | |
[Python] Fix issue configuring sys.path during startup.
Previously, users on Windows had to manually specify PYTHONPATH
to point to the site-packages directory before running LLDB.
The reason for this was because sys.path was being initialized
with a path containing unescaped backslashes, causing escape
sequences to end up in the paths.
llvm-svn: 234516
Diffstat (limited to 'lldb/source')
| -rw-r--r-- | lldb/source/Host/common/FileSpec.cpp | 20 | ||||
| -rw-r--r-- | lldb/source/Host/windows/HostInfoWindows.cpp | 14 | ||||
| -rw-r--r-- | lldb/source/Interpreter/ScriptInterpreterPython.cpp | 57 |
3 files changed, 51 insertions, 40 deletions
diff --git a/lldb/source/Host/common/FileSpec.cpp b/lldb/source/Host/common/FileSpec.cpp index a968dd93b61..a3f5e6d7c10 100644 --- a/lldb/source/Host/common/FileSpec.cpp +++ b/lldb/source/Host/common/FileSpec.cpp @@ -798,17 +798,23 @@ FileSpec::GetPath(char *path, size_t path_max_len, bool denormalize) const } std::string -FileSpec::GetPath (bool denormalize) const +FileSpec::GetPath(bool denormalize) const { llvm::SmallString<64> result; + GetPath(result, denormalize); + return std::string(result.begin(), result.end()); +} + +void +FileSpec::GetPath(llvm::SmallVectorImpl<char> &path, bool denormalize) const +{ if (m_directory) - result.append(m_directory.GetCString()); + path.append(m_directory.GetCString(), m_directory.GetCString() + m_directory.GetLength()); if (m_filename) - llvm::sys::path::append(result, m_filename.GetCString()); - if (denormalize && !result.empty()) - DeNormalize(result, m_syntax); - - return std::string(result.begin(), result.end()); + llvm::sys::path::append(path, m_filename.GetCString()); + Normalize(path, m_syntax); + if (denormalize && !path.empty()) + DeNormalize(path, m_syntax); } ConstString diff --git a/lldb/source/Host/windows/HostInfoWindows.cpp b/lldb/source/Host/windows/HostInfoWindows.cpp index b22920df226..b1c880f0ffe 100644 --- a/lldb/source/Host/windows/HostInfoWindows.cpp +++ b/lldb/source/Host/windows/HostInfoWindows.cpp @@ -13,7 +13,9 @@ #include "lldb/Host/windows/HostInfoWindows.h" #include "llvm/ADT/SmallString.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Support/Path.h" using namespace lldb_private; @@ -107,11 +109,11 @@ HostInfoWindows::ComputePythonDirectory(FileSpec &file_spec) FileSpec lldb_file_spec; if (!GetLLDBPath(lldb::ePathTypeLLDBShlibDir, lldb_file_spec)) return false; - - char raw_path[PATH_MAX]; - lldb_file_spec.AppendPathComponent("../lib/site-packages"); - lldb_file_spec.GetPath(raw_path, sizeof(raw_path)); - - file_spec.GetDirectory().SetCString(raw_path); + llvm::SmallString<64> path; + lldb_file_spec.GetPath(path); + llvm::sys::path::remove_filename(path); + llvm::sys::path::append(path, "lib", "site-packages"); + std::replace(path.begin(), path.end(), '\\', '/'); + file_spec.GetDirectory().SetString(path.c_str()); return true; } diff --git a/lldb/source/Interpreter/ScriptInterpreterPython.cpp b/lldb/source/Interpreter/ScriptInterpreterPython.cpp index f8532e7e8c0..099cbaa0ced 100644 --- a/lldb/source/Interpreter/ScriptInterpreterPython.cpp +++ b/lldb/source/Interpreter/ScriptInterpreterPython.cpp @@ -3044,36 +3044,17 @@ ScriptInterpreterPython::InitializePrivate () // Update the path python uses to search for modules to include the current directory. PyRun_SimpleString ("import sys"); - PyRun_SimpleString ("sys.path.append ('.')"); - - // Find the module that owns this code and use that path we get to - // set the sys.path appropriately. + AddToSysPath(AddLocation::End, "."); FileSpec file_spec; - char python_dir_path[PATH_MAX]; + // Don't denormalize paths when calling file_spec.GetPath(). On platforms that use + // a backslash as the path separator, this will result in executing python code containing + // paths with unescaped backslashes. But Python also accepts forward slashes, so to make + // life easier we just use that. if (HostInfo::GetLLDBPath(ePathTypePythonDir, file_spec)) - { - std::string python_path("sys.path.insert(0,\""); - size_t orig_len = python_path.length(); - if (file_spec.GetPath(python_dir_path, sizeof (python_dir_path))) - { - python_path.append (python_dir_path); - python_path.append ("\")"); - PyRun_SimpleString (python_path.c_str()); - python_path.resize (orig_len); - } - - if (HostInfo::GetLLDBPath(ePathTypeLLDBShlibDir, file_spec)) - { - if (file_spec.GetPath(python_dir_path, sizeof (python_dir_path))) - { - python_path.append (python_dir_path); - python_path.append ("\")"); - PyRun_SimpleString (python_path.c_str()); - python_path.resize (orig_len); - } - } - } + AddToSysPath(AddLocation::Beginning, file_spec.GetPath(false)); + if (HostInfo::GetLLDBPath(ePathTypeLLDBShlibDir, file_spec)) + AddToSysPath(AddLocation::Beginning, file_spec.GetPath(false)); PyRun_SimpleString ("sys.dont_write_bytecode = 1; import lldb.embedded_interpreter; from lldb.embedded_interpreter import run_python_interpreter; from lldb.embedded_interpreter import run_one_line"); @@ -3089,6 +3070,28 @@ ScriptInterpreterPython::InitializePrivate () stdin_tty_state.Restore(); } +void +ScriptInterpreterPython::AddToSysPath(AddLocation location, std::string path) +{ + std::string path_copy; + + std::string statement; + if (location == AddLocation::Beginning) + { + statement.assign("sys.path.insert(0,\""); + statement.append (path); + statement.append ("\")"); + } + else + { + statement.assign("sys.path.append(\""); + statement.append(path); + statement.append("\")"); + } + PyRun_SimpleString (statement.c_str()); +} + + //void //ScriptInterpreterPython::Terminate () //{ |

