amccarth accepted this revision.
amccarth added a comment.

In D60667#1467970 <https://reviews.llvm.org/D60667#1467970>, @teemperor wrote:

> In D60667#1467387 <https://reviews.llvm.org/D60667#1467387>, @amccarth wrote:
>
> > I, too, have some concern that this could have unintended side effects.  To 
> > make the temporary `StringRef`s from the zero-terminated strings requires a 
> > `strlen` call each time.  So we're making two passes over a string each 
> > time (once to measure and once to compare).  Granted, these are mostly very 
> > short.
>
>
> I think I'm not understanding something here. There is one `strlen` call to 
> make the StringRef from the literal, but I don't see why we need a second one 
> to compare (as StringRef and ConstString both store the string length and 
> don't recompute it when comparing). Simple godbolt test case here: 
> https://godbolt.org/z/9X1RRt So both the old and new version both require one 
> `strlen` call from what I can see (which is anyway optimized out for 
> comparing against literals).


I didn't mean to imply that `strlen` is called twice.  My point was that there 
are two linear passes over the string literal:  The first is the call to 
`strlen` to make the StringRef, and the second is the actual string comparison.

> 
> 
>> I'd love to see the static const variables for the short constant strings, 
>> just to weigh readability hit.
> 
> I can maybe make a new revision to show this, but I hope it's obvious from 
> looking at the code that I changed in this revision. Also there are the 
> problems/style difficulties that hopefully don't need a full revision to see:
> 
> 1. We preferable want to have variables with the same name as the string 
> content, but often the strings contain reserved words or words that don't 
> translate into our lower_case_code_style so that's not possible. E.g. `var == 
> this_` is not really as readable as `var == "this"` (and it looks like a 
> typo). Same with stuff like `if (arg_type.GetTypeName() == "bool")` vs `if 
> (arg_type.GetTypeName() == bool_)` or `image_infos[i].segments[k].name == 
> ConstString("__TEXT"))` vs `image_infos[i].segments[k].name == text)`.
> 2. We get a bunch of local variables that just bloat the code: ``` if 
> (descriptor->IsCFType()) { ConstString type_name(valobj.GetTypeName()); if 
> (type_name == "__CFMutableBitVector" || type_name == "__CFBitVector" || 
> type_name == "CFMutableBitVectorRef" || type_name == "CFBitVectorRef") {
> 
> 
> 
>       if (valobj.IsPointerType())
>         is_type_ok = true;
>     }
>   }
> 
>   becomes this
> 
> 
>   if (descriptor->IsCFType()) {
>     ConstString type_name(valobj.GetTypeName());
>     static const ConstString cf_mutable_bit_vector("__CFMutableBitVector"),
>                              cf_bit_vector("__CFBitVector"),
>                              
> cf_mutable_bit_vector_ref("CFMutableBitVectorRef"),
>                              cf_bit_vector_ref("CFBitVectorRef")
>     if (type_name == cf_mutable_bit_vector || type_name == cf_bit_vector ||
>         type_name == cf_mutable_bit_vector_ref || type_name == 
> cf_bit_vector_ref) {
>       if (valobj.IsPointerType())
>         is_type_ok = true;
>     }
>   }
> 
>   3. Code becomes much harder to grep. E.g. if I want to check for the 
> location where we filter the `this` variable from the local variables, I can 
> currently do `git grep "\"this\"" | grep ==` and directly see where we do the 
> comparison. But with local variables I have to do some funky grep with 
> context filtering. In general grepping for these string literals without a 
> few lines of context will be pointless with ConstString variables for 
> literals.

Fair enough.  Thanks for the details.


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

https://reviews.llvm.org/D60667



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

Reply via email to