It does seem unfortunate that getAsInteger works differently from strtol's 
documented behavior in this little way...  Makes conversions like this one 
trickier than necessary.  But presumably somebody had a reason for it to be 
different?

Anyway, I have to go see if this feature of strtol & Co. is used in more places 
than CommandObjectMemoryWrite.  If it was a common idiom then it might be nice 
to have direct support for it.  But if it's just in one place, then hacking 
around it like this seems fine.

Jim

> On Apr 5, 2017, at 4:18 PM, Zachary Turner <ztur...@google.com> wrote:
> 
> What if you write this:
> 
> // Explicitly try hex.  This will catch the case where there is no 0x prefix.
> if (entry.ref.getAsInteger(16, uval64)) {
>   // If that fails, let the algorithm auto-detect the radix.  This will catch 
> the case where there is a 0x prefix.
>   if (entry.ref.getAsInteger(0, uval64)) { 
> 
> Would that work?  Alternatively, we could probably update the implementation 
> of getAsInteger in LLVM to you to manually hint the radix AND prefix the 
> number, as long as the prefix matches the hint.
> 
> On Wed, Apr 5, 2017 at 4:10 PM Jim Ingham <jing...@apple.com> wrote:
> >
> 
> I think somebody was being too clever.  The real purpose for specifying the 
> format is to set the byte size of the item written down:
> 
>     OptionValueUInt64 &byte_size_value = m_format_options.GetByteSizeValue();
>     size_t item_byte_size = byte_size_value.GetCurrentValue();
> 
> and to do some special magic for c-strings and the like.  Somebody (not me) 
> must have thought overloading "hex" format to mean "you can drop the 0x" was 
> a tasty little side benefit.
> 
> But it's been that way forever, and I don't know who's relying on that 
> behavior, so I'd rather not change it (intentionally) if we don't have to.
> 
> Jim
> 
> > On Wed, Apr 5, 2017 at 3:37 PM Jim Ingham via lldb-dev 
> > <lldb-dev@lists.llvm.org> wrote:
> > memory write's argument ingestion was changed as part of the 
> > StringRefifying of Args so that we get:
> >
> > (lldb) memory write &buffer 0x62
> > error: '0x62' is not a valid hex string value.
> >
> > That seems unexpected and not desirable.  What's going on is that the 
> > default format is hex, and if the format is hex, the command also supports:
> >
> > (lldb) memory write -f x &buffer 62
> > (lldb) fr v/x buffer[0]
> > (char) buffer[0] = 0x62
> >
> > The StringRef version of the args parsing is:
> >
> >       case eFormatDefault:
> >       case eFormatBytes:
> >       case eFormatHex:
> >       case eFormatHexUppercase:
> >       case eFormatPointer:
> >         // Decode hex bytes
> >         if (entry.ref.getAsInteger(16, uval64)) {
> >
> > The problem is that passing "0x62" to getAsInteger with a radix of 16 
> > rejects "0x62".
> >
> > We do want to hint the radix.  But it seems weird to reject an explicit 
> > indicator.  Is there some clever way to use the StringRef functions to get 
> > the desired effect, or do I have to hack around this by manually stripping 
> > the 0x if I see it?
> >
> > Jim
> >
> >
> > _______________________________________________
> > lldb-dev mailing list
> > lldb-dev@lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
> 

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

Reply via email to