lawrence_danna marked 2 inline comments as done.
lawrence_danna added inline comments.


================
Comment at: lldb/include/lldb/API/SBFile.h:16-21
+/* These tags make no difference at the c++ level, but
+ * when the constructors are called from python they control
+ * how python files are converted by SWIG into FileSP */
+struct FileBorrow {};
+struct FileForceScriptingIO {};
+struct FileBorrowAndForceScriptingIO {};
----------------
labath wrote:
> lawrence_danna wrote:
> > labath wrote:
> > > I don't think we have anything similar to this in any of our SB classes. 
> > > It might be better to avoid it. Could the same thing be achieved e.g. 
> > > with a static factory function (`static SBFile SBFile::Create(FileSP 
> > > file_sp, bool borrow, bool force_scripting_io)`) ?
> > I don't think it can be done that way, because we want those bools to 
> > control how the python object is translated into a C++ object, so we need a 
> > different swig wrapper for each possibility, which means we need a 
> > different c++ function to wrap  for each possibility.
> > 
> > One way around this would be to have SWIG translate the python object into 
> > an intermediate object that just takes a reference, and then perform 
> > further translation inside the SB layer.    But we can't do that either, 
> > because scripting support is not part of the base LLDB library, it's a 
> > plugin.    And in fact Xcode ships two versions of the plugin, one for 
> > python2 and one for python3.    The SB needs to be agnostic about different 
> > versions of python, so it can't do the translation itself.   
> Are you sure about that? Swig allows you to define typemaps for sequences of 
> values. This example is taken from the swig documentation:
> ```
> %typemap(in) (char *str, int len) {
>     $1 = PyString_AsString($input);   /* char *str */
>     $2 = PyString_Size($input);       /* int len   */
> }
> ```
> It seems to me that your typemap could switch on the value of the flag at 
> runtime rather than having compile time switching by swig. This way you 
> wouldn't even need a static function, you could just have an additional 
> constructor with two extra bool arguments.
> 
> However, if this is not the preferred syntax for some reason, then we could 
> also have a set of static functions, one for each flag combination, do the 
> conversion that way.
> 
> (BTW, the main reason I am trying to avoid the tag structs is because they 
> are wading into uncharted territory in terms of our SB coding guidelines 
> <https://lldb.llvm.org/resources/sbapi.html>)
I really do think it can't be done with swig.   You can group multiple 
arguments together on the C++ side, but not on the python side.    

I think I did find a reasonable way to deal with it though without uglying up 
the SB headers with those tags.   I added some statics with %extend, and then 
wrapped them with a python-friendly classmethod called Create, with both flags 
as keyword args.    

How's that look?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D68188



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

Reply via email to