<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><div style="direction: inherit;">Okay. Yeah I don't see us needing to support the equal with trailing nothing.</div><br>-Todd</div><div><br>On Sep 22, 2016, at 9:23 AM, Zachary Turner <<a href="mailto:zturner@google.com">zturner@google.com</a>> wrote:<br><br></div><blockquote type="cite"><div><div dir="ltr">yea I mostly just wanted to know if we needed to specificlaly distinguish between ARG=\0 and ARG\0.  Because if so the second parameter would need to be Optional<StringRef> since StringRef has no way to differentiate between "I don't refer to anything" versus "I refer to the empty string".  (Technically it kinda does, but I think it relies on an implementation detail so shouldn't be used)</div><br><div class="gmail_quote"><div dir="ltr">On Thu, Sep 22, 2016 at 9:20 AM Todd Fiala <<a href="mailto:todd.fiala@gmail.com">todd.fiala@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Primarily because we pass them verbatim to posix_spawn and other launchers, and there it is legitimate to not have an equal with trailing nothingness.  On the Xcode side, we use a ton of environment variables.<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">As to whether there is a difference between ARG1=\0 and ARG1\0, I'm not sure.</div></div><div class="gmail_extra gmail_msg"></div><div class="gmail_extra gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg">On Thu, Sep 22, 2016 at 9:12 AM, Zachary Turner <span dir="ltr" class="gmail_msg"><<a href="mailto:zturner@google.com" class="gmail_msg" target="_blank">zturner@google.com</a>></span> wrote:<br class="gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Thanks for the test.  Is there any practical difference between "ARGS=" and "ARGS"?</div><div class="m_-201782505578999991HOEnZb gmail_msg"><div class="m_-201782505578999991h5 gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Thu, Sep 22, 2016 at 9:08 AM Todd Fiala via lldb-commits <<a href="mailto:lldb-commits@lists.llvm.org" class="gmail_msg" target="_blank">lldb-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: tfiala<br class="gmail_msg">
Date: Thu Sep 22 11:00:01 2016<br class="gmail_msg">
New Revision: 282171<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=282171&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=282171&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
added environment variable-related Args gtests<br class="gmail_msg">
<br class="gmail_msg">
Also fixed up a couple misbehaving functions.  It is perfectly<br class="gmail_msg">
legal to have env vars with no values (i.e. the '=' and following<br class="gmail_msg">
need not be present).<br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
    lldb/trunk/source/Interpreter/Args.cpp<br class="gmail_msg">
    lldb/trunk/unittests/Interpreter/TestArgs.cpp<br class="gmail_msg">
<br class="gmail_msg">
Modified: lldb/trunk/source/Interpreter/Args.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/Args.cpp?rev=282171&r1=282170&r2=282171&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/Args.cpp?rev=282171&r1=282170&r2=282171&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- lldb/trunk/source/Interpreter/Args.cpp (original)<br class="gmail_msg">
+++ lldb/trunk/source/Interpreter/Args.cpp Thu Sep 22 11:00:01 2016<br class="gmail_msg">
@@ -976,13 +976,15 @@ void Args::LongestCommonPrefix(std::stri<br class="gmail_msg">
<br class="gmail_msg">
 void Args::AddOrReplaceEnvironmentVariable(llvm::StringRef env_var_name,<br class="gmail_msg">
                                            llvm::StringRef new_value) {<br class="gmail_msg">
-  if (env_var_name.empty() || new_value.empty())<br class="gmail_msg">
+  if (env_var_name.empty())<br class="gmail_msg">
     return;<br class="gmail_msg">
<br class="gmail_msg">
   // Build the new entry.<br class="gmail_msg">
   std::string var_string(env_var_name);<br class="gmail_msg">
-  var_string += "=";<br class="gmail_msg">
-  var_string += new_value;<br class="gmail_msg">
+  if (!new_value.empty()) {<br class="gmail_msg">
+    var_string += "=";<br class="gmail_msg">
+    var_string += new_value;<br class="gmail_msg">
+  }<br class="gmail_msg">
<br class="gmail_msg">
   size_t index = 0;<br class="gmail_msg">
   if (ContainsEnvironmentVariable(env_var_name, &index)) {<br class="gmail_msg">
@@ -1006,7 +1008,7 @@ bool Args::ContainsEnvironmentVariable(l<br class="gmail_msg">
<br class="gmail_msg">
     llvm::StringRef name, value;<br class="gmail_msg">
     std::tie(name, value) = arg_value.split('=');<br class="gmail_msg">
-    if (name == env_var_name && !value.empty()) {<br class="gmail_msg">
+    if (name == env_var_name) {<br class="gmail_msg">
       if (argument_index)<br class="gmail_msg">
         *argument_index = i;<br class="gmail_msg">
       return true;<br class="gmail_msg">
<br class="gmail_msg">
Modified: lldb/trunk/unittests/Interpreter/TestArgs.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Interpreter/TestArgs.cpp?rev=282171&r1=282170&r2=282171&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Interpreter/TestArgs.cpp?rev=282171&r1=282170&r2=282171&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- lldb/trunk/unittests/Interpreter/TestArgs.cpp (original)<br class="gmail_msg">
+++ lldb/trunk/unittests/Interpreter/TestArgs.cpp Thu Sep 22 11:00:01 2016<br class="gmail_msg">
@@ -11,6 +11,9 @@<br class="gmail_msg">
<br class="gmail_msg">
 #include "lldb/Interpreter/Args.h"<br class="gmail_msg">
<br class="gmail_msg">
+#include <limits><br class="gmail_msg">
+#include <sstream><br class="gmail_msg">
+<br class="gmail_msg">
 using namespace lldb_private;<br class="gmail_msg">
<br class="gmail_msg">
 TEST(ArgsTest, TestSingleArg) {<br class="gmail_msg">
@@ -153,3 +156,85 @@ TEST(ArgsTest, StringToScriptLanguage) {<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 TEST(ArgsTest, StringToVersion) {}<br class="gmail_msg">
+<br class="gmail_msg">
+// Environment Variable Tests<br class="gmail_msg">
+<br class="gmail_msg">
+class EnvVarFixture: public ::testing::Test {<br class="gmail_msg">
+protected:<br class="gmail_msg">
+<br class="gmail_msg">
+    void SetUp() {<br class="gmail_msg">
+        args.AppendArgument(llvm::StringRef("Arg1=foo"));<br class="gmail_msg">
+        args.AppendArgument(llvm::StringRef("Arg2"));<br class="gmail_msg">
+        args.AppendArgument(llvm::StringRef("Arg3=bar"));<br class="gmail_msg">
+    }<br class="gmail_msg">
+<br class="gmail_msg">
+    size_t GetIndexForEnvVar(llvm::StringRef envvar_name) {<br class="gmail_msg">
+        size_t argument_index = std::numeric_limits<size_t>::max();<br class="gmail_msg">
+        EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name,<br class="gmail_msg">
+                                                     &argument_index));<br class="gmail_msg">
+        EXPECT_LT(argument_index, args.GetArgumentCount());<br class="gmail_msg">
+        return argument_index;<br class="gmail_msg">
+    }<br class="gmail_msg">
+<br class="gmail_msg">
+    Args  args;<br class="gmail_msg">
+};<br class="gmail_msg">
+<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(EnvVarFixture, TestContainsEnvironmentVariableNoValue) {<br class="gmail_msg">
+    EXPECT_TRUE(args.ContainsEnvironmentVariable(llvm::StringRef("Arg2")));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(EnvVarFixture, TestContainsEnvironmentVariableWithValue) {<br class="gmail_msg">
+    EXPECT_TRUE(args.ContainsEnvironmentVariable(llvm::StringRef("Arg3")));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(EnvVarFixture, TestContainsEnvironmentVariableNonExistentVariable) {<br class="gmail_msg">
+    auto nonexistent_envvar = llvm::StringRef("ThisEnvVarShouldNotExist");<br class="gmail_msg">
+    EXPECT_FALSE(args.ContainsEnvironmentVariable(nonexistent_envvar));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialNoValueWithNoValue) {<br class="gmail_msg">
+    auto envvar_name = llvm::StringRef("Arg2");<br class="gmail_msg">
+    auto argument_index = GetIndexForEnvVar(envvar_name);<br class="gmail_msg">
+<br class="gmail_msg">
+    args.AddOrReplaceEnvironmentVariable(envvar_name, llvm::StringRef(""));<br class="gmail_msg">
+    EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name));<br class="gmail_msg">
+    EXPECT_EQ(envvar_name, args.GetArgumentAtIndex(argument_index));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialNoValueWithValue) {<br class="gmail_msg">
+    auto envvar_name = llvm::StringRef("Arg2");<br class="gmail_msg">
+    auto argument_index = GetIndexForEnvVar(envvar_name);<br class="gmail_msg">
+<br class="gmail_msg">
+    auto new_value = llvm::StringRef("NewValue");<br class="gmail_msg">
+    args.AddOrReplaceEnvironmentVariable(envvar_name, new_value);<br class="gmail_msg">
+    EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name));<br class="gmail_msg">
+<br class="gmail_msg">
+    std::stringstream stream;<br class="gmail_msg">
+    stream << envvar_name.str() << '=' << new_value.str();<br class="gmail_msg">
+    EXPECT_EQ(llvm::StringRef(stream.str()),<br class="gmail_msg">
+              args.GetArgumentAtIndex(argument_index));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialValueWithNoValue) {<br class="gmail_msg">
+    auto envvar_name = llvm::StringRef("Arg1");<br class="gmail_msg">
+    auto argument_index = GetIndexForEnvVar(envvar_name);<br class="gmail_msg">
+<br class="gmail_msg">
+    args.AddOrReplaceEnvironmentVariable(envvar_name, llvm::StringRef(""));<br class="gmail_msg">
+    EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name));<br class="gmail_msg">
+    EXPECT_EQ(envvar_name, args.GetArgumentAtIndex(argument_index));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(EnvVarFixture, TestReplaceEnvironmentVariableInitialValueWithValue) {<br class="gmail_msg">
+    auto envvar_name = llvm::StringRef("Arg1");<br class="gmail_msg">
+    auto argument_index = GetIndexForEnvVar(envvar_name);<br class="gmail_msg">
+<br class="gmail_msg">
+    auto new_value = llvm::StringRef("NewValue");<br class="gmail_msg">
+    args.AddOrReplaceEnvironmentVariable(envvar_name, new_value);<br class="gmail_msg">
+    EXPECT_TRUE(args.ContainsEnvironmentVariable(envvar_name));<br class="gmail_msg">
+<br class="gmail_msg">
+    std::stringstream stream;<br class="gmail_msg">
+    stream << envvar_name.str() << '=' << new_value.str();<br class="gmail_msg">
+    EXPECT_EQ(llvm::StringRef(stream.str()),<br class="gmail_msg">
+              args.GetArgumentAtIndex(argument_index));<br class="gmail_msg">
+}<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
lldb-commits mailing list<br class="gmail_msg">
<a href="mailto:lldb-commits@lists.llvm.org" class="gmail_msg" target="_blank">lldb-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits</a><br class="gmail_msg">
</blockquote></div>
</div></div></blockquote></div><br class="gmail_msg"><br clear="all" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div></div><div class="gmail_extra gmail_msg">-- <br class="gmail_msg"><div class="m_-201782505578999991gmail_signature gmail_msg" data-smartmail="gmail_signature"><div dir="ltr" class="gmail_msg">-Todd</div></div>
</div></blockquote></div>
</div></blockquote></body></html>