lawrence_danna added inline comments.

================
Comment at: lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h:280
+  template <typename... Args>
+  Expected<PythonObject> CallMethod(const char *name, const char *format,
+                                    Args... args) {
----------------
labath wrote:
> Implemented like this, this method still requires one to work with python 
> types directly, and deal with things (signatures) that is better left to the 
> glue code. As this is c++, what do you think of an implementation like:
> ```
> template<typename T, typename Enable = void> struct PythonFormat;
> template<> struct PythonFormat<unsigned long long> {
>     static constexpr char format = 'K';
>     static auto get(unsigned long long value) { return value; }
> };
> template<typename T>
> struct PythonFormat<T,
>         typename std::enable_if<
>             std::is_base_of<PythonObject ,T>::value>::type> {
>     static constexpr char format = 'O';
>     static auto get(const T &value) { return value.get(); }
> };
> // etc.
> 
> template<typename... T>
> Expected<PythonObject> CallMethod(const char *name, const T &... t) {
>     const char format[] = { '(', PythonEncoding<T>::format..., ')'};
>     PyObject *obj = PyObject_CallMethod(m_py_obj, name, format, 
> PythonFormat<T>::get(t)...);
>     ...
> }
> ```
> This should make calling a python method as close to calling a native one as 
> possible. The main downside of that is that it is impossible to use fancier 
> formats like `s#`. If we really wanted to, we could make that work too (at 
> the expense of a fairly large increase in template complexity), but it 
> doesn't look like you need to call any fancy method now anyway.
oh, yea i like that idea.


================
Comment at: lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h:347
+                                     "type error");
+    return T(PyRefType::Borrowed, std::move(obj.get()));
+  } else {
----------------
labath wrote:
> Are you sure this std::move actually does anything -- I see no applicable 
> rvalue constructor
It doesn't do anything yet, but it's conceptually correct and it will do 
something when refactor the PythonObject classes to get rid of the virtual 
methods.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D68547/new/

https://reviews.llvm.org/D68547



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to