From fd099cef52a2ef7a83bc3f68d6e7ed736516978e Mon Sep 17 00:00:00 2001 From: David Shah Date: Fri, 24 Apr 2020 16:31:08 +0100 Subject: [PATCH 1/4] python: Wrap map IdString key when accessed by index Signed-off-by: David Shah --- common/pycontainers.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/pycontainers.h b/common/pycontainers.h index 04c670cc..3584b45e 100644 --- a/common/pycontainers.h +++ b/common/pycontainers.h @@ -410,7 +410,8 @@ template struct map_pair_wrapper_uptr if ((i >= 2) || (i < 0)) KeyError(); return (i == 1) ? object(PythonConversion::ContextualWrapper(x.ctx, *x.base.second.get())) - : object(x.base.first); + : object(PythonConversion::string_converter().to_str(x.ctx, + x.base.first)); } static int len(wrapped_pair &x) { return 2; } From 5024fc06905476d9bf49c28350ae9fef83953519 Mon Sep 17 00:00:00 2001 From: David Shah Date: Fri, 24 Apr 2020 16:41:13 +0100 Subject: [PATCH 2/4] python: Escape strings for autocomplete Signed-off-by: David Shah --- 3rdparty/python-console/modified/pyinterpreter.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/3rdparty/python-console/modified/pyinterpreter.cc b/3rdparty/python-console/modified/pyinterpreter.cc index 89c9b88c..958049b9 100644 --- a/3rdparty/python-console/modified/pyinterpreter.cc +++ b/3rdparty/python-console/modified/pyinterpreter.cc @@ -82,7 +82,13 @@ const std::list &pyinterpreter_suggest(const std::string &hint) PyEval_AcquireThread(m_threadState); m_suggestions.clear(); int i = 0; - std::string command = string_format("sys.completer.complete('%s', %d)\n", hint.c_str(), i); + std::string escaped; + for (char c : hint) { + if (c == '\'' || c == '\\') + escaped += '\\'; + escaped += c; + } + std::string command = string_format("sys.completer.complete('%s', %d)\n", escaped.c_str(), i); std::string res; do { PyObject *py_result; @@ -94,7 +100,7 @@ const std::list &pyinterpreter_suggest(const std::string &hint) res = redirector_take_output(m_threadState); ++i; - command = string_format("sys.completer.complete('%s', %d)\n", hint.c_str(), i); + command = string_format("sys.completer.complete('%s', %d)\n", escaped.c_str(), i); if (res.size()) { // throw away the newline res = res.substr(1, res.size() - 3); From 8f1683246ed5493f131a530025d6c076142f6291 Mon Sep 17 00:00:00 2001 From: David Shah Date: Fri, 24 Apr 2020 16:44:30 +0100 Subject: [PATCH 3/4] python: Improve general robustness during autocomplete Signed-off-by: David Shah --- 3rdparty/python-console/modified/pyinterpreter.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/3rdparty/python-console/modified/pyinterpreter.cc b/3rdparty/python-console/modified/pyinterpreter.cc index 958049b9..cbb6322f 100644 --- a/3rdparty/python-console/modified/pyinterpreter.cc +++ b/3rdparty/python-console/modified/pyinterpreter.cc @@ -94,7 +94,11 @@ const std::list &pyinterpreter_suggest(const std::string &hint) PyObject *py_result; PyObject *dum; py_result = Py_CompileString(command.c_str(), "", Py_single_input); + if (py_result == nullptr) + break; dum = PyEval_EvalCode(py_result, glb, loc); + if (dum == nullptr) + break; Py_XDECREF(dum); Py_XDECREF(py_result); res = redirector_take_output(m_threadState); From 25938500d6d0fbcd6e14d7d5ff3e45275ead6bb7 Mon Sep 17 00:00:00 2001 From: David Shah Date: Fri, 24 Apr 2020 18:23:03 +0100 Subject: [PATCH 4/4] python: Also convert regular map keys to string Signed-off-by: David Shah --- common/pycontainers.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/pycontainers.h b/common/pycontainers.h index 3584b45e..2b9ee208 100644 --- a/common/pycontainers.h +++ b/common/pycontainers.h @@ -285,7 +285,9 @@ template struct map_pair_wrapper { if ((i >= 2) || (i < 0)) KeyError(); - return (i == 1) ? object(value_conv()(x.ctx, x.base.second)) : object(x.base.first); + return (i == 1) ? object(value_conv()(x.ctx, x.base.second)) + : object(PythonConversion::string_converter().to_str(x.ctx, + x.base.first)); } static int len(wrapped_pair &x) { return 2; }