aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2020-04-24 19:01:04 +0100
committerGitHub <noreply@github.com>2020-04-24 19:01:04 +0100
commit5c6b2cbafef7435bd697cedf30436bf16e70dc15 (patch)
tree7fd3e809e960079aeacd66ae8a8fcfa37203e4c3
parent5e40589114c1a61825d3772165f457895fc9acd0 (diff)
parent25938500d6d0fbcd6e14d7d5ff3e45275ead6bb7 (diff)
downloadnextpnr-5c6b2cbafef7435bd697cedf30436bf16e70dc15.tar.gz
nextpnr-5c6b2cbafef7435bd697cedf30436bf16e70dc15.tar.bz2
nextpnr-5c6b2cbafef7435bd697cedf30436bf16e70dc15.zip
Merge pull request #433 from YosysHQ/dave/pyfixes
python: Miscellaneous fixes
-rw-r--r--3rdparty/python-console/modified/pyinterpreter.cc14
-rw-r--r--common/pycontainers.h7
2 files changed, 17 insertions, 4 deletions
diff --git a/3rdparty/python-console/modified/pyinterpreter.cc b/3rdparty/python-console/modified/pyinterpreter.cc
index 89c9b88c..cbb6322f 100644
--- a/3rdparty/python-console/modified/pyinterpreter.cc
+++ b/3rdparty/python-console/modified/pyinterpreter.cc
@@ -82,19 +82,29 @@ const std::list<std::string> &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;
PyObject *dum;
py_result = Py_CompileString(command.c_str(), "<stdin>", 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);
++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);
diff --git a/common/pycontainers.h b/common/pycontainers.h
index 04c670cc..2b9ee208 100644
--- a/common/pycontainers.h
+++ b/common/pycontainers.h
@@ -285,7 +285,9 @@ template <typename T1, typename T2, typename value_conv> 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<decltype(x.base.first)>().to_str(x.ctx,
+ x.base.first));
}
static int len(wrapped_pair &x) { return 2; }
@@ -410,7 +412,8 @@ template <typename T1, typename T2> struct map_pair_wrapper_uptr
if ((i >= 2) || (i < 0))
KeyError();
return (i == 1) ? object(PythonConversion::ContextualWrapper<V &>(x.ctx, *x.base.second.get()))
- : object(x.base.first);
+ : object(PythonConversion::string_converter<decltype(x.base.first)>().to_str(x.ctx,
+ x.base.first));
}
static int len(wrapped_pair &x) { return 2; }