mib marked 9 inline comments as done.
mib added inline comments.

================
Comment at: lldb/source/Plugins/Process/scripted/ScriptedThread.cpp:49
 
+  void *instance_obj = nullptr;
+  if (script_object)
----------------
labath wrote:
> This is when things start to get fuzzy, as this function seems to support 
> both a nullptr and a non-nullptr argument. Not necessarily bad, but it makes 
> reasoning about anything harder. It'd be better if this function could always 
> be called with a valid object.
I understand but even if it might be possible to do it for ScriptedThreads, we 
want to give the user multiple way of creating them (in lldb or directly from 
python).


================
Comment at: 
lldb/source/Plugins/ScriptInterpreter/Python/ScriptedThreadPythonInterface.cpp:47
+  if (!instance_obj) {
+    instance_obj = LLDBSwigPythonCreateScriptedThread(
+        class_name.str().c_str(), m_interpreter.GetDictionaryName(), 
process_sp,
----------------
labath wrote:
> Now it gets really confusing. *If* `instance_obj` was non-null, then it will 
> point to an object which is not owned by this function. *If* it was null, 
> then it set to point to an object which *is* owned (or at least *should be* 
> owned -- as noone else owns it) by this function.
> 
> This doesn't seem correct to me, but even if it is, it sure is confusing.
Correct, when `instance_obj` is null at entry, it gets allocated by  
`LLDBSwigPythonCreateScriptedThread` which creates an owned reference as you 
mentioned in https://reviews.llvm.org/D117065#inline-1120555, and that 
reference gets passed to `m_object_instance_sp`.

So in my understanding, at this stage, instance_obj `use_count() == 1`.


================
Comment at: 
lldb/source/Plugins/ScriptInterpreter/Python/ScriptedThreadPythonInterface.cpp:56
   m_object_instance_sp =
-      StructuredData::GenericSP(new StructuredPythonObject(ret_val));
+      StructuredData::GenericSP(new StructuredPythonObject(instance_obj));
 
----------------
labath wrote:
> now this maybe-owned reference gets passed into a `StructuredPythonObject` 
> which assumes it is getting a borrowed reference (it does an incref).
> 
> That seems correct in the instance_obj@entry != nullptr case, but not in the 
> other one (=> leak).
I might be missing something but I don't understand why does the 
`StructuredPythonObject` **expects** a borrowed reference ?
Why can't it wrap an owned reference ?

I think checking the `PyObject` type (Borrowed/Owned) on the 
`StructuredPythonObject` constructor would allow us to `incref` it only in the 
case of a borrowed ref, and fix the leak in the case of an owned ref, right ?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D117071

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

Reply via email to