[Lldb-commits] [PATCH] D78462: get rid of PythonInteger::GetInteger()

Pavel Labath via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Apr 21 03:12:42 PDT 2020


labath accepted this revision.
labath added a comment.
This revision is now accepted and ready to land.

Looks good. I'll leave it up to you to consider whether the `PySys_WriteStderr` thingy is a good idea.



================
Comment at: lldb/bindings/python/python-typemaps.swig:72
+  PythonObject obj = Retain<PythonObject>($input);
+  unsigned long long state_type_value = unwrapOrSetPythonException(As<unsigned long long>(obj)); 
+  if (PyErr_Occurred())
----------------
it looks like this line needs wrapping


================
Comment at: lldb/bindings/python/python-wrapper.swig:585-597
+    llvm::Expected<PythonObject> result = pfunc.Call(PythonString(child_name));
 
-    if (!result.IsAllocated())
-        return UINT32_MAX;
+    long long retval = unwrapOrSetPythonException(As<long long>(std::move(result)));
 
-    PythonInteger int_result = result.AsType<PythonInteger>();
-    if (!int_result.IsAllocated())
+    if (PyErr_Occurred()) { 
+        PyErr_Clear(); // FIXME print this? do something else
         return UINT32_MAX;
----------------
If you don't print this, then you could definitely do something like:
```
Expected<long long> result = As<long long>(pfunc.Call(PythonString(child_name));
if (result)
  return std::max<long long>(*result, 0);
consumeError(result.takeError());
return UINT32_MAX;
```


================
Comment at: lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp:3153-3159
+  long long py_return = unwrapOrSetPythonException(
+      As<long long>(implementor.CallMethod(callee_name)));
 
   // if it fails, print the error but otherwise go on
   if (PyErr_Occurred()) {
     PyErr_Print();
     PyErr_Clear();
----------------
lawrence_danna wrote:
> labath wrote:
> > This converts the Expected into a python exception, only to clear (and print) it at the next line. Is there a more direct way of doing it?
> I don't know, what did you have in mind?   It could just call the Python C API directly and not bother converting it into an Expected, but would that be better?
I was thinking if theres some function to print to stderr directly without doing the `PyErr` dance. `PySys_WriteStderr` maybe?

```
if (Expected<long long> py_return = As<long long>(implementor.CallMethod(callee_name)))
  result = *py_return;
else
  PySys_WriteStderr("%s", toString(py_return.takeError()).c_str());
```
?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D78462





More information about the lldb-commits mailing list