teemperor requested changes to this revision.
teemperor added a comment.
This revision now requires changes to proceed.

(Just pushing this back into Dave's review queue)



================
Comment at: lldb/include/lldb/Symbol/CompilerDeclContext.h:77
   ///     in a struct, union or class.
-  bool IsClassMethod(lldb::LanguageType *language_ptr,
-                     bool *is_instance_method_ptr,
-                     ConstString *language_object_name_ptr);
+  bool IsClassMethod(ConstString *instance_var_name_ptr = nullptr,
+                     bool *instance_is_pointer_ptr = nullptr);
----------------
jingham wrote:
> kastiglione wrote:
> > teemperor wrote:
> > > kastiglione wrote:
> > > > shafik wrote:
> > > > > If we are going to refactor this, this change does not feel very C++y 
> > > > > passing around pointers. I know we want a way to call this w/o any 
> > > > > arguments but perhaps we can write an overload for that case?
> > > > > 
> > > > > Does `instance_var_name_ptr` need to be a string? Maybe we can encode 
> > > > > it using an enum, we don't have a lot of cases `this`, `self`, maybe 
> > > > > even not a pointer as well and get ride of `instance_is_pointer_ptr`.
> > > > Something like?
> > > > 
> > > > ```
> > > > enum InstanceVariable {
> > > >    ThisPointer,
> > > >    SelfPointer,
> > > >    Self,
> > > > };
> > > > ```
> > > We could also make this function that is something like 
> > > `llvm::Optional<SelfRef> GetCurrentObjectRef` and `SelfRef` is just 
> > > ConstString + enum if it's a pointer/ref/whatever.
> > > 
> > > FWIW, encoding the string inside an enum doesn't seem to fit with the 
> > > idea that the TypeSystem interface just needs to be implemented (but not 
> > > extended) when adding a new language plugin (if the language uses a 
> > > different name like `$this` or `Self` then the enum needs to be 
> > > expanded). Also not sure what use this has to the caller (I don't see how 
> > > the callers do anything else with this enum then translating it to the 
> > > actual string and checking if it's a pointer, both are more complicated 
> > > with an enum).
> > I like this approach. Before I make the change, some questions/thoughts.
> > 
> > I'm thinking the second field will be a bool, ex: `is_pointer`. The reason 
> > for bool and not enum is that I don't know if it's worth the complexity of 
> > trying to distinguish between reference and value. In Swift, the `self` 
> > variable could be reference (`class`) or value (`struct`, `enum`…).
> > 
> > Instead of `SelfRef` I'm thinking `{This,Self,Instance}Variable`, since 
> > it's info about the variable (name, pointer-ness).
> > 
> > Do we need to return a `ConstString`, or can it be `const char *` and let 
> > the caller do what it wants. It seems it will always be a string literal, 
> > and `const char *` is a lower common denominator. I guess I'm ultimately 
> > unclear on when, if ever, to not use `ConstString`?
> ConstString's main purpose is to hold strings we're likely to compare against 
> a lot.  For instance, if you take a symbol name and you are going to look it 
> up everywhere, it's appropriate for that to be a ConstString since we're 
> going to turn it into that anyway to do the searches.
> 
> Since a caller is likely to turn around and look up "this" having gotten that 
> name back, a ConstString seems an okay choice.  Another way to do this would 
> be to make function statics with ConstStrings for "this" and "self".  When 
> you make a ConstString from a c-string we have to hash it look for it in the 
> string pool.  Copying a ConstString is just copying a pointer.  So if you 
> have just a couple of options, making static ConstStrings makes returning the 
> result cheap.  And since ConstString's are all null-terminated C-strings, 
> ConstString -> cstring is cheap.
FWIW, the available string types you could use would be:

* `llvm::StringRef` -> no ownership and cheap
* `std::string` -> ownership
* `ConstString` -> Can be very cheap or expensive depending on how you use it.
* `const char *` -> Nearly always a bad idea (exceptions are stuff that do C 
interop).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D98653

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

Reply via email to