Hui added inline comments.

================
Comment at: include/lldb/Utility/Args.h:121
 
+  bool GetFlattenWindowsCommandString(std::string &command) const;
+
----------------
labath wrote:
> labath wrote:
> > Hui wrote:
> > > labath wrote:
> > > > I am sorry for being such a pain, but I don't think this is 
> > > > grammatically correct, as `get` and `flatten` are both verbs. I'd call 
> > > > this either GetFlatten**ed**WindowsCommandLine or just plain 
> > > > FlattenWindowsCommandLine.
> > > There are  two kinds of sources of args in this discussion:
> > > 
> > >   - from lldb console through stdin which is not raw.
> > >   - from LLDB_SERVER_LOG_FILE environment variables which are raw
> > > 
> > > We expect to call a GetFlattenedWindowsCommandString for raw input. 
> > > However it seems not the case for now. 
> > > 
> > > What about adding a TODO in the following in ProcessWindowsLauncher. 
> > > 
> > > Would like a solution to proceed.
> > > 
> > > +
> > > +bool GetFlattenedWindowsCommandString(Args args, std::string &command) {
> > > +  if (args.empty())
> > > +    return false;
> > > +
> > > +  std::vector<llvm::StringRef> args_ref;
> > > +  for (auto &entry : args.entries())
> > > +     args_ref.push_back(entry.ref);
> > > +
> > > +  // TODO: only flatten raw input.
> > > +  // Inputs from lldb console through the stdin are not raw, for example,
> > > +  // A command line like "dir c:\" is attained as "dir c":\\". Trying to 
> > > flatten such
> > > +  // input will result in unexpected errors. In this case, the flattend 
> > > string will be
> > > +  // interpreted as "dir c:\\ which is a wrong usage of `dir` command.
> > > +
> > > +  command = llvm::sys::flattenWindowsCommandLine(args_ref);
> > > +  return true;
> > >  }
> > > +} // namespace
> > > 
> > I am afraid you lost me here. By the time something gets to this function, 
> > it has already been parsed into individual argv strings. I am not sure 
> > which ones do you consider raw, or why should it make a difference. (lldb 
> > builtin interpreter has a concept of "raw" commands, but I don't think 
> > that's what you mean here)
> > 
> > This function should take those argv strings, no matter what they are, and 
> > recompose them into a single string. If those strings are wrong, then it's 
> > output will also be wrong, but that's not a problem of this function -- 
> > it's a problem of whoever parsed those strings.
> > 
> > I won't have access to a windows machine this week to check this out, but I 
> > can take a look at that next week. In the mean time, I would be fine with 
> > just xfailing the single test which fails because of this. I think that's a 
> > good tradeoff, as this would fix a bunch of other tests as well as unblock 
> > you on your lldb-server work.
> I can't test this out, but the place I'd expect the problem to be is in 
> `ProcessLaunchInfo::ConvertArgumentsForLaunchingInShell`. This function seems 
> to be blissfully unaware of the windows quoting rules, and yet it's the one 
> that turns `platform shell dir c:\` into `cmd`, `/c` `whatever`. The flatten 
> function then gets this argv array and flattens it one more time. I am not 
> sure if that's the right thing to do on windows.
It is observed when you type "dir c:\" on lldb console, the 
IOHandlerEditline::GetLine will yield "dir c:\\" for you through the standard 
input (I skipped the new line char '\n'). And the 
CommandInterpreter::ResolveCommandImpl won't get the raw command line string, i 
mean "dir c:\", even I force WantsRawCommandString() true to get one.


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

https://reviews.llvm.org/D56230



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

Reply via email to