clayborg added inline comments.
================ Comment at: source/Utility/FileSpec.cpp:406 + m_directory.Clear(); + } } ---------------- labath wrote: > clayborg wrote: > > > they resolve to the same file in a virtual filesystem, where all > > > referenced path components exist and are directories > > > > Normalizing happens after resolving and if we don't resolve a path, we have > > no way to know what is a directory and what isn't. We will be setting > > breakpoints for remote targets quite a bit in LLDB and ww can't assume or > > stat anything in a path. So I would say FileSpec's are equivalent if the > > relative paths match all components. > > > > > Now the (c) part would imply that foo/.. should normalize to ./. and not > > > ., which is a bit odd, but it is consistent with our stated intention of > > > preserving directory information. If we do not want to have ./. here, > > > then we need to come up with a different definition of what it means to > > > be "normalized". > > > > I guess we could make the m_directory contain "." and m_filename contain > > nothing for the "./." case. It doesn 't make sense to have "." in both > > places. > >> they resolve to the same file in a virtual filesystem, where all > >> referenced path components exist and are directories > > > Normalizing happens after resolving and if we don't resolve a path, we have > > no way to know what is a directory and what isn't. We will be setting > > breakpoints for remote targets quite a bit in LLDB and ww can't assume or > > stat anything in a path. > > Yes, I am aware of that. I am not saying this is how we should actually > implement the normalization algorithm. I am trying define what a > "normalization" is in the first place, so that we can then judge whether a > particular normalization algorithm is good or not. I think defining > normalization in terms of an actual filesystem makes sense, since at the end > of the day, our algorithm should somehow approximate what happens in real > file systems. I am not saying the algorithm should be doing any stats, but > for the verification (either in our heads or in the tests) we can use > certainly use stats or actual file systems. > > > So I would say FileSpec's are equivalent if the relative paths match all > > components. > > This is too vague to be useful. I have no idea how I would apply this > definition to determine if e.g. "/foo/../bar.txt" and "./bar.txt" are > equivalent. And you didn't say anything about how to derive the normal form > for a `FileSpec`. > > >> Now the (c) part would imply that foo/.. should normalize to ./. and not > >> ., which is a bit odd, but it is consistent with our stated intention of > >> preserving directory information. If we do not want to have ./. here, then > >> we need to come up with a different definition of what it means to be > >> "normalized". > > > I guess we could make the m_directory contain "." and m_filename contain > > nothing for the "./." case. It doesn 't make sense to have "." in both > > places. > > I don't think that is very useful, as then this would be the only special > case where normalization would produce a FileSpec without a filename > component. >> So I would say FileSpec's are equivalent if the relative paths match all >> components. > This is too vague to be useful. I have no idea how I would apply this > definition to determine if e.g. "/foo/../bar.txt" and "./bar.txt" are > equivalent. And you didn't say anything about how to derive the normal form > for a FileSpec. "/foo/../bar.txt" would be normalized to "/bar.txt" and "./bar.txt" will, after switching to llvm's remove_dots, be normalized to "bar.txt". So those could be though of as equivalent since one is only a basename and would only need to match the filename. If you have "/foo/bar/baz.txt", it could be equivalent to "bar/baz.txt" by making sure the filename's match, and if either or both path is relative, then matching as many directories as are specified. >> I guess we could make the m_directory contain "." and m_filename contain >> nothing for the "./." case. It doesn 't make sense to have "." in both >> places. > I don't think that is very useful, as then this would be the only special > case where normalization would produce a FileSpec without a filename > component. Ok, then leave it as is with "." in filename, not directory. We don't need it in both places IMHO ================ Comment at: source/Utility/FileSpec.cpp:857 + !IsPathSeparator(components[i].back(), syntax) && + (result.empty() || !IsPathSeparator(result.back(), syntax))) result += GetPreferredPathSeparator(syntax); ---------------- labath wrote: > clayborg wrote: > > labath wrote: > > > Why is this necessary? `result` can't be empty because we have just > > > appended something to it (and we've checked that `components[i]` is > > > non-empty). > > Because if you don't check this joining {"/', "foo.txt"} will result in > > "//foo.txt" which is wrong,. > Yes, but didn't the original condition guard against that already? > > We know that `components[i]` is non-empty, and we have just appended it to > `result` two lines above. So, unless I am missing something, `result.back()` > should be the same as `components[i].back()` and this additional check does > not buy us anything. I did not. During testing I found this case and "/" + "main.c" was producing "//main.c" https://reviews.llvm.org/D45977 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits