I still don't like this, but unless I'm missing something, I don't see how it 
is possible.  Suppose I have:

(lldb) foo bar\ --build

What is that on Windows?  Is it a filename argument "bar\" and then the option 
--build?  Or is it the filename "bar\ --build".  Breaking the line into tokens 
has to happen before you know what the tokens mean.  That's at odds with your 
plan to have the protection character be a protection character or not 
depending on what that word means in the already tokenized line.  I don't see 
how you're going to do that without really complicating command line parsing.

Jim



> On Jan 14, 2015, at 10:54 AM, Zachary Turner <ztur...@google.com> wrote:
> 
> I take back my first sentence.  It would be two different syntaxes if one 
> argument is a file path and one argument is a non file-path string.  Like for 
> example:
> 
> (lldb) somecommand testarg c:\foobar
> 
> In this case yes, the two arguments would have different rules.  But a) they 
> would only have different rules on Windows, and b) I think that's ok, people 
> whose primary operating system is Windows have the \ so engrained in their 
> heads that this will be the most natural behavior.
> 
> On Wed Jan 14 2015 at 10:47:41 AM Zachary Turner <ztur...@google.com> wrote:
> It wouldn't be two arguments to the same command having a different syntax, 
> it would be one argument to a command having a different syntax depending on 
> how you were using the command.
> 
> If I'm debugging Windows remotely from a Linux machine, and I need to specify 
> a remote executable, it's more natural to use a Windows syntax to specify it. 
>  Of course the default would be the host's default.
> 
> The reason I'm not crazy about the protection character is because any 
> character you use is going to be awkward.  Escaping characters with # signs 
> just isn't very intuitive to anyone on any platform.  On the other hand, 
> escaping characters in filenames just isn't a thing that anyone needs to do 
> on Windows, because characters that require escaping are not valid filename 
> characters.  I guess ultimately I'm looking for a way so that each platform 
> can have the most natural way of doing things on that platform, so nobody 
> feels like a second class citizen.  Using # characters (or really any 
> character other than \) for escaping is going to be unnatural, but even more 
> importantly unnecessary since we only need this for file paths.
> 
> That's what led me to the aforementioned idea.  We already have the ability 
> to mark option values as file paths by using eOptionTypeFileSpec.  So why not 
> just put the logic there, and then there's no setting anywhere, and everyone 
> can use the native path syntax for the platform they're working with.
> 
> On Wed Jan 14 2015 at 10:28:26 AM <jing...@apple.com> wrote:
> I don't like this.  Having two arguments to the same command with different 
> syntaxes seems pretty ugly to me.
> 
> I didn't completely follow why having the protection character be settable 
> ended up being annoying to do, but short of that, I think the best option is 
> to have the protection character be a host setting, leave it at "\" for 
> everything but Windows, and pick some likely character for Windows.  Then 
> we'll have to document this somewhere that the average debugger user is 
> likely to find it.
> 
> Jim
> 
> 
> > On Jan 13, 2015, at 6:38 PM, Zachary Turner <ztur...@google.com> wrote:
> >
> > For example, one idea i had to fix this in a deeper way was to audit all 
> > settings and options. For each one that's a path, make sure the option type 
> > is eOptionTypeFileSpec. Then sink the escaping logic into FileSpec. The 
> > added benefit of this is that it easily gives you access to the native 
> > syntax of a remote platform's file system by way of the PathSyntax enum i 
> > added to FileSpec some time ago. So if you're running some command that 
> > takes a path in the context of a remote host, you can use that hosts 
> > escaping rules. Plus this only changes the behavior for paths, which is the 
> > only place we need it, so doesn't break anything else.
> >
> > This is a bigger change though, and not needed immediately, which is why I 
> > would prefer postponing.
> >
> > Thoughts about this approach?
> > On Tue, Jan 13, 2015 at 6:13 PM Zachary Turner <ztur...@google.com> wrote:
> > I definitely need to be able to specify paths with backslashes unquoted, 
> > but whether this is the best approach I'm still undecided.
> >
> > To be honest, I'm ok for now just disabling backslash processing with an 
> > #ifndef _WIN32. This might cause other issues down the line for us, but 
> > they will be fairly uncommon, and it will fix the common case now. And we 
> > can do a more proper fix if/when the problem resurfaces.
> > On Tue, Jan 13, 2015 at 5:06 PM Greg Clayton <gclay...@apple.com> wrote:
> >
> > > On Jan 12, 2015, at 5:03 PM, Zachary Turner <ztur...@google.com> wrote:
> > >
> > > The way Process does it is a little confusing to me.  It has this 
> > > ProcessProperties() class which takes a boolean, is_global.  If this 
> > > value is true, it appends some sub-properties to it, and if it's false, 
> > > it just initializes itself by calling itself again with true.  So false 
> > > and true make no difference, it's always the same instance (?)
> >
> > No. is_global is set to true if this is the initial "seed" options for 
> > "process" under "target". This is why when "is_global" is set to true that 
> > it appends the settings to the "target" global settings, and it doesn't 
> > when not.
> >
> > If you think about it you need a set of options that can be editable before 
> > any processes exist. So the "is_global" means we are creating this one set 
> > of settings, it has nothing to do with the fact that individual settings 
> > can be global or instance based. When a lldb_private::Process is made, it 
> > inherits from ProcessProperties, and these are the settings that get 
> > modified and any global properties are shared with the global versions, and 
> > any instance variables copy the current global settings to be the basis for 
> > the initial settings in Process.
> >
> > So lets say ProcessProperties has two settings "a" which is global and "b" 
> > which is not (set by the bool in each property definition). When we first 
> > start out we create the global properties which contain default values for 
> > "a" and "b":
> >
> > Global ProcessProperties:
> > a = true
> > b = false
> >
> > Now we run some commands:
> >
> > (lldb) settings set process.a false
> >
> > So now we have:
> >
> > Global ProcessProperties:
> > a = false
> > b = false
> >
> > Now we create a process whose pid is 123:
> >
> > (lldb) file /bin/ls
> > (lldb) b malloc
> > (lldB) r
> >
> > Now a new process gets created and it makes a copy of "Global 
> > ProcessProperties":
> >
> > Process 123 ProcessProperties:
> > a = false
> > b = false
> >
> > Now someone says:
> >
> > (lldb) settings set process.a true
> >
> > Since "a" is global we get:
> >
> > Global ProcessProperties:
> > a = true
> > b = false
> >
> > Process 123 ProcessProperties:
> > a = true
> > b = false
> >
> > But if we do:
> >
> > (lldb) settings set process.b true
> >
> > The Global properties remain unchanged, and only Process 123's settings get 
> > changed:
> >
> > Global ProcessProperties:
> > a = true
> > b = false
> >
> > Process 123 ProcessProperties:
> > a = true
> > b = true
> >
> >
> > >
> > > Then, to further confuse matters, there's a single PropertyDefinition 
> > > array, where some of them are specified as global and some not via the 
> > > third argument.  When you call GetGlobalProperties(), it then just 
> > > returns the whole array.  There's not much choice it has, because it's 
> > > all just one array, so it can't really return a filtered array with only 
> > > the items where global==true.
> > >
> > > I feel like the correct way to do this is to have two separate arrays.  
> > > One for global properties and one for instance properties.  Then, instead 
> > > of inheriting from Properties, just have two instances of it in the 
> > > class.  An instance instance and a static instance.  This way you don't 
> > > even need the third argument to PropertyDefinition at all.  And the 
> > > global properties are added as a subcategory, such as interpreter.global. 
> > >  This also makes it clear to the user when they run "settings list" which 
> > > settings are global and which are not.  It might be clearer with an 
> > > example, so I'll upload this patch so you can see what I'm talking about. 
> > >  If you don't like the way I've done it let me know.
> >
> > Read what I typed above carefully and make sure that:
> > 1 - we need to be able to set non-global properties without any instances 
> > so there needs to be global settings that contain all global and all 
> > instance based properties so we can set these values before we have any 
> > instances around
> > 2 - when a new instance is made, it needs to get a copy of the global 
> > pref's global and non-global option values
> > 3 - if you modify a value that is non-global, there needs to be a way to 
> > find the right instance so you can set the settings as the code currently 
> > does
> >
> > I would rather you not change this code as it currently works and is 
> > relatively bug free. If you do still feel you need to change the code do 
> > NOT break anything. This means a lot of testing to make sure it behaves the 
> > exact way it used to. Messing with this can really hose things up, so 
> > again, don't break anything if you still feel you need to change the code.
> >
> > Greg
> >
> >
> > >
> > > On Mon Jan 12 2015 at 3:01:21 PM Greg Clayton <gclay...@apple.com> wrote:
> > > Actually we do have command interpreter settings as Jim just pointed out 
> > > to me, so feel free to add it there and hook the global settings up 
> > > correctly for that with a static function on CommandInterpreter to get 
> > > the escape character.
> > >
> > > Greg
> > >
> > > > On Jan 12, 2015, at 2:59 PM, Greg Clayton <gclay...@apple.com> wrote:
> > > >
> > > > Probably the command interpreter, but we have all the command 
> > > > interpreter settings on the debugger right now anyway, so don't change 
> > > > anything on that end..
> > > >
> > > >> On Jan 12, 2015, at 2:35 PM, Zachary Turner <ztur...@google.com> wrote:
> > > >>
> > > >> Thanks for the response.  By the way, is this setting more appropriate 
> > > >> on the CommandInterpreter instead of the debugger?
> > > >>
> > > >> On Mon Jan 12 2015 at 2:34:06 PM Greg Clayton <gclay...@apple.com> 
> > > >> wrote:
> > > >>
> > > >>> On Jan 12, 2015, at 2:05 PM, Zachary Turner <ztur...@google.com> 
> > > >>> wrote:
> > > >>>
> > > >>> There doesn't seem to be a good way to get access to the Debugger 
> > > >>> object from the Args class.  I tried changing Args to take a Debugger 
> > > >>> to its constructor, but it seems this isn't always possible, for 
> > > >>> example with anything having to do with OptionValue.
> > > >>> I could provide a default value of NULL for the Debugger, and if NULL 
> > > >>> it would fall back to the default escape character, but this seems 
> > > >>> awkward.
> > > >>>
> > > >>> Since I've declared this as a global property, why should I even need 
> > > >>> a Debugger instance?  Shouldn't the global settings be static on the 
> > > >>> Debugger so that they can be accessed without an instance?
> > > >>
> > > >>
> > > >> This is the problem. See how process does it:
> > > >>
> > > >> class Process {
> > > >>    static const ProcessPropertiesSP &
> > > >>    GetGlobalProperties();
> > > >> }
> > > >>
> > > >> The debugger should do the same thing. It should also add static 
> > > >> accessors for all of the settings that are truly global settings. 
> > > >> Looking at the global settings, they all seem to be set to be global 
> > > >> values which probably isn't what we want. Why? Xcode creates a new 
> > > >> Debugger for each debugging window that it creates and if someone 
> > > >> types "setting set auto-confirm false" in one command interpreter, it 
> > > >> shouldn't affect the other.
> > > >>
> > > >> So I would say we need to switch all debugger settings to be 
> > > >> non-global (third initialized in each of the PropertyDefinition values 
> > > >> should be set to "false" in g_properties in Debugger.cpp) and the only 
> > > >> one that should remain global is your new escape character. Then 
> > > >> Debugger should get a new static accessor:
> > > >>
> > > >> class Debugger
> > > >> {
> > > >>    static char
> > > >>    GetEscapeCharacter();
> > > >> };
> > > >>
> > > >> This in turn will access the global properties and return it to 
> > > >> outside folks.
> > > >>
> > > >> Check out the ProcessProperties class in Process.h and check out its 
> > > >> constructor. We will need to do something similar for the debugger's 
> > > >> settings. Right now Debugger inherits directly from Properties, but we 
> > > >> will need to change it to be like the process where there is a 
> > > >> DebuggerProperties class. The global version gets constructed with a 
> > > >> "bool is_global" set to false, and the instance ones get constructed 
> > > >> with that set to true.
> > > >>
> > > >> The Process class is the model we will need to follow if you want to 
> > > >> make this change and have a true global property that can be accessed 
> > > >> without a Debugger instance.
> > > >>
> > > >>
> > > >>>
> > > >>> On Thu Jan 08 2015 at 3:00:30 PM <jing...@apple.com> wrote:
> > > >>> It's not just file names, you would also have to make sure there's 
> > > >>> nothing else that might be in command argument or option value that 
> > > >>> has a single & a double quote, since without the backslashes this 
> > > >>> would be impossible.
> > > >>>
> > > >>> If you really want to do this, I think it would be better to add a 
> > > >>> debugger setting for the "protection character".  Then this would be 
> > > >>> set to something else (maybe "#") on Windows, and backslash on all 
> > > >>> other systems.  That way you could probably always find a protection 
> > > >>> character that you could use for whatever gnarly string you ended up 
> > > >>> having to pass through the command interpreter.
> > > >>>
> > > >>> Jim
> > > >>>
> > > >>>
> > > >>>> On Jan 8, 2015, at 2:55 PM, Zachary Turner <ztur...@google.com> 
> > > >>>> wrote:
> > > >>>>
> > > >>>> Actually ' is a valid filename character in Windows, but not ".  
> > > >>>> That being said, it's so rare, and having a backslash is so common 
> > > >>>> that I would prefer the common case to be easy, and the rare case 
> > > >>>> being either unsupported or difficult is ok with me.  So I'd still 
> > > >>>> prefer to disable this backslash handling on Windows for now, and 
> > > >>>> then fix ' on Windows separately in the future.
> > > >>>>
> > > >>>> On Thu Jan 08 2015 at 2:51:51 PM Zachary Turner <ztur...@google.com> 
> > > >>>> wrote:
> > > >>>> On Windows, that's not a valid file name, and in fact any file name 
> > > >>>> that has an escaped character is not a valid filename.  I see what 
> > > >>>> you're getting at though, that for non-Windows it's necessary.  Can 
> > > >>>> I wrap the backslash handling in #ifndef _WIN32 then?
> > > >>>>
> > > >>>> On Thu Jan 08 2015 at 2:49:49 PM <jing...@apple.com> wrote:
> > > >>>> If I have a file called foo"bar'baz, how what would I put in the 
> > > >>>> place of <AWKWARD NAME> for
> > > >>>>
> > > >>>> (lldb) file <AWKWARD NAME>
> > > >>>>
> > > >>>> Right now, I can do:
> > > >>>>
> > > >>>> (lldb) file foo\"bar\'baz
> > > >>>> Current executable set to 'foo"bar'baz' (x86_64).
> > > >>>>
> > > >>>> Jim
> > > >>>>
> > > >>>>
> > > >>>>> On Jan 8, 2015, at 2:31 PM, Zachary Turner <ztur...@google.com> 
> > > >>>>> wrote:
> > > >>>>>
> > > >>>>> FWIW, Removing backslash handling from this function (essentially 
> > > >>>>> ignoring backslashes in command arguments) fixes about 12-15 tests 
> > > >>>>> on Windows with no other changes.  I see there's some logic in Args 
> > > >>>>> for encoding and decoding escape sequences, but this only happens 
> > > >>>>> if a particular command option is set, and that command only only 
> > > >>>>> appears to be set for the "prompt" command.  I'm not sure if 
> > > >>>>> removing the backslash logic from SetCommandString would interfere 
> > > >>>>> with this command in any way, but it doesn't seem like it would 
> > > >>>>> interfere with any other commands, unless I'm missing something.
> > > >>>>>
> > > >>>>> On Thu Jan 08 2015 at 1:43:16 PM Zachary Turner 
> > > >>>>> <ztur...@google.com> wrote:
> > > >>>>> One thing causing many tests to fail on Windows is the presence of 
> > > >>>>> backslashes in argument.  Until now, I've worked around this in 
> > > >>>>> many cases by making sure that arguments with backslashes are 
> > > >>>>> always quoted.
> > > >>>>>
> > > >>>>> But there are some cases where this is not easy to guarantee and 
> > > >>>>> now I'm leaning towards (at least on Windows) allowing backslashes 
> > > >>>>> in argument strings.  The code in question comes from the function 
> > > >>>>> void SetCommandString (const char *command) in the file Args.cpp
> > > >>>>>
> > > >>>>> In particular, it implements special handling of whitespace, single 
> > > >>>>> quotes, double quotes, and backslashes.  For the case of 
> > > >>>>> backslashes it removes them from the string.
> > > >>>>>
> > > >>>>> What would be the implications of removing backslash handling from 
> > > >>>>> this function for all platforms?  I would prefer to keep platform 
> > > >>>>> specific code out of generic code, but I think this needs to be 
> > > >>>>> changed on Windows.
> > > >>>>> _______________________________________________
> > > >>>>> lldb-dev mailing list
> > > >>>>> lldb-dev@cs.uiuc.edu
> > > >>>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
> > > >>>>
> > > >>>
> > > >>> _______________________________________________
> > > >>> lldb-dev mailing list
> > > >>> lldb-dev@cs.uiuc.edu
> > > >>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
> > > >>
> > > >
> > >
> >
> 


_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to