Author: zturner
Date: Mon Sep 19 16:56:59 2016
New Revision: 281942

URL: http://llvm.org/viewvc/llvm-project?rev=281942&view=rev
Log:
Convert 3 more functions to use a StringRef.

This converts Args::Unshift, Args::AddOrReplaceEnvironmentVariable,
and Args::ContainsEnvironmentVariable to use StringRefs.  The code
is also simplified somewhat as a result.

Modified:
    lldb/trunk/include/lldb/Interpreter/Args.h
    lldb/trunk/source/Interpreter/Args.cpp
    lldb/trunk/source/Interpreter/CommandAlias.cpp
    lldb/trunk/source/Interpreter/CommandInterpreter.cpp
    lldb/trunk/source/Interpreter/CommandObject.cpp
    lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
    
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp

Modified: lldb/trunk/include/lldb/Interpreter/Args.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/Args.h?rev=281942&r1=281941&r2=281942&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Interpreter/Args.h (original)
+++ lldb/trunk/include/lldb/Interpreter/Args.h Mon Sep 19 16:56:59 2016
@@ -187,32 +187,30 @@ public:
   void AppendArguments(const char **argv);
 
   // Delete const char* versions of StringRef functions.  Normally this would
-  // not
-  // be necessary, as const char * is implicitly convertible to StringRef.
-  // However,
-  // since the use of const char* is so pervasive, and since StringRef will
-  // assert
-  // if you try to construct one from nullptr, this allows the compiler to 
catch
-  // instances of the function being invoked with a const char *, allowing us 
to
-  // replace them with explicit conversions at each call-site.  Once StringRef
-  // use becomes more pervasive, there will be fewer implicit conversions
-  // because
-  // we will be using StringRefs across the whole pipeline, so we won't have to
-  // have
-  // this "glue" that converts between the two, and at that point it becomes
-  // easy
-  // to just make sure you don't pass nullptr into the function.
+  // not be necessary, as const char * is implicitly convertible to StringRef.
+  // However, since the use of const char* is so pervasive, and since StringRef
+  // will assert if you try to construct one from nullptr, this allows the
+  // compiler to catch instances of the function being invoked with a
+  // const char *, allowing us to replace them with explicit conversions at 
each
+  // call-site.  This ensures that no callsites slip through the cracks where
+  // we would be trying to implicitly convert from nullptr, since it will force
+  // us to evaluate and explicitly convert each one.
+  //
+  // Once StringRef use becomes more pervasive, there will be fewer
+  // implicit conversions because we will be using StringRefs across the whole
+  // pipeline, so we won't have to have this "glue" that converts between the
+  // two, and at that point it becomes easy to just make sure you don't pass
+  // nullptr into the function on the odd occasion that you do pass a
+  // const char *.
   // Call-site fixing methodology:
   //   1. If you know the string cannot be null (e.g. it's a const char[], or
-  //   it's
-  //      been checked for null), use llvm::StringRef(ptr).
+  //      it's been checked for null), use llvm::StringRef(ptr).
   //   2. If you don't know if it can be null (e.g. it's returned from a
-  //   function
-  //      whose semantics are unclear), use
+  //      function whose semantics are unclear), use
   //      llvm::StringRef::withNullAsEmpty(ptr).
   //   3. If it's .c_str() of a std::string, just pass the std::string 
directly.
   //   4. If it's .str().c_str() of a StringRef, just pass the StringRef
-  //   directly.
+  //      directly.
   void ReplaceArgumentAtIndex(size_t, const char *, char = '\0') = delete;
   void AppendArgument(const char *arg_str, char quote_char = '\0') = delete;
   void InsertArgumentAtIndex(size_t, const char *, char = '\0') = delete;
@@ -225,6 +223,10 @@ public:
   static uint32_t StringToGenericRegister(const char *) = delete;
   static bool StringToVersion(const char *, uint32_t &, uint32_t &,
                               uint32_t &) = delete;
+  const char *Unshift(const char *, char = '\0') = delete;
+  void AddOrReplaceEnvironmentVariable(const char *, const char *) = delete;
+  bool ContainsEnvironmentVariable(const char *,
+                                   size_t * = nullptr) const = delete;
 
   //------------------------------------------------------------------
   /// Insert the argument value at index \a idx to \a arg_cstr.
@@ -315,7 +317,7 @@ public:
   /// @return
   ///     A pointer to the copy of \a arg_cstr that was made.
   //------------------------------------------------------------------
-  const char *Unshift(const char *arg_cstr, char quote_char = '\0');
+  llvm::StringRef Unshift(llvm::StringRef arg_str, char quote_char = '\0');
 
   //------------------------------------------------------------------
   /// Parse the arguments in the contained arguments.
@@ -465,8 +467,8 @@ public:
   /// already in the list, it replaces the first such occurrence
   /// with the new value.
   //------------------------------------------------------------------
-  void AddOrReplaceEnvironmentVariable(const char *env_var_name,
-                                       const char *new_value);
+  void AddOrReplaceEnvironmentVariable(llvm::StringRef env_var_name,
+                                       llvm::StringRef new_value);
 
   /// Return whether a given environment variable exists.
   ///
@@ -486,7 +488,7 @@ public:
   ///     true if the specified env var name exists in the list in
   ///     either of the above-mentioned formats; otherwise, false.
   //------------------------------------------------------------------
-  bool ContainsEnvironmentVariable(const char *env_var_name,
+  bool ContainsEnvironmentVariable(llvm::StringRef env_var_name,
                                    size_t *argument_index = nullptr) const;
 
 protected:

Modified: lldb/trunk/source/Interpreter/Args.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/Args.cpp?rev=281942&r1=281941&r2=281942&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/Args.cpp (original)
+++ lldb/trunk/source/Interpreter/Args.cpp Mon Sep 19 16:56:59 2016
@@ -352,11 +352,11 @@ void Args::Shift() {
   }
 }
 
-const char *Args::Unshift(const char *arg_cstr, char quote_char) {
-  m_args.push_front(arg_cstr);
+llvm::StringRef Args::Unshift(llvm::StringRef arg_str, char quote_char) {
+  m_args.push_front(arg_str);
   m_argv.insert(m_argv.begin(), m_args.front().c_str());
   m_args_quote_char.insert(m_args_quote_char.begin(), quote_char);
-  return GetArgumentAtIndex(0);
+  return llvm::StringRef::withNullAsEmpty(GetArgumentAtIndex(0));
 }
 
 void Args::AppendArguments(const Args &rhs) {
@@ -972,72 +972,42 @@ void Args::LongestCommonPrefix(std::stri
   }
 }
 
-void Args::AddOrReplaceEnvironmentVariable(const char *env_var_name,
-                                           const char *new_value) {
-  if (!env_var_name || !new_value)
+void Args::AddOrReplaceEnvironmentVariable(llvm::StringRef env_var_name,
+                                           llvm::StringRef new_value) {
+  if (env_var_name.empty() || new_value.empty())
     return;
 
   // Build the new entry.
-  StreamString stream;
-  stream << env_var_name;
-  stream << '=';
-  stream << new_value;
-  stream.Flush();
-
-  // Find the environment variable if present and replace it.
-  for (size_t i = 0; i < GetArgumentCount(); ++i) {
-    // Get the env var value.
-    const char *arg_value = GetArgumentAtIndex(i);
-    if (!arg_value)
-      continue;
-
-    // Find the name of the env var: before the first =.
-    auto equal_p = strchr(arg_value, '=');
-    if (!equal_p)
-      continue;
-
-    // Check if the name matches the given env_var_name.
-    if (strncmp(env_var_name, arg_value, equal_p - arg_value) == 0) {
-      ReplaceArgumentAtIndex(i, stream.GetString());
-      return;
-    }
+  std::string var_string(env_var_name);
+  var_string += "=";
+  var_string += new_value;
+
+  size_t index = 0;
+  if (ContainsEnvironmentVariable(env_var_name, &index)) {
+    ReplaceArgumentAtIndex(index, var_string);
+    return;
   }
 
   // We didn't find it.  Append it instead.
-  AppendArgument(stream.GetString());
+  AppendArgument(var_string);
 }
 
-bool Args::ContainsEnvironmentVariable(const char *env_var_name,
+bool Args::ContainsEnvironmentVariable(llvm::StringRef env_var_name,
                                        size_t *argument_index) const {
   // Validate args.
-  if (!env_var_name)
+  if (env_var_name.empty())
     return false;
 
   // Check each arg to see if it matches the env var name.
   for (size_t i = 0; i < GetArgumentCount(); ++i) {
-    // Get the arg value.
-    const char *argument_value = GetArgumentAtIndex(i);
-    if (!argument_value)
-      continue;
+    auto arg_value = llvm::StringRef::withNullAsEmpty(GetArgumentAtIndex(0));
 
-    // Check if we are the "{env_var_name}={env_var_value}" style.
-    const char *equal_p = strchr(argument_value, '=');
-    if (equal_p) {
-      if (strncmp(env_var_name, argument_value, equal_p - argument_value) ==
-          0) {
-        // We matched.
-        if (argument_index)
-          *argument_index = i;
-        return true;
-      }
-    } else {
-      // We're a simple {env_var_name}-style entry.
-      if (strcmp(argument_value, env_var_name) == 0) {
-        // We matched.
-        if (argument_index)
-          *argument_index = i;
-        return true;
-      }
+    llvm::StringRef name, value;
+    std::tie(name, value) = arg_value.split('=');
+    if (name == env_var_name && !value.empty()) {
+      if (argument_index)
+        *argument_index = i;
+      return true;
     }
   }
 

Modified: lldb/trunk/source/Interpreter/CommandAlias.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandAlias.cpp?rev=281942&r1=281941&r2=281942&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/CommandAlias.cpp (original)
+++ lldb/trunk/source/Interpreter/CommandAlias.cpp Mon Sep 19 16:56:59 2016
@@ -41,7 +41,7 @@ static bool ProcessAliasOptionsArgs(lldb
     ExecutionContext exe_ctx =
         cmd_obj_sp->GetCommandInterpreter().GetExecutionContext();
     options->NotifyOptionParsingStarting(&exe_ctx);
-    args.Unshift("dummy_arg");
+    args.Unshift(llvm::StringRef("dummy_arg"));
     args.ParseAliasOptions(*options, result, option_arg_vector, 
options_string);
     args.Shift();
     if (result.Succeeded())

Modified: lldb/trunk/source/Interpreter/CommandInterpreter.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=281942&r1=281941&r2=281942&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/CommandInterpreter.cpp (original)
+++ lldb/trunk/source/Interpreter/CommandInterpreter.cpp Mon Sep 19 16:56:59 
2016
@@ -1333,7 +1333,7 @@ CommandObject *CommandInterpreter::Build
     std::string alias_name_str = alias_name;
     if ((cmd_args.GetArgumentCount() == 0) ||
         (alias_name_str.compare(cmd_args.GetArgumentAtIndex(0)) != 0))
-      cmd_args.Unshift(alias_name);
+      cmd_args.Unshift(alias_name_str);
 
     result_str.Printf("%s", alias_cmd_obj->GetCommandName());
 
@@ -1953,7 +1953,7 @@ void CommandInterpreter::BuildAliasComma
   // Make sure that the alias name is the 0th element in cmd_args
   std::string alias_name_str = alias_name;
   if (alias_name_str.compare(cmd_args.GetArgumentAtIndex(0)) != 0)
-    cmd_args.Unshift(alias_name);
+    cmd_args.Unshift(alias_name_str);
 
   Args new_args(alias_cmd_obj->GetCommandName());
   if (new_args.GetArgumentCount() == 2)

Modified: lldb/trunk/source/Interpreter/CommandObject.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandObject.cpp?rev=281942&r1=281941&r2=281942&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/CommandObject.cpp (original)
+++ lldb/trunk/source/Interpreter/CommandObject.cpp Mon Sep 19 16:56:59 2016
@@ -116,7 +116,7 @@ bool CommandObject::ParseOptions(Args &a
     // ParseOptions calls getopt_long_only, which always skips the zero'th item
     // in the array and starts at position 1,
     // so we need to push a dummy value into position zero.
-    args.Unshift("dummy_string");
+    args.Unshift(llvm::StringRef("dummy_string"));
     const bool require_validation = true;
     error = args.ParseOptions(*options, &exe_ctx,
                               GetCommandInterpreter().GetPlatform(true),
@@ -296,7 +296,7 @@ int CommandObject::HandleCompletion(Args
     if (cur_options != nullptr) {
       // Re-insert the dummy command name string which will have been
       // stripped off:
-      input.Unshift("dummy-string");
+      input.Unshift(llvm::StringRef("dummy-string"));
       cursor_index++;
 
       // I stick an element on the end of the input, because if the last 
element

Modified: lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp?rev=281942&r1=281941&r2=281942&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp Mon Sep 19 
16:56:59 2016
@@ -1881,11 +1881,12 @@ PlatformDarwin::LaunchProcess(lldb_priva
   // specifically want it unset.
   const char *disable_env_var = "IDE_DISABLED_OS_ACTIVITY_DT_MODE";
   auto &env_vars = launch_info.GetEnvironmentEntries();
-  if (!env_vars.ContainsEnvironmentVariable(disable_env_var)) {
+  if (!env_vars.ContainsEnvironmentVariable(llvm::StringRef(disable_env_var))) 
{
     // We want to make sure that OS_ACTIVITY_DT_MODE is set so that
     // we get os_log and NSLog messages mirrored to the target process
     // stderr.
-    if (!env_vars.ContainsEnvironmentVariable("OS_ACTIVITY_DT_MODE"))
+    if (!env_vars.ContainsEnvironmentVariable(
+            llvm::StringRef("OS_ACTIVITY_DT_MODE")))
       env_vars.AppendArgument(llvm::StringRef("OS_ACTIVITY_DT_MODE=enable"));
   }
 

Modified: 
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp?rev=281942&r1=281941&r2=281942&view=diff
==============================================================================
--- 
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp 
(original)
+++ 
lldb/trunk/source/Plugins/StructuredData/DarwinLog/StructuredDataDarwinLog.cpp 
Mon Sep 19 16:56:59 2016
@@ -1091,7 +1091,7 @@ EnableOptionsSP ParseAutoEnableOptions(E
   // ParseOptions calls getopt_long_only, which always skips the zero'th item 
in
   // the array and starts at position 1,
   // so we need to push a dummy value into position zero.
-  args.Unshift("dummy_string");
+  args.Unshift(llvm::StringRef("dummy_string"));
   bool require_validation = false;
   error = args.ParseOptions(*options_sp.get(), &exe_ctx, PlatformSP(),
                             require_validation);
@@ -1547,14 +1547,15 @@ Error StructuredDataDarwinLog::FilterLau
     // Here we need to strip out any OS_ACTIVITY_DT_MODE setting to prevent
     // echoing of os_log()/NSLog() to stderr in the target program.
     size_t argument_index;
-    if (env_vars.ContainsEnvironmentVariable("OS_ACTIVITY_DT_MODE",
-                                             &argument_index))
+    if (env_vars.ContainsEnvironmentVariable(
+            llvm::StringRef("OS_ACTIVITY_DT_MODE"), &argument_index))
       env_vars.DeleteArgumentAtIndex(argument_index);
 
     // We will also set the env var that tells any downstream launcher
     // from adding OS_ACTIVITY_DT_MODE.
-    
env_vars.AddOrReplaceEnvironmentVariable("IDE_DISABLED_OS_ACTIVITY_DT_MODE",
-                                             "1");
+    env_vars.AddOrReplaceEnvironmentVariable(
+        llvm::StringRef("IDE_DISABLED_OS_ACTIVITY_DT_MODE"),
+        llvm::StringRef("1"));
   }
 
   // Set the OS_ACTIVITY_MODE env var appropriately to enable/disable
@@ -1568,9 +1569,8 @@ Error StructuredDataDarwinLog::FilterLau
     env_var_value = "";
 
   if (env_var_value) {
-    const char *env_var_name = "OS_ACTIVITY_MODE";
     launch_info.GetEnvironmentEntries().AddOrReplaceEnvironmentVariable(
-        env_var_name, env_var_value);
+        llvm::StringRef("OS_ACTIVITY_MODE"), llvm::StringRef(env_var_value));
   }
 
   return error;


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

Reply via email to