clayborg added a comment.

In https://reviews.llvm.org/D23884#526385, @zturner wrote:

> I'm not sure I follow.  `StringRef` is literally just a wrapper around a 
> `const char*`, so if `const char*` works, why doesn't `StringRef`?


"const char *" assumed null termination. StringRef can be a reference to part 
of a C string:

const char *cstr = "\"valid json string\"and some other junk";
llvm::StringRef json_text(cstr, 19);

Not that the last character after the ending quote isn't a '\0' charcter it is 
a 'a'.

So if we want to actually use the "json_text" to parse the JSON, we need make a 
std::string so that it becomes null terminated. We could switch the parsing 
code to use a new class StringRefExtractor instead of StringExtractor in which 
case we can accept the data as a llvm::StringRef from the constructor. But all 
internal code would need to use std::string (GetToken() would still need to use 
std::string).

> `JSONParser` constructor is already taking a `const char*` in this patch, so 
> it's not like it is modifying the contents of the string.


You are correct. It does make a contract that used to not be there where the 
caller must guarantee the data it is parsing doesn't go away, but I don't think 
that will be a problem.

> Checking the length and/or getting a substring or trimming values from the 
> beginning and end is going to be a far more common operation than converting 
> it into something that has to be null terminated (why does it have to be null 
> terminated for that matter anyway?)


Currently it is so the parser knows when to stop, but it doesn't have to be if 
we switch to using a new StringRefExtractor class.

> So the benefit of having the length stored with the string outweighs the con 
> of having to call `str()` when you want something null terminated, IMO


Yes it it fine as long as you convert the parsing code.


https://reviews.llvm.org/D23884



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

Reply via email to