[lldb] Fix that empty target.run-args are not actually used when launching process
authorRaphael Isemann <teemperor@gmail.com>
Wed, 16 Nov 2022 23:52:02 +0000 (00:52 +0100)
committerRaphael Isemann <teemperor@gmail.com>
Fri, 18 Nov 2022 15:48:56 +0000 (16:48 +0100)
`GetPropertyAtIndexAsArgs` returns true on success and false on failure. Right
now it returns the converted `size_t` returned from `GetArgs` which describes
the number of arguments in the argument list. So for empty argument lists
(`(size_t)0` -> `(bool)false`) this function always fails.

The only observable effect of this seems to be that empty arguments are never
propagated to the internal LaunchInfo for a process. This causes that once any
argument has been added to `target.run-args`, clearing `target.run-args` doesn't
have any effect.

Fixes issue #55568

Reviewed By: JDevlieghere, jingham

Differential Revision: https://reviews.llvm.org/D126057

lldb/source/Interpreter/OptionValueProperties.cpp
lldb/test/API/python_api/target/TestTargetAPI.py

index c2c13ba..62590bb 100644 (file)
@@ -248,16 +248,22 @@ bool OptionValueProperties::GetPropertyAtIndexAsArgs(
     return false;
 
   const OptionValueArgs *arguments = value->GetAsArgs();
-  if (arguments)
-    return arguments->GetArgs(args);
+  if (arguments) {
+    arguments->GetArgs(args);
+    return true;
+  }
 
   const OptionValueArray *array = value->GetAsArray();
-  if (array)
-    return array->GetArgs(args);
+  if (array) {
+    array->GetArgs(args);
+    return true;
+  }
 
   const OptionValueDictionary *dict = value->GetAsDictionary();
-  if (dict)
-    return dict->GetArgs(args);
+  if (dict) {
+    dict->GetArgs(args);
+    return true;
+  }
 
   return false;
 }
index 0b25144..f1a379b 100644 (file)
@@ -191,6 +191,15 @@ class TargetAPITestCase(TestBase):
         self.assertIn('arg: foo', output)
         self.assertIn('env: bar=baz', output)
 
+        # Clear all the run args set above.
+        self.runCmd("setting clear target.run-args")
+        process = target.LaunchSimple(None, None,
+                                      self.get_process_working_directory())
+        process.Continue()
+        self.assertEqual(process.GetState(), lldb.eStateExited)
+        output = process.GetSTDOUT(9999)
+        self.assertNotIn('arg: foo', output)
+
         self.runCmd("settings set target.disable-stdio true")
         process = target.LaunchSimple(
             None, None, self.get_process_working_directory())