zturner added inline comments.

================
Comment at: source/Host/common/FileSpec.cpp:1394
+  assert(
+      (Style.empty() || Style.equals_lower("F") || Style.equals_lower("D")) &&
+      "Invalid FileSpec style!");
----------------
clayborg wrote:
> zturner wrote:
> > clayborg wrote:
> > > If we are going to not care about case I would say we should use lower 
> > > case in our initial usages of this formatter.
> > > 
> > > This leads to another question: should we allow format strings to be 
> > > specified with longer names and that all formatv strings can be minimally 
> > > specified like the LLDB command names? Then we can choose more 
> > > descriptive names  like "filename" and "directory" which can be shortened 
> > > to "f" and "d" since they minimally match. The main issue with this is if 
> > > you wanted to add another format flavor that starts with any letter that 
> > > already matches, like say we wanted to later add "filename-no-extension". 
> > > We could say that the first in the list that partially matches would 
> > > always win. This would mean that when adding support for a new flavor you 
> > > would always need to add it to the end of the list. This can help keeps 
> > > things more readable in the ::format functions while allowing users to 
> > > also be explicit if they need to.
> > > 
> > > It would be nice to avoid asserts if possible in the logging ::format 
> > > code as if we ever open up the logging to users somehow (uncontrolled 
> > > input), we don't want to crash. I would rather see something in the 
> > > output like "invalid format style 'ffff' for lldb_private::FileSpec" just 
> > > to be safe. The user will see this output and it would be nice not to 
> > > crash.
> > I'm sort of ambivalent about long option names in the way you suggest.  It 
> > definitely allows for less cryptic format strings, but on the other hand 
> > with our 80-column limit, with run the risk of leading to additional levels 
> > of wrapping which could reduce readability.  That said, it's easy to modify 
> > these formatters, so maybe we could start with short only, and then 
> > re-evaluate after it starts getting some usage?  Would give people a chance 
> > to build up a stronger opinion one way or the other.
> > 
> > As for asserts, I don't think it should be an issue here.  The reason I say 
> > this is because the assert is compiled out in release mode, so the assert 
> > itself will never be the cause of a crash for the user.  The only way it 
> > could crash is if the code that followed did not perform gracefully under 
> > the condition that triggered the assert to fire in the first place.
> > 
> > The assert here is used only to notify the programmer that they've made a 
> > mistake in their debug build, but in a normal build it will fall back to 
> > using the default Dir + Separator + Filename format if anything in the 
> > format string is unrecognized.
> > 
> > I prefer this to adding additional conditional branches, because printing 
> > something sane is better than printing "Unknown Format String" in a log 
> > file.
> > 
> > 
> I am saying that we add long format name support in now only in the 
> ::format() functions but use them with the minimal characters on our code 
> when logging. This would avoid any 80 char limitations when using them, but 
> keep the ::format() functions more readable.
> 
> I am fine with the assert being there if the code still is designed to 
> function when the assert isn't there. LLVM tends to say asserts are 
> invariants and the code isn't expect to function when the asserts are off, so 
> as long as we avoid avoid this in LLDB I am fine (use asserts for alerting, 
> but code around it).
Ahh I see what you mean.  I wouldn't want us to do anything like that across 
the board, because we can't foresee all possible ways we might want to use it, 
and I don't think we'd be able to apply this rule consistently across all types 
and all formatters we'd ever make in LLDB.  For example, I can imagine a 
hypothetical situation where you might do `llvm::formatv("{0:pxest}") where p, 
x, e, s, and t are "codes" for some specific field, and it just strings all the 
results together.  Then there are some situations where case matters, like when 
printing integers `X` means hex with uppercase digits and `x` means hex with 
lowercase digits.  


https://reviews.llvm.org/D27632



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

Reply via email to