lawrence_danna added a comment.

In D68546#1699397 <https://reviews.llvm.org/D68546#1699397>, @labath wrote:

> Yeah, the %extends are somewhat ugly, but I also find the FileSP overloads in 
> the "public" sections of the SB classes unnerving too, because they are not 
> really public -- no user can actually call them directly in a meaningful way. 
> They are really only meant for the python interface, which sort does sit on 
> the other side of the SB api, but also kind of doesn't. That's the weird part 
> about lldb python support, where python can be embedded *into* lldb, but it 
> also can be sitting *above* it (or both at the same time). I am not really 
> sure what to do about that. I don't suppose there's any way to make the 
> FileSP overloads private?


I don't think so, because the SWIG wrappers need to see them.   They are 
de-facto private though, because they require an argument of type 
`std::shared_ptr<lldb_private::File>`.
All external API clients can see is a forward declaration that 
lldb_private::File is a class.   They can make a NULL pointer to one, but 
that's it.

> Or maybe they actually should be public, and the actual problem is that there 
> is no way for a c++ user to make use of this functionality, even though it 
> should be able to? Right now, the c++ api is sort of disadvantaged in that 
> one cannot create an SBFile that would redirect to some custom fancy c++ 
> output object. I am not saying you should implement that, but if we assume 
> that such functionality were available do you think it would be possible to 
> implement the python stuff on top of that? In that sense, maybe the FileSP 
> overloads are actually fine, and we can treat them as a placeholder for this 
> hypothetical future functionality?
> 
> I am sorry if this doesn't make much sense -- that's because I myself am not 
> clear on this matter. But I hope that I at least managed to give you an idea 
> of the things going through my head right now. If you have any thoughts on 
> any of this, I'd like to hear them.

No, it does make sense.   I too thought it was kind of odd that there's a 
python API which is inaccessible from C++.      I can't really think of any 
ultimate use case where a C++ binding for File I/O callbacks would be needed, 
but if it were, I can think of three ways to do it.

The first and simplest way to support it is to just use `funopen()` or whatever 
the equivalent of that is on your platform to make a `FILE*`.    I put the 
`FILE*` constructor in for C++ even though it will never have a SWIG wrapper so 
this would be possible.    The disadvantage is that `funopen()` isn't portable, 
so clients that go this route will need platform specific code to do it.

The intermediate method would be to make our own funopen that would act as a 
factory function for `FileSP`.     File would remain private, but you could 
make one with callbacks if you wanted to.    Disadvantage here is that C++ 
clients would be calling though a chain of two function pointers to actually 
get to the Read and Write methods.   This is still better from a performance 
perspective than calling into a Python method, but if we wanted to avoid that, 
we could go one step further.

The most complicated way we could handle it would be to expose an ABI-stable 
abstract base class of `File` in the API headers.     This should be at the 
base of the File class hierarchy, where `IOObject` is now.    It would only 
have virtual methods, and it would also have a bunch of unused dummy virtual so 
we can add new virtual methods later if we need too, without changing the ABI.  
   C++ clients could then just subclass their own `File` types and use `FileSP` 
directly.     I think to do this properly we'd need to do some more 
refactoring, because I'm not sure what should happen to `IOObject` and `Socket` 
under this scenario, or what kinds of error codes the virtual methods should be 
returning.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D68546



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

Reply via email to