From 39be7ce23363d12ae3e49aeb1fdb2bfeb892e836 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Thu, 2 Aug 2018 17:33:54 +0000 Subject: [PATCH] Vendor import of lldb trunk r338536: https://llvm.org/svn/llvm-project/lldb/trunk@338536 --- include/lldb/Utility/CompletionRequest.h | 35 +- include/lldb/Utility/Stream.h | 2 - .../TestMultipleDebuggers.py | 2 +- .../api/multithreaded/TestMultithreaded.py | 2 +- packages/Python/lldbsuite/test/decorators.py | 2 +- .../TestCallStdStringFunction.py | 2 +- .../call-restarts/TestCallThatRestarts.py | 2 +- .../call-throws/TestCallThatThrows.py | 2 +- .../expression_command/char/TestExprsChar.py | 2 +- .../expression_command/fixits/TestFixIts.py | 2 +- .../issue_11588/Test11588.py | 4 +- .../pr35310/TestExprsBug35310.py | 2 +- .../save_jit_objects/TestSaveJITObjects.py | 4 +- .../unwind_expression/TestUnwindExpression.py | 2 +- .../xvalue/TestXValuePrinting.py | 2 +- .../TestBadAddressBreakpoints.py | 2 +- .../TestBreakpointAutoContinue.py | 8 +- .../TestBreakpointLocations.py | 10 +- .../breakpoint_names/TestBreakpointNames.py | 30 +- .../TestHWBreakMultiThread.py | 6 +- .../serialize/TestBreakpointSerialization.py | 16 +- .../TestStepOverBreakpoint.py | 12 +- .../completion/TestCompletion.py | 46 +- .../test/functionalities/completion/main.cpp | 11 +- .../bitset/TestDataFormatterLibcxxBitset.py | 4 +- .../list/TestDataFormatterLibcxxList.py | 2 +- .../TestDataFormatterLibcxxMultiSet.py | 2 +- .../libcxx/set/TestDataFormatterLibcxxSet.py | 4 +- .../vector/TestDataFormatterLibcxxVector.py | 2 +- .../tuple/TestDataFormatterStdTuple.py | 2 +- .../test/functionalities/exec/TestExec.py | 2 +- .../frame-language/TestGuessLanguage.py | 6 +- .../functionalities/frame_var/TestFrameVar.py | 10 +- .../gdb_remote_client/TestTargetXMLArch.py | 12 +- .../gdb_remote_client/gdbclientutils.py | 2 +- .../history/TestHistoryRecall.py | 4 +- .../load_unload/TestLoadUnload.py | 4 +- .../load_using_paths/TestLoadUsingPaths.py | 22 +- .../pre_run_dylibs/TestPreRunDylibs.py | 2 +- .../register/intel_avx/TestZMMRegister.py | 2 +- .../return-value/TestReturnValue.py | 2 +- .../TestCreateDuringStep.py | 2 +- .../thread/num_threads/TestNumThreads.py | 2 +- .../thread/step_until/TestStepUntil.py | 2 +- .../TestWatchpointMultipleSlots.py | 4 +- .../TestWatchpointDisable.py | 6 +- .../c/find_struct_type/TestFindStructTypes.py | 2 +- .../TestDynamicValueSameBase.py | 6 +- .../TestCppIncompleteTypes.py | 2 +- .../test/lang/cpp/llvm-style/TestLLVMStyle.py | 2 +- .../test/lang/cpp/scope/TestCppScope.py | 2 +- .../lang/cpp/trivial_abi/TestTrivialABI.py | 4 +- packages/Python/lldbsuite/test/lldbdwarf.py | 6 +- packages/Python/lldbsuite/test/lldbtest.py | 15 +- packages/Python/lldbsuite/test/lldbutil.py | 10 +- .../find-app-in-bundle/TestFindAppInBundle.py | 6 +- .../TestBundleWithDotInFilename.py | 2 +- .../find-dsym/deep-bundle/TestDeepBundle.py | 4 +- .../thread-names/TestInterruptThreadNames.py | 6 +- .../python_api/name_lookup/TestNameLookup.py | 10 +- .../test/python_api/sbdata/TestSBData.py | 2 +- .../test/sample_test/TestSampleTest.py | 4 +- .../lldbsuite/test/settings/TestSettings.py | 2 +- .../startup_options/TestMiStartupOptions.py | 2 +- .../TestGdbRemote_qThreadStopInfo.py | 2 +- .../tools/lldb-server/TestLldbGdbServer.py | 2 +- source/Commands/CommandCompletions.cpp | 60 ++- source/Commands/CommandObjectCommands.cpp | 4 +- source/Commands/CommandObjectFrame.cpp | 2 +- source/Commands/CommandObjectMultiword.cpp | 26 +- source/Commands/CommandObjectPlatform.cpp | 6 +- source/Commands/CommandObjectPlugin.cpp | 2 +- source/Commands/CommandObjectProcess.cpp | 6 +- source/Commands/CommandObjectSettings.cpp | 18 +- source/Commands/CommandObjectTarget.cpp | 10 +- source/Core/FormatEntity.cpp | 23 +- source/Core/IOHandler.cpp | 4 +- source/Interpreter/CommandInterpreter.cpp | 26 +- source/Interpreter/CommandObject.cpp | 3 +- .../Interpreter/CommandObjectRegexCommand.cpp | 3 +- source/Interpreter/OptionValue.cpp | 3 +- source/Interpreter/OptionValueArch.cpp | 3 +- source/Interpreter/OptionValueBoolean.cpp | 5 +- source/Interpreter/OptionValueEnumeration.cpp | 8 +- source/Interpreter/OptionValueFileSpec.cpp | 3 +- source/Interpreter/OptionValueUUID.cpp | 5 +- source/Interpreter/Options.cpp | 22 +- .../Platform/Android/PlatformAndroid.cpp | 10 +- .../Platform/Windows/PlatformWindows.cpp | 2 +- .../SymbolFile/DWARF/DWARFCompileUnit.h | 2 - source/Plugins/SymbolFile/DWARF/DWARFUnit.h | 2 - source/Symbol/Variable.cpp | 13 +- source/Utility/ArchSpec.cpp | 8 +- source/Utility/CompletionRequest.cpp | 1 + source/Utility/Stream.cpp | 45 -- unittests/Utility/CMakeLists.txt | 1 + unittests/Utility/CompletionRequestTest.cpp | 67 ++- unittests/Utility/StreamTest.cpp | 474 ++++++++++++++++++ 98 files changed, 915 insertions(+), 351 deletions(-) create mode 100644 unittests/Utility/StreamTest.cpp diff --git a/include/lldb/Utility/CompletionRequest.h b/include/lldb/Utility/CompletionRequest.h index cfae16f00b3..ef75474813e 100644 --- a/include/lldb/Utility/CompletionRequest.h +++ b/include/lldb/Utility/CompletionRequest.h @@ -13,6 +13,7 @@ #include "lldb/Utility/Args.h" #include "lldb/Utility/StringList.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringSet.h" namespace lldb_private { @@ -77,8 +78,29 @@ class CompletionRequest { void SetWordComplete(bool v) { m_word_complete = v; } - /// The array of matches returned. - StringList &GetMatches() { return *m_matches; } + /// Adds a possible completion string. If the completion was already + /// suggested before, it will not be added to the list of results. A copy of + /// the suggested completion is stored, so the given string can be free'd + /// afterwards. + /// + /// @param match The suggested completion. + void AddCompletion(llvm::StringRef completion) { + // Add the completion if we haven't seen the same value before. + if (m_match_set.insert(completion).second) + m_matches->AppendString(completion); + } + + /// Adds multiple possible completion strings. + /// + /// \param completions The list of completions. + /// + /// @see AddCompletion + void AddCompletions(const StringList &completions) { + for (std::size_t i = 0; i < completions.GetSize(); ++i) + AddCompletion(completions.GetStringAtIndex(i)); + } + + std::size_t GetNumberOfMatches() const { return m_matches->GetSize(); } llvm::StringRef GetCursorArgument() const { return GetParsedLine().GetArgumentAtIndex(GetCursorIndex()); @@ -111,8 +133,15 @@ class CompletionRequest { /// \btrue if this is a complete option value (a space will be inserted /// after the completion.) \bfalse otherwise. bool m_word_complete = false; - // We don't own the list. + + // Note: This list is kept private. This is by design to prevent that any + // completion depends on any already computed completion from another backend. + // Note: We don't own the list. It's owned by the creator of the + // CompletionRequest object. StringList *m_matches; + + /// List of added completions so far. Used to filter out duplicates. + llvm::StringSet<> m_match_set; }; } // namespace lldb_private diff --git a/include/lldb/Utility/Stream.h b/include/lldb/Utility/Stream.h index bf837749fa3..4930521d949 100644 --- a/include/lldb/Utility/Stream.h +++ b/include/lldb/Utility/Stream.h @@ -524,8 +524,6 @@ class Stream { //------------------------------------------------------------------ size_t PutULEB128(uint64_t uval); - static void UnitTest(Stream *s); - protected: //------------------------------------------------------------------ // Member variables diff --git a/packages/Python/lldbsuite/test/api/multiple-debuggers/TestMultipleDebuggers.py b/packages/Python/lldbsuite/test/api/multiple-debuggers/TestMultipleDebuggers.py index 27bd472caf9..f6bde75dcb7 100644 --- a/packages/Python/lldbsuite/test/api/multiple-debuggers/TestMultipleDebuggers.py +++ b/packages/Python/lldbsuite/test/api/multiple-debuggers/TestMultipleDebuggers.py @@ -18,7 +18,7 @@ class TestMultipleSimultaneousDebuggers(TestBase): mydir = TestBase.compute_mydir(__file__) - # This test case fails non-deterministically. + # This test case fails non-deterministically. @skipIfNoSBHeaders @expectedFailureAll(bugnumber="llvm.org/pr20282") def test_multiple_debuggers(self): diff --git a/packages/Python/lldbsuite/test/api/multithreaded/TestMultithreaded.py b/packages/Python/lldbsuite/test/api/multithreaded/TestMultithreaded.py index 4e550c9c24d..dd03fcf31e8 100644 --- a/packages/Python/lldbsuite/test/api/multithreaded/TestMultithreaded.py +++ b/packages/Python/lldbsuite/test/api/multithreaded/TestMultithreaded.py @@ -16,7 +16,7 @@ class SBBreakpointCallbackCase(TestBase): NO_DEBUG_INFO_TESTCASE = True - + def setUp(self): TestBase.setUp(self) self.generateSource('driver.cpp') diff --git a/packages/Python/lldbsuite/test/decorators.py b/packages/Python/lldbsuite/test/decorators.py index 1fdfd2caac0..8b33cad3d1b 100644 --- a/packages/Python/lldbsuite/test/decorators.py +++ b/packages/Python/lldbsuite/test/decorators.py @@ -791,7 +791,7 @@ def skipIfLLVMTargetMissing(target): if targets.GetItemAtIndex(i).GetStringValue(99) == target: found = True break - + return unittest2.skipIf(not found, "requires " + target) # Call sysctl on darwin to see if a specified hardware feature is available on this machine. diff --git a/packages/Python/lldbsuite/test/expression_command/call-function/TestCallStdStringFunction.py b/packages/Python/lldbsuite/test/expression_command/call-function/TestCallStdStringFunction.py index 079ab6d6088..8f2ea371f2b 100644 --- a/packages/Python/lldbsuite/test/expression_command/call-function/TestCallStdStringFunction.py +++ b/packages/Python/lldbsuite/test/expression_command/call-function/TestCallStdStringFunction.py @@ -46,7 +46,7 @@ def test_with(self): # Calling this function now succeeds, but we follow the typedef return type through to # const char *, and thus don't invoke the Summary formatter. - # clang's libstdc++ on ios arm64 inlines std::string::c_str() always; + # clang's libstdc++ on ios arm64 inlines std::string::c_str() always; # skip this part of the test. triple = self.dbg.GetSelectedPlatform().GetTriple() do_cstr_test = True diff --git a/packages/Python/lldbsuite/test/expression_command/call-restarts/TestCallThatRestarts.py b/packages/Python/lldbsuite/test/expression_command/call-restarts/TestCallThatRestarts.py index 5eb7b309c94..1182b156e80 100644 --- a/packages/Python/lldbsuite/test/expression_command/call-restarts/TestCallThatRestarts.py +++ b/packages/Python/lldbsuite/test/expression_command/call-restarts/TestCallThatRestarts.py @@ -48,7 +48,7 @@ def check_after_call(self, num_sigchld): "Restored the zeroth frame correctly") def call_function(self): - (target, process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + (target, process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(self, 'Stop here in main.', self.main_source_spec) # Make sure the SIGCHLD behavior is pass/no-stop/no-notify: diff --git a/packages/Python/lldbsuite/test/expression_command/call-throws/TestCallThatThrows.py b/packages/Python/lldbsuite/test/expression_command/call-throws/TestCallThatThrows.py index f2ec340ac84..c6b90ba5ba0 100644 --- a/packages/Python/lldbsuite/test/expression_command/call-throws/TestCallThatThrows.py +++ b/packages/Python/lldbsuite/test/expression_command/call-throws/TestCallThatThrows.py @@ -37,7 +37,7 @@ def check_after_call(self): def call_function(self): """Test calling function that throws.""" - (target, process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + (target, process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(self, 'I am about to throw.', self.main_source_spec) options = lldb.SBExpressionOptions() diff --git a/packages/Python/lldbsuite/test/expression_command/char/TestExprsChar.py b/packages/Python/lldbsuite/test/expression_command/char/TestExprsChar.py index 2f140687476..b328ece6d39 100644 --- a/packages/Python/lldbsuite/test/expression_command/char/TestExprsChar.py +++ b/packages/Python/lldbsuite/test/expression_command/char/TestExprsChar.py @@ -22,7 +22,7 @@ def do_test(self, dictionary=None): """These basic expression commands should work as expected.""" self.build(dictionary=dictionary) - (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, '// Break here', self.main_source_spec) frame = thread.GetFrameAtIndex(0) diff --git a/packages/Python/lldbsuite/test/expression_command/fixits/TestFixIts.py b/packages/Python/lldbsuite/test/expression_command/fixits/TestFixIts.py index 4b096149e72..9aa28f77a3f 100644 --- a/packages/Python/lldbsuite/test/expression_command/fixits/TestFixIts.py +++ b/packages/Python/lldbsuite/test/expression_command/fixits/TestFixIts.py @@ -37,7 +37,7 @@ def test_with_dummy_target(self): def try_expressions(self): """Test calling expressions with errors that can be fixed by the FixIts.""" - (target, process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + (target, process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(self, 'Stop here to evaluate expressions', self.main_source_spec) options = lldb.SBExpressionOptions() diff --git a/packages/Python/lldbsuite/test/expression_command/issue_11588/Test11588.py b/packages/Python/lldbsuite/test/expression_command/issue_11588/Test11588.py index a2d68cffe54..09b0eaaa2b1 100644 --- a/packages/Python/lldbsuite/test/expression_command/issue_11588/Test11588.py +++ b/packages/Python/lldbsuite/test/expression_command/issue_11588/Test11588.py @@ -32,8 +32,8 @@ def cleanup(): """valobj.AddressOf() should return correct values.""" self.build() - (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, - 'Set breakpoint here.', + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + 'Set breakpoint here.', lldb.SBFileSpec("main.cpp", False)) self.runCmd("command script import --allow-reload s11588.py") self.runCmd( diff --git a/packages/Python/lldbsuite/test/expression_command/pr35310/TestExprsBug35310.py b/packages/Python/lldbsuite/test/expression_command/pr35310/TestExprsBug35310.py index 9cc9df2b22b..dd3d06fd672 100644 --- a/packages/Python/lldbsuite/test/expression_command/pr35310/TestExprsBug35310.py +++ b/packages/Python/lldbsuite/test/expression_command/pr35310/TestExprsBug35310.py @@ -25,7 +25,7 @@ def test_issue35310(self): """ self.build() - (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, '// Break here', self.main_source_spec) frame = thread.GetFrameAtIndex(0) diff --git a/packages/Python/lldbsuite/test/expression_command/save_jit_objects/TestSaveJITObjects.py b/packages/Python/lldbsuite/test/expression_command/save_jit_objects/TestSaveJITObjects.py index c1a1b375e15..fe6816f6aba 100644 --- a/packages/Python/lldbsuite/test/expression_command/save_jit_objects/TestSaveJITObjects.py +++ b/packages/Python/lldbsuite/test/expression_command/save_jit_objects/TestSaveJITObjects.py @@ -16,7 +16,7 @@ class SaveJITObjectsTestCase(TestBase): def enumerateJITFiles(self): return [f for f in os.listdir(self.getBuildDir()) if f.startswith("jit")] - + def countJITFiles(self): return len(self.enumerateJITFiles()) @@ -31,7 +31,7 @@ def test_save_jit_objects(self): os.chdir(self.getBuildDir()) src_file = "main.c" src_file_spec = lldb.SBFileSpec(src_file) - + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( self, "break", src_file_spec) diff --git a/packages/Python/lldbsuite/test/expression_command/unwind_expression/TestUnwindExpression.py b/packages/Python/lldbsuite/test/expression_command/unwind_expression/TestUnwindExpression.py index 3b01d4470de..c942427a8e6 100644 --- a/packages/Python/lldbsuite/test/expression_command/unwind_expression/TestUnwindExpression.py +++ b/packages/Python/lldbsuite/test/expression_command/unwind_expression/TestUnwindExpression.py @@ -23,7 +23,7 @@ class UnwindFromExpressionTest(TestBase): def build_and_run_to_bkpt(self): self.build() - (target, process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + (target, process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(self, "// Set a breakpoint here to get started", self.main_spec) # Next set a breakpoint in this function, set up Expression options to stop on diff --git a/packages/Python/lldbsuite/test/expression_command/xvalue/TestXValuePrinting.py b/packages/Python/lldbsuite/test/expression_command/xvalue/TestXValuePrinting.py index 4ad4225a5fe..3aac6488660 100644 --- a/packages/Python/lldbsuite/test/expression_command/xvalue/TestXValuePrinting.py +++ b/packages/Python/lldbsuite/test/expression_command/xvalue/TestXValuePrinting.py @@ -22,7 +22,7 @@ def do_test(self, dictionary=None): """Printing an xvalue should work.""" self.build(dictionary=dictionary) - (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, '// Break here', self.main_source_spec) frame = thread.GetFrameAtIndex(0) diff --git a/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestBadAddressBreakpoints.py b/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestBadAddressBreakpoints.py index 5014c1cd4a2..460e07ceadf 100644 --- a/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestBadAddressBreakpoints.py +++ b/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestBadAddressBreakpoints.py @@ -31,7 +31,7 @@ def setUp(self): def address_breakpoints(self): """Test that breakpoints set on a bad address say they are bad.""" target, process, thread, bkpt = \ - lldbutil.run_to_source_breakpoint(self, + lldbutil.run_to_source_breakpoint(self, "Set a breakpoint here", lldb.SBFileSpec("main.c")) diff --git a/packages/Python/lldbsuite/test/functionalities/breakpoint/auto_continue/TestBreakpointAutoContinue.py b/packages/Python/lldbsuite/test/functionalities/breakpoint/auto_continue/TestBreakpointAutoContinue.py index 0123e732e35..b5e38eec579 100644 --- a/packages/Python/lldbsuite/test/functionalities/breakpoint/auto_continue/TestBreakpointAutoContinue.py +++ b/packages/Python/lldbsuite/test/functionalities/breakpoint/auto_continue/TestBreakpointAutoContinue.py @@ -34,17 +34,17 @@ def test_auto_continue_on_location(self): self.build() self.auto_continue_location() - def make_target_and_bkpt(self, additional_options=None, num_expected_loc=1, + def make_target_and_bkpt(self, additional_options=None, num_expected_loc=1, pattern="Set a breakpoint here"): exe = self.getBuildArtifact("a.out") self.target = self.dbg.CreateTarget(exe) self.assertTrue(self.target.IsValid(), "Target is not valid") - + extra_options_txt = "--auto-continue 1 " if additional_options: extra_options_txt += additional_options - bpno = lldbutil.run_break_set_by_source_regexp(self, pattern, - extra_options = extra_options_txt, + bpno = lldbutil.run_break_set_by_source_regexp(self, pattern, + extra_options = extra_options_txt, num_expected_locations = num_expected_loc) return bpno diff --git a/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_locations/TestBreakpointLocations.py b/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_locations/TestBreakpointLocations.py index 7eb465f2959..f4835a9b9c4 100644 --- a/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_locations/TestBreakpointLocations.py +++ b/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_locations/TestBreakpointLocations.py @@ -46,12 +46,12 @@ def set_breakpoint (self): self.assertTrue(target, "Target %s is not valid"%(exe)) # This should create a breakpoint with 3 locations. - + bkpt = target.BreakpointCreateByLocation("main.c", self.line) # The breakpoint list should show 3 locations. self.assertEqual(bkpt.GetNumLocations(), 3, "Wrong number of locations") - + self.expect( "breakpoint list -f", "Breakpoint locations shown correctly", @@ -62,7 +62,7 @@ def set_breakpoint (self): "where = a.out`func_inlined .+unresolved, hit count = 0", "where = a.out`main .+\[inlined\].+unresolved, hit count = 0"]) - return bkpt + return bkpt def shadowed_bkpt_cond_test(self): """Test that options set on the breakpoint and location behave correctly.""" @@ -106,7 +106,7 @@ def shadowed_bkpt_command_test(self): commands = ["AAAAAA", "BBBBBB", "CCCCCC"] str_list = lldb.SBStringList() str_list.AppendList(commands, len(commands)) - + bkpt.SetCommandLineCommands(str_list) cmd_list = lldb.SBStringList() bkpt.GetCommandLineCommands(cmd_list) @@ -123,7 +123,7 @@ def shadowed_bkpt_command_test(self): bkpt.location[1].GetCommandLineCommands(loc_cmd_list) loc_list_size = loc_list.GetSize() - + # Check that the location has the right commands: self.assertEqual(loc_cmd_list.GetSize() , loc_list_size, "Added the right number of commands to location") for i in range(0,loc_list_size): diff --git a/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_names/TestBreakpointNames.py b/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_names/TestBreakpointNames.py index 8b5352866c2..b36e915e220 100644 --- a/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_names/TestBreakpointNames.py +++ b/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_names/TestBreakpointNames.py @@ -64,7 +64,7 @@ def setup_target(self): self.target = self.dbg.CreateTarget(exe) self.assertTrue(self.target, VALID_TARGET) self.main_file_spec = lldb.SBFileSpec(os.path.join(self.getSourceDir(), "main.c")) - + def check_name_in_target(self, bkpt_name): name_list = lldb.SBStringList() self.target.GetBreakpointNames(name_list) @@ -74,7 +74,7 @@ def check_name_in_target(self, bkpt_name): found_it = True break self.assertTrue(found_it, "Didn't find the name %s in the target's name list:"%(bkpt_name)) - + def setUp(self): # Call super's setUp(). TestBase.setUp(self) @@ -107,14 +107,14 @@ def do_check_names(self): matches = bkpt.MatchesName(bkpt_name) self.assertTrue(matches, "We didn't match the name we just set") - + # Make sure we don't match irrelevant names: matches = bkpt.MatchesName("NotABreakpoint") self.assertTrue(not matches, "We matched a name we didn't set.") # Make sure the name is also in the target: self.check_name_in_target(bkpt_name) - + # Add another name, make sure that works too: bkpt.AddName(other_bkpt_name) @@ -132,7 +132,7 @@ def do_check_names(self): bkpt.GetNames(name_list) num_names = name_list.GetSize() self.assertTrue(num_names == 1, "Name list has %d items, expected 1."%(num_names)) - + name = name_list.GetStringAtIndex(0) self.assertTrue(name == other_bkpt_name, "Remaining name was: %s expected %s."%(name, other_bkpt_name)) @@ -156,7 +156,7 @@ def do_check_illegal_names(self): def do_check_using_names(self): """Use Python APIs to check names work in place of breakpoint ID's.""" - + bkpt = self.target.BreakpointCreateByLocation(self.main_file_spec, 10) bkpt_name = "ABreakpoint" other_bkpt_name= "_AnotherBreakpoint" @@ -255,12 +255,12 @@ def do_check_configuring_names(self): bp_name.SetAutoContinue(new_auto_continue) self.assertEqual(bp_name.GetAutoContinue(), new_auto_continue, "Couldn't change auto-continue on the name") self.assertEqual(bkpt.GetAutoContinue(), new_auto_continue, "Option didn't propagate to the breakpoint.") - + # Now make this same breakpoint name - but from the command line - cmd_str = "breakpoint name configure %s -o %d -i %d -c '%s' -G %d -t %d -x %d -T '%s' -q '%s' -H '%s'"%(cl_bp_name_string, - self.is_one_shot, - self.ignore_count, - self.condition, + cmd_str = "breakpoint name configure %s -o %d -i %d -c '%s' -G %d -t %d -x %d -T '%s' -q '%s' -H '%s'"%(cl_bp_name_string, + self.is_one_shot, + self.ignore_count, + self.condition, self.auto_continue, self.tid, self.tidx, @@ -269,7 +269,7 @@ def do_check_configuring_names(self): self.help_string) for cmd in self.cmd_list: cmd_str += " -C '%s'"%(cmd) - + self.runCmd(cmd_str, check=True) # Now look up this name again and check its options: cl_name = lldb.SBBreakpointName(self.target, cl_bp_name_string) @@ -280,14 +280,14 @@ def do_check_configuring_names(self): new_help = "I do something even more interesting" cl_name.SetHelpString(new_help) self.assertEqual(new_help, cl_name.GetHelpString(), "SetHelpString didn't") - + # We should have three names now, make sure the target can list them: name_list = lldb.SBStringList() self.target.GetBreakpointNames(name_list) for name_string in [self.bp_name_string, other_bp_name_string, cl_bp_name_string]: self.assertTrue(name_string in name_list, "Didn't find %s in names"%(name_string)) - # Delete the name from the current target. Make sure that works and deletes the + # Delete the name from the current target. Make sure that works and deletes the # name from the breakpoint as well: self.target.DeleteBreakpointName(self.bp_name_string) name_list.Clear() @@ -305,7 +305,7 @@ def do_check_configuring_names(self): self.assertTrue(self.bp_name_string not in name_list, "Didn't delete %s from the dummy target"%(self.bp_name_string)) # Also make sure the name got removed from breakpoints holding it: self.assertFalse(bkpt.MatchesName(self.bp_name_string), "Didn't remove the name from the breakpoint.") - + def check_permission_results(self, bp_name): self.assertEqual(bp_name.GetAllowDelete(), False, "Didn't set allow delete.") protected_bkpt = self.target.BreakpointCreateByLocation(self.main_file_spec, 10) diff --git a/packages/Python/lldbsuite/test/functionalities/breakpoint/hardware_breakpoints/hardware_breakpoint_on_multiple_threads/TestHWBreakMultiThread.py b/packages/Python/lldbsuite/test/functionalities/breakpoint/hardware_breakpoints/hardware_breakpoint_on_multiple_threads/TestHWBreakMultiThread.py index 69dfac22525..99b54329a0e 100644 --- a/packages/Python/lldbsuite/test/functionalities/breakpoint/hardware_breakpoints/hardware_breakpoint_on_multiple_threads/TestHWBreakMultiThread.py +++ b/packages/Python/lldbsuite/test/functionalities/breakpoint/hardware_breakpoints/hardware_breakpoint_on_multiple_threads/TestHWBreakMultiThread.py @@ -25,7 +25,7 @@ class HardwareBreakpointMultiThreadTestCase(TestBase): @expectedFailureAndroid def test_hw_break_set_delete_multi_thread(self): self.build() - self.setTearDownCleanup() + self.setTearDownCleanup() self.break_multi_thread('delete') # LLDB supports hardware breakpoints for arm and aarch64 architectures. @@ -33,7 +33,7 @@ def test_hw_break_set_delete_multi_thread(self): @expectedFailureAndroid def test_hw_break_set_disable_multi_thread(self): self.build() - self.setTearDownCleanup() + self.setTearDownCleanup() self.break_multi_thread('disable') def setUp(self): @@ -74,7 +74,7 @@ def break_multi_thread(self, removal_type): count = 0 while count < 2 : - + self.runCmd("process continue") # We should be stopped in hw_break_function diff --git a/packages/Python/lldbsuite/test/functionalities/breakpoint/serialize/TestBreakpointSerialization.py b/packages/Python/lldbsuite/test/functionalities/breakpoint/serialize/TestBreakpointSerialization.py index 5c3da17c254..c615278e8d4 100644 --- a/packages/Python/lldbsuite/test/functionalities/breakpoint/serialize/TestBreakpointSerialization.py +++ b/packages/Python/lldbsuite/test/functionalities/breakpoint/serialize/TestBreakpointSerialization.py @@ -65,7 +65,7 @@ def cleanup (): # Create the targets we are making breakpoints in and copying them to: self.orig_target = self.dbg.CreateTarget(exe) self.assertTrue(self.orig_target, VALID_TARGET) - + self.copy_target = self.dbg.CreateTarget(exe) self.assertTrue(self.copy_target, VALID_TARGET) @@ -91,7 +91,7 @@ def check_equivalence(self, source_bps, do_write = True): num_source_bps = source_bps.GetSize() num_copy_bps = copy_bps.GetSize() self.assertTrue(num_source_bps == num_copy_bps, "Didn't get same number of input and output breakpoints - orig: %d copy: %d"%(num_source_bps, num_copy_bps)) - + for i in range(0, num_source_bps): source_bp = source_bps.GetBreakpointAtIndex(i) source_desc = lldb.SBStream() @@ -132,7 +132,7 @@ def do_check_resolvers(self): source_bps.Append(self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeAuto, empty_module_list, empty_cu_list)) source_bps.Append(self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeFull, empty_module_list,empty_cu_list)) source_bps.Append(self.orig_target.BreakpointCreateBySourceRegex("dont really care", blubby_file_spec)) - + # And some number greater than one: self.check_equivalence(source_bps) @@ -185,7 +185,7 @@ def do_check_options(self): bkpt.SetOneShot(True) bkpt.SetThreadID(10) source_bps.Append(bkpt) - + # Make sure we get one right: self.check_equivalence(source_bps) source_bps.Clear() @@ -232,7 +232,7 @@ def do_check_appending(self): bkpt.SetThreadID(10) source_bps.Append(bkpt) all_bps.Append(bkpt) - + error = lldb.SBError() error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, source_bps) self.assertTrue(error.Success(), "Failed writing breakpoints to file: %s."%(error.GetCString())) @@ -265,7 +265,7 @@ def do_check_names(self): write_bps = lldb.SBBreakpointList(self.orig_target) bkpt.AddName(good_bkpt_name) write_bps.Append(bkpt) - + error = lldb.SBError() error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, write_bps) self.assertTrue(error.Success(), "Failed writing breakpoints to file: %s."%(error.GetCString())) @@ -282,7 +282,3 @@ def do_check_names(self): error = self.copy_target.BreakpointsCreateFromFile(self.bkpts_file_spec, names_list, copy_bps) self.assertTrue(error.Success(), "Failed reading breakpoints from file: %s"%(error.GetCString())) self.assertTrue(copy_bps.GetSize() == 1, "Found the matching breakpoint.") - - - - diff --git a/packages/Python/lldbsuite/test/functionalities/breakpoint/step_over_breakpoint/TestStepOverBreakpoint.py b/packages/Python/lldbsuite/test/functionalities/breakpoint/step_over_breakpoint/TestStepOverBreakpoint.py index c2084295ef7..07fd04940d9 100644 --- a/packages/Python/lldbsuite/test/functionalities/breakpoint/step_over_breakpoint/TestStepOverBreakpoint.py +++ b/packages/Python/lldbsuite/test/functionalities/breakpoint/step_over_breakpoint/TestStepOverBreakpoint.py @@ -1,8 +1,8 @@ """ Test that breakpoints do not affect stepping. -Check for correct StopReason when stepping to the line with breakpoint +Check for correct StopReason when stepping to the line with breakpoint which chould be eStopReasonBreakpoint in general, -and eStopReasonPlanComplete when breakpoint's condition fails. +and eStopReasonPlanComplete when breakpoint's condition fails. """ from __future__ import print_function @@ -19,7 +19,7 @@ class StepOverBreakpointsTestCase(TestBase): def setUp(self): TestBase.setUp(self) - + self.build() exe = self.getBuildArtifact("a.out") src = lldb.SBFileSpec("main.cpp") @@ -32,7 +32,7 @@ def setUp(self): self.line1 = line_number('main.cpp', "breakpoint_1") self.line4 = line_number('main.cpp', "breakpoint_4") - self.breakpoint1 = self.target.BreakpointCreateByLocation(src, self.line1) + self.breakpoint1 = self.target.BreakpointCreateByLocation(src, self.line1) self.assertTrue( self.breakpoint1 and self.breakpoint1.GetNumLocations() == 1, VALID_BREAKPOINT) @@ -52,7 +52,7 @@ def setUp(self): self.thread = lldbutil.get_one_thread_stopped_at_breakpoint(self.process, self.breakpoint1) self.assertIsNotNone(self.thread, "Didn't stop at breakpoint 1.") - def test_step_instruction(self): + def test_step_instruction(self): # Count instructions between breakpoint_1 and breakpoint_4 contextList = self.target.FindFunctions('main', lldb.eFunctionNameTypeAuto) self.assertEquals(contextList.GetSize(), 1) @@ -89,7 +89,7 @@ def test_step_instruction(self): @skipIf(bugnumber="llvm.org/pr31972", hostoslist=["windows"]) def test_step_over(self): #lldb.DBG.EnableLog("lldb", ["step","breakpoint"]) - + self.thread.StepOver() # We should be stopped at the breakpoint_2 line with stop plan complete reason self.assertEquals(self.process.GetState(), lldb.eStateStopped) diff --git a/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py b/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py index a3b23834ee1..5d4fcf64511 100644 --- a/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py +++ b/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py @@ -38,6 +38,46 @@ def test_de(self): """Test that 'de' completes to 'detach '.""" self.complete_from_to('de', 'detach ') + @skipIfFreeBSD # timing out on the FreeBSD buildbot + def test_frame_variable(self): + self.build() + self.main_source = "main.cpp" + self.main_source_spec = lldb.SBFileSpec(self.main_source) + self.dbg.CreateTarget(self.getBuildArtifact("a.out")) + + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + '// Break here', self.main_source_spec) + self.assertEquals(process.GetState(), lldb.eStateStopped) + # FIXME: This pulls in the debug information to make the completions work, + # but the completions should also work without. + self.runCmd("frame variable fooo") + + self.complete_from_to('frame variable fo', + 'frame variable fooo') + self.complete_from_to('frame variable fooo.', + 'frame variable fooo.') + self.complete_from_to('frame variable fooo.dd', + 'frame variable fooo.dd') + + self.complete_from_to('frame variable ptr_fooo->', + 'frame variable ptr_fooo->') + self.complete_from_to('frame variable ptr_fooo->dd', + 'frame variable ptr_fooo->dd') + + self.complete_from_to('frame variable cont', + 'frame variable container') + self.complete_from_to('frame variable container.', + 'frame variable container.MemberVar') + self.complete_from_to('frame variable container.Mem', + 'frame variable container.MemberVar') + + self.complete_from_to('frame variable ptr_cont', + 'frame variable ptr_container') + self.complete_from_to('frame variable ptr_container->', + 'frame variable ptr_container->MemberVar') + self.complete_from_to('frame variable ptr_container->Mem', + 'frame variable ptr_container->MemberVar') + @skipIfFreeBSD # timing out on the FreeBSD buildbot def test_process_attach_dash_dash_con(self): """Test that 'process attach --con' completes to 'process attach --continue '.""" @@ -261,7 +301,7 @@ def complete_from_to(self, str_input, patterns, turn_off_re_match=False): common_match = match_strings.GetStringAtIndex(0) if num_matches == 0: compare_string = str_input - else: + else: if common_match != None and len(common_match) > 0: compare_string = str_input + common_match else: @@ -273,8 +313,8 @@ def complete_from_to(self, str_input, patterns, turn_off_re_match=False): if turn_off_re_match: self.expect( compare_string, msg=COMPLETION_MSG( - str_input, p), exe=False, substrs=[p]) + str_input, p, match_strings), exe=False, substrs=[p]) else: self.expect( compare_string, msg=COMPLETION_MSG( - str_input, p), exe=False, patterns=[p]) + str_input, p, match_strings), exe=False, patterns=[p]) diff --git a/packages/Python/lldbsuite/test/functionalities/completion/main.cpp b/packages/Python/lldbsuite/test/functionalities/completion/main.cpp index b408720d2cd..0814bb9cc0a 100644 --- a/packages/Python/lldbsuite/test/functionalities/completion/main.cpp +++ b/packages/Python/lldbsuite/test/functionalities/completion/main.cpp @@ -7,8 +7,15 @@ class Foo } }; +struct Container { int MemberVar; }; + int main() { - Foo f; - f.Bar(1, 2); + Foo fooo; + Foo *ptr_fooo = &fooo; + fooo.Bar(1, 2); + + Container container; + Container *ptr_container = &container; + return container.MemberVar = 3; // Break here } diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/bitset/TestDataFormatterLibcxxBitset.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/bitset/TestDataFormatterLibcxxBitset.py index 4fa115e5165..a0da4e41afe 100644 --- a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/bitset/TestDataFormatterLibcxxBitset.py +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/bitset/TestDataFormatterLibcxxBitset.py @@ -49,7 +49,7 @@ def test_value(self): def test_ptr_and_ref(self): """Test that ref and ptr to std::bitset is displayed correctly""" self.build() - (_, process, _, bkpt) = lldbutil.run_to_source_breakpoint(self, + (_, process, _, bkpt) = lldbutil.run_to_source_breakpoint(self, 'Check ref and ptr', lldb.SBFileSpec("main.cpp", False)) @@ -57,6 +57,6 @@ def test_ptr_and_ref(self): self.check("ptr", 13) lldbutil.continue_to_breakpoint(process, bkpt) - + self.check("ref", 200) self.check("ptr", 200) diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/TestDataFormatterLibcxxList.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/TestDataFormatterLibcxxList.py index 5f48b3541e5..90a7e119fb8 100644 --- a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/TestDataFormatterLibcxxList.py +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/TestDataFormatterLibcxxList.py @@ -90,7 +90,7 @@ def cleanup(): self.runCmd("n") # This gets up past the printf self.runCmd("n") # Now advance over the first push_back. - + self.expect("frame variable numbers_list", substrs=['list has 1 items', '[0] = ', diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/multiset/TestDataFormatterLibcxxMultiSet.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/multiset/TestDataFormatterLibcxxMultiSet.py index 72a886ff128..0732c03de83 100644 --- a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/multiset/TestDataFormatterLibcxxMultiSet.py +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/multiset/TestDataFormatterLibcxxMultiSet.py @@ -134,7 +134,7 @@ def test_ref_and_ptr(self): """Test that the data formatters work on ref and ptr.""" self.build() (self.target, process, _, bkpt) = lldbutil.run_to_source_breakpoint( - self, "Stop here to check by ref and ptr.", + self, "Stop here to check by ref and ptr.", lldb.SBFileSpec("main.cpp", False)) # The reference should print just like the value: self.check_ii("ref") diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/set/TestDataFormatterLibcxxSet.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/set/TestDataFormatterLibcxxSet.py index a6f1a3d2f43..8d83f2b081f 100644 --- a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/set/TestDataFormatterLibcxxSet.py +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/set/TestDataFormatterLibcxxSet.py @@ -130,7 +130,7 @@ def test_ref_and_ptr(self): """Test that the data formatters work on ref and ptr.""" self.build() (self.target, process, _, bkpt) = lldbutil.run_to_source_breakpoint( - self, "Stop here to check by ref and ptr.", + self, "Stop here to check by ref and ptr.", lldb.SBFileSpec("main.cpp", False)) # The reference should print just like the value: self.check_ii("ref") @@ -139,4 +139,4 @@ def test_ref_and_ptr(self): substrs=["ptr =", "size=7"]) self.expect("expr ptr", substrs=["size=7"]) - + diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py index aeb10984b3b..237e27fe1f3 100644 --- a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py @@ -192,7 +192,7 @@ def test_ref_and_ptr(self): self.check_numbers("ref") # The pointer should just show the right number of elements: - + self.expect("frame variable ptr", substrs=['ptr =', ' size=7']) self.expect("p ptr", substrs=['$', 'size=7']) diff --git a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/TestDataFormatterStdTuple.py b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/TestDataFormatterStdTuple.py index c2e02f54669..4f9047b84d0 100644 --- a/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/TestDataFormatterStdTuple.py +++ b/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/TestDataFormatterStdTuple.py @@ -40,7 +40,7 @@ def test_with_run_command(self): self.assertEqual('"foobar"', frame.GetValueForVariablePath("ts[0]").GetSummary()) self.assertFalse(frame.GetValueForVariablePath("ts[1]").IsValid()) - + self.assertEqual(1, frame.GetValueForVariablePath("tt[0]").GetValueAsUnsigned()) self.assertEqual('"baz"', frame.GetValueForVariablePath("tt[1]").GetSummary()) self.assertEqual(2, frame.GetValueForVariablePath("tt[2]").GetValueAsUnsigned()) diff --git a/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py b/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py index 611869932b6..8126a7ec750 100644 --- a/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py +++ b/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py @@ -96,7 +96,7 @@ def cleanup(): if not skip_exec: self.assertTrue(process.GetState() == lldb.eStateStopped, "Process should be stopped at __dyld_start") - + threads = lldbutil.get_stopped_threads( process, lldb.eStopReasonExec) self.assertTrue( diff --git a/packages/Python/lldbsuite/test/functionalities/frame-language/TestGuessLanguage.py b/packages/Python/lldbsuite/test/functionalities/frame-language/TestGuessLanguage.py index 59af2de836f..959b621521e 100644 --- a/packages/Python/lldbsuite/test/functionalities/frame-language/TestGuessLanguage.py +++ b/packages/Python/lldbsuite/test/functionalities/frame-language/TestGuessLanguage.py @@ -18,7 +18,7 @@ class TestFrameGuessLanguage(TestBase): mydir = TestBase.compute_mydir(__file__) - # If your test case doesn't stress debug info, the + # If your test case doesn't stress debug info, the # set this to true. That way it won't be run once for # each debug info format. NO_DEBUG_INFO_TESTCASE = True @@ -84,6 +84,6 @@ def do_test(self): self.check_language(thread, 0, c_frame_language) self.check_language(thread, 1, lldb.eLanguageTypeC_plus_plus) self.check_language(thread, 2, lldb.eLanguageTypeC_plus_plus) - - + + diff --git a/packages/Python/lldbsuite/test/functionalities/frame_var/TestFrameVar.py b/packages/Python/lldbsuite/test/functionalities/frame_var/TestFrameVar.py index 960891b9eef..b4e1b9c0763 100644 --- a/packages/Python/lldbsuite/test/functionalities/frame_var/TestFrameVar.py +++ b/packages/Python/lldbsuite/test/functionalities/frame_var/TestFrameVar.py @@ -17,7 +17,7 @@ class TestFrameVar(TestBase): mydir = TestBase.compute_mydir(__file__) - # If your test case doesn't stress debug info, the + # If your test case doesn't stress debug info, the # set this to true. That way it won't be run once for # each debug info format. NO_DEBUG_INFO_TESTCASE = True @@ -67,7 +67,7 @@ def do_test(self): frame = threads[0].GetFrameAtIndex(0) command_result = lldb.SBCommandReturnObject() interp = self.dbg.GetCommandInterpreter() - + # Just get args: result = interp.HandleCommand("frame var -l", command_result) self.assertEqual(result, lldb.eReturnStatusSuccessFinishResult, "frame var -a didn't succeed") @@ -85,7 +85,7 @@ def do_test(self): self.assertTrue("argv" not in output, "Locals found argv") self.assertTrue("test_var" in output, "Locals didn't find test_var") self.assertTrue("g_var" not in output, "Locals found a global") - + # Get the file statics: result = interp.HandleCommand("frame var -l -a -g", command_result) self.assertEqual(result, lldb.eReturnStatusSuccessFinishResult, "frame var -a didn't succeed") @@ -94,6 +94,6 @@ def do_test(self): self.assertTrue("argv" not in output, "Globals found argv") self.assertTrue("test_var" not in output, "Globals found test_var") self.assertTrue("g_var" in output, "Globals didn't find g_var") - - + + diff --git a/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/TestTargetXMLArch.py b/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/TestTargetXMLArch.py index ef9ce770096..184867e480b 100644 --- a/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/TestTargetXMLArch.py +++ b/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/TestTargetXMLArch.py @@ -98,12 +98,12 @@ def haltReason(self): return "T05thread:00000001;06:9038d60f00700000;07:98b4062680ffffff;10:c0d7bf1b80ffffff;" def readRegister(self, register): - regs = {0x0: "00b0060000610000", - 0xa: "68fe471c80ffffff", - 0xc: "60574a1c80ffffff", - 0xd: "18f3042680ffffff", - 0xe: "be8a4d7142000000", - 0xf: "50df471c80ffffff", + regs = {0x0: "00b0060000610000", + 0xa: "68fe471c80ffffff", + 0xc: "60574a1c80ffffff", + 0xd: "18f3042680ffffff", + 0xe: "be8a4d7142000000", + 0xf: "50df471c80ffffff", 0x10: "c0d7bf1b80ffffff" } if register in regs: return regs[register] diff --git a/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/gdbclientutils.py b/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/gdbclientutils.py index ebafd405e23..d8d759a5dd5 100644 --- a/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/gdbclientutils.py +++ b/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/gdbclientutils.py @@ -467,7 +467,7 @@ def assertPacketLogContains(self, packets): i = 0 j = 0 log = self.server.responder.packetLog - + while i < len(packets) and j < len(log): if log[j] == packets[i]: i += 1 diff --git a/packages/Python/lldbsuite/test/functionalities/history/TestHistoryRecall.py b/packages/Python/lldbsuite/test/functionalities/history/TestHistoryRecall.py index 90bd64901ee..7956120bad3 100644 --- a/packages/Python/lldbsuite/test/functionalities/history/TestHistoryRecall.py +++ b/packages/Python/lldbsuite/test/functionalities/history/TestHistoryRecall.py @@ -17,7 +17,7 @@ class TestHistoryRecall(TestBase): mydir = TestBase.compute_mydir(__file__) - # If your test case doesn't stress debug info, the + # If your test case doesn't stress debug info, the # set this to true. That way it won't be run once for # each debug info format. NO_DEBUG_INFO_TESTCASE = True @@ -35,7 +35,7 @@ def sample_test(self): result = lldb.SBCommandReturnObject() interp.HandleCommand("command history", result, True) interp.HandleCommand("platform list", result, True) - + interp.HandleCommand("!0", result, False) self.assertTrue(result.Succeeded(), "!0 command did not work: %s"%(result.GetError())) self.assertTrue("command history" in result.GetOutput(), "!0 didn't rerun command history") diff --git a/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py b/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py index 6302112d2fe..ab5791c614a 100644 --- a/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py +++ b/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py @@ -20,7 +20,7 @@ class LoadUnloadTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) NO_DEBUG_INFO_TESTCASE = True - + def setUp(self): # Call super's setUp(). TestBase.setUp(self) @@ -210,7 +210,7 @@ def test_dyld_library_path(self): if not self.platformIsDarwin(): env_cmd_string += ":" + wd self.runCmd(env_cmd_string) - + # This time, the hidden library should be picked up. self.expect("run", substrs=["return", "12345"]) diff --git a/packages/Python/lldbsuite/test/functionalities/load_using_paths/TestLoadUsingPaths.py b/packages/Python/lldbsuite/test/functionalities/load_using_paths/TestLoadUsingPaths.py index 2050586adfa..a4d0a0b958d 100644 --- a/packages/Python/lldbsuite/test/functionalities/load_using_paths/TestLoadUsingPaths.py +++ b/packages/Python/lldbsuite/test/functionalities/load_using_paths/TestLoadUsingPaths.py @@ -20,7 +20,7 @@ class LoadUsingPathsTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) NO_DEBUG_INFO_TESTCASE = True - + def setUp(self): # Call super's setUp(). TestBase.setUp(self) @@ -52,8 +52,8 @@ def test_load_using_paths(self): # The directory with the dynamic library we did not link to. path_dir = os.path.join(self.getBuildDir(), "hidden") - (target, process, thread, - _) = lldbutil.run_to_source_breakpoint(self, + (target, process, thread, + _) = lldbutil.run_to_source_breakpoint(self, "Break here to do the load using paths", lldb.SBFileSpec("main.cpp")) error = lldb.SBError() @@ -63,18 +63,18 @@ def test_load_using_paths(self): paths.AppendString(os.path.join(self.wd, "no_such_dir")) out_spec = lldb.SBFileSpec() - + # First try with no correct directories on the path, and make sure that doesn't blow up: token = process.LoadImageUsingPaths(lib_spec, paths, out_spec, error) self.assertEqual(token, lldb.LLDB_INVALID_IMAGE_TOKEN, "Only looked on the provided path.") - + # Now add the correct dir to the paths list and try again: paths.AppendString(self.hidden_dir) token = process.LoadImageUsingPaths(lib_spec, paths, out_spec, error) self.assertNotEqual(token, lldb.LLDB_INVALID_IMAGE_TOKEN, "Got a valid token") self.assertEqual(out_spec, lldb.SBFileSpec(self.hidden_lib), "Found the expected library") - + # Make sure this really is in the image list: loaded_module = target.FindModule(out_spec) @@ -89,11 +89,11 @@ def test_load_using_paths(self): # Make sure the token works to unload it: process.UnloadImage(token) - # Make sure this really is no longer in the image list: + # Make sure this really is no longer in the image list: loaded_module = target.FindModule(out_spec) self.assertFalse(loaded_module.IsValid(), "The unloaded module is no longer in the image list.") - + # Make sure a relative path also works: paths.Clear() paths.AppendString(os.path.join(self.wd, "no_such_dir")) @@ -107,7 +107,7 @@ def test_load_using_paths(self): self.assertEqual(out_spec, lldb.SBFileSpec(self.hidden_lib), "Found the expected library with relative path") process.UnloadImage(token) - + # Make sure the presence of an empty path doesn't mess anything up: paths.Clear() paths.AppendString("") @@ -122,7 +122,7 @@ def test_load_using_paths(self): self.assertEqual(out_spec, lldb.SBFileSpec(self.hidden_lib), "Found the expected library with included empty path") process.UnloadImage(token) - + # Finally, passing in an absolute path should work like the basename: @@ -140,4 +140,4 @@ def test_load_using_paths(self): self.assertNotEqual(token, lldb.LLDB_INVALID_IMAGE_TOKEN, "Got a valid token") self.assertEqual(out_spec, lldb.SBFileSpec(self.hidden_lib), "Found the expected library") - + diff --git a/packages/Python/lldbsuite/test/functionalities/pre_run_dylibs/TestPreRunDylibs.py b/packages/Python/lldbsuite/test/functionalities/pre_run_dylibs/TestPreRunDylibs.py index befb4218611..65084211cd6 100644 --- a/packages/Python/lldbsuite/test/functionalities/pre_run_dylibs/TestPreRunDylibs.py +++ b/packages/Python/lldbsuite/test/functionalities/pre_run_dylibs/TestPreRunDylibs.py @@ -35,4 +35,4 @@ def test(self): self.assertTrue(found_it, "Couldn't find unlikely_to_occur_name in loaded libraries.") - + diff --git a/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestZMMRegister.py b/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestZMMRegister.py index 823e40155ff..92c67c88f02 100644 --- a/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestZMMRegister.py +++ b/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestZMMRegister.py @@ -81,7 +81,7 @@ def test(self): self.expect( "register read ymm" + str(i), substrs=[pattern]) - + self.expect("continue", PROCESS_STOPPED, substrs=['stopped']) # Check stop reason; Should be either signal SIGTRAP or EXC_BREAKPOINT diff --git a/packages/Python/lldbsuite/test/functionalities/return-value/TestReturnValue.py b/packages/Python/lldbsuite/test/functionalities/return-value/TestReturnValue.py index b7d0d8170b3..929bd4a7351 100644 --- a/packages/Python/lldbsuite/test/functionalities/return-value/TestReturnValue.py +++ b/packages/Python/lldbsuite/test/functionalities/return-value/TestReturnValue.py @@ -68,7 +68,7 @@ def test_with_python(self): # Run again and we will stop in inner_sint the second time outer_sint is called. # Then test stepping out two frames at once: - + thread_list = lldbutil.continue_to_breakpoint(self.process, inner_sint_bkpt) self.assertTrue(len(thread_list) == 1) thread = thread_list[0] diff --git a/packages/Python/lldbsuite/test/functionalities/thread/create_during_step/TestCreateDuringStep.py b/packages/Python/lldbsuite/test/functionalities/thread/create_during_step/TestCreateDuringStep.py index 3998db6d325..9e30ba3e134 100644 --- a/packages/Python/lldbsuite/test/functionalities/thread/create_during_step/TestCreateDuringStep.py +++ b/packages/Python/lldbsuite/test/functionalities/thread/create_during_step/TestCreateDuringStep.py @@ -90,7 +90,7 @@ def create_during_step_base(self, step_cmd, step_stop_reason): target = self.dbg.GetSelectedTarget() # This should create a breakpoint in the stepping thread. - self.bkpt = target.BreakpointCreateByLocation("main.cpp", self.breakpoint) + self.bkpt = target.BreakpointCreateByLocation("main.cpp", self.breakpoint) # Run the program. self.runCmd("run", RUN_SUCCEEDED) diff --git a/packages/Python/lldbsuite/test/functionalities/thread/num_threads/TestNumThreads.py b/packages/Python/lldbsuite/test/functionalities/thread/num_threads/TestNumThreads.py index 4c4e645635c..724b9d8be90 100644 --- a/packages/Python/lldbsuite/test/functionalities/thread/num_threads/TestNumThreads.py +++ b/packages/Python/lldbsuite/test/functionalities/thread/num_threads/TestNumThreads.py @@ -92,7 +92,7 @@ def test_unique_stacks(self): self.assertTrue( num_threads >= 10, 'Number of expected threads and actual threads do not match.') - + # Attempt to walk each of the thread's executing the thread3 function to # the same breakpoint. def is_thread3(thread): diff --git a/packages/Python/lldbsuite/test/functionalities/thread/step_until/TestStepUntil.py b/packages/Python/lldbsuite/test/functionalities/thread/step_until/TestStepUntil.py index 3bace578063..b0e7add3729 100644 --- a/packages/Python/lldbsuite/test/functionalities/thread/step_until/TestStepUntil.py +++ b/packages/Python/lldbsuite/test/functionalities/thread/step_until/TestStepUntil.py @@ -61,7 +61,7 @@ def do_until (self, args, until_lines, expected_linenum): cmd_line = "thread until" for line_num in until_lines: cmd_line += " %d"%(line_num) - + cmd_interp.HandleCommand(cmd_line, ret_obj) self.assertTrue(ret_obj.Succeeded(), "'%s' failed: %s."%(cmd_line, ret_obj.GetError())) diff --git a/packages/Python/lldbsuite/test/functionalities/watchpoint/multi_watchpoint_slots/TestWatchpointMultipleSlots.py b/packages/Python/lldbsuite/test/functionalities/watchpoint/multi_watchpoint_slots/TestWatchpointMultipleSlots.py index b51cab38aa8..22dc19ed322 100644 --- a/packages/Python/lldbsuite/test/functionalities/watchpoint/multi_watchpoint_slots/TestWatchpointMultipleSlots.py +++ b/packages/Python/lldbsuite/test/functionalities/watchpoint/multi_watchpoint_slots/TestWatchpointMultipleSlots.py @@ -85,7 +85,7 @@ def test_multiple_watchpoints_on_same_word(self): # Set a watchpoint at byteArray[3] self.expect("watchpoint set variable byteArray[3]", WATCHPOINT_CREATED, substrs=['Watchpoint created','size = 1']) - + # Resume inferior. self.runCmd("process continue") @@ -98,6 +98,6 @@ def test_multiple_watchpoints_on_same_word(self): else: self.expect("thread list -v", STOPPED_DUE_TO_WATCHPOINT, substrs=['stopped', 'stop reason = watchpoint 3']) - + # Resume inferior. self.runCmd("process continue") diff --git a/packages/Python/lldbsuite/test/functionalities/watchpoint/watchpoint_disable/TestWatchpointDisable.py b/packages/Python/lldbsuite/test/functionalities/watchpoint/watchpoint_disable/TestWatchpointDisable.py index 587dcabb2ba..ea4f06218a0 100644 --- a/packages/Python/lldbsuite/test/functionalities/watchpoint/watchpoint_disable/TestWatchpointDisable.py +++ b/packages/Python/lldbsuite/test/functionalities/watchpoint/watchpoint_disable/TestWatchpointDisable.py @@ -65,9 +65,9 @@ def do_test(self, test_enable): wp.SetEnabled(False) self.assertTrue(not wp.IsEnabled(), "The watchpoint thinks it is still enabled") - + process.Continue() - + stop_reason = thread.GetStopReason() self.assertEqual(stop_reason, lldb.eStopReasonBreakpoint, "We didn't stop at our breakpoint.") @@ -78,4 +78,4 @@ def do_test(self, test_enable): process.Continue() stop_reason = thread.GetStopReason() self.assertEqual(stop_reason, lldb.eStopReasonWatchpoint, "We didn't stop at our watchpoint") - + diff --git a/packages/Python/lldbsuite/test/lang/c/find_struct_type/TestFindStructTypes.py b/packages/Python/lldbsuite/test/lang/c/find_struct_type/TestFindStructTypes.py index 75aef291cc4..6827fb4af0e 100644 --- a/packages/Python/lldbsuite/test/lang/c/find_struct_type/TestFindStructTypes.py +++ b/packages/Python/lldbsuite/test/lang/c/find_struct_type/TestFindStructTypes.py @@ -17,7 +17,7 @@ class TestFindTypesOnStructType(TestBase): mydir = TestBase.compute_mydir(__file__) - # If your test case doesn't stress debug info, the + # If your test case doesn't stress debug info, the # set this to true. That way it won't be run once for # each debug info format. NO_DEBUG_INFO_TESTCASE = True diff --git a/packages/Python/lldbsuite/test/lang/cpp/dynamic-value-same-basename/TestDynamicValueSameBase.py b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value-same-basename/TestDynamicValueSameBase.py index 358b3b2d93a..c0afb3cf491 100644 --- a/packages/Python/lldbsuite/test/lang/cpp/dynamic-value-same-basename/TestDynamicValueSameBase.py +++ b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value-same-basename/TestDynamicValueSameBase.py @@ -18,7 +18,7 @@ class DynamicValueSameBaseTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) - # If your test case doesn't stress debug info, the + # If your test case doesn't stress debug info, the # set this to true. That way it won't be run once for # each debug info format. NO_DEBUG_INFO_TESTCASE = True @@ -35,7 +35,7 @@ def setUp(self): def sample_test(self): (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, - "Break here to get started", self.main_source_file) + "Break here to get started", self.main_source_file) # Set breakpoints in the two class methods and run to them: namesp_bkpt = target.BreakpointCreateBySourceRegex("namesp function did something.", self.main_source_file) @@ -62,5 +62,5 @@ def sample_test(self): virtual_type = virtual_this.GetType().GetUnqualifiedType() self.assertEqual(virtual_type.GetName(), "Virtual *", "Didn't get the right dynamic type") - + diff --git a/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py index 92b58ce11d7..7ce2e343b88 100644 --- a/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py +++ b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py @@ -49,7 +49,7 @@ def get_test_frame(self, exe): src_file = "main.cpp" src_file_spec = lldb.SBFileSpec(src_file) - (target, process, thread, main_breakpoint) = lldbutil.run_to_source_breakpoint(self, + (target, process, thread, main_breakpoint) = lldbutil.run_to_source_breakpoint(self, "break here", src_file_spec, exe_name = exe) # Get frame for current thread return thread.GetSelectedFrame() diff --git a/packages/Python/lldbsuite/test/lang/cpp/llvm-style/TestLLVMStyle.py b/packages/Python/lldbsuite/test/lang/cpp/llvm-style/TestLLVMStyle.py index 8e83a3ab1a4..af362f5be5d 100644 --- a/packages/Python/lldbsuite/test/lang/cpp/llvm-style/TestLLVMStyle.py +++ b/packages/Python/lldbsuite/test/lang/cpp/llvm-style/TestLLVMStyle.py @@ -4,4 +4,4 @@ lldbinline.MakeInlineTest( __file__, globals(), [ decorators.expectedFailureAll( - oslist=["windows"], bugnumber="llvm.org/pr24764")]) \ No newline at end of file + oslist=["windows"], bugnumber="llvm.org/pr24764")]) diff --git a/packages/Python/lldbsuite/test/lang/cpp/scope/TestCppScope.py b/packages/Python/lldbsuite/test/lang/cpp/scope/TestCppScope.py index 5cd9e4ed1b4..c7afeb2dbb6 100644 --- a/packages/Python/lldbsuite/test/lang/cpp/scope/TestCppScope.py +++ b/packages/Python/lldbsuite/test/lang/cpp/scope/TestCppScope.py @@ -18,7 +18,7 @@ def test_all_but_c(self): @expectedFailureAll(oslist=["windows"]) def test_c(self): self.do_test(True) - + def do_test(self, test_c): self.build() diff --git a/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/TestTrivialABI.py b/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/TestTrivialABI.py index 2aae7dc89d3..11263abeea3 100644 --- a/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/TestTrivialABI.py +++ b/packages/Python/lldbsuite/test/lang/cpp/trivial_abi/TestTrivialABI.py @@ -53,14 +53,14 @@ def check_frame(self, thread): options = lldb.SBExpressionOptions() inVal_expr = frame.EvaluateExpression("inVal", options) self.check_value(inVal_expr, 10) - + thread.StepOut() outVal_ret = thread.GetStopReturnValue() self.check_value(outVal_ret, 30) def expr_test(self, trivial): (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, - "Set a breakpoint here", self.main_source_file) + "Set a breakpoint here", self.main_source_file) # Stop in a function that takes a trivial value, and try both frame var & expr to get its value: if trivial: diff --git a/packages/Python/lldbsuite/test/lldbdwarf.py b/packages/Python/lldbsuite/test/lldbdwarf.py index 1b50eb130ab..217f8bc0e2b 100644 --- a/packages/Python/lldbsuite/test/lldbdwarf.py +++ b/packages/Python/lldbsuite/test/lldbdwarf.py @@ -191,7 +191,7 @@ def evaluateDwarfExpression(self, dwarf_opcode, byte_order): break if val == DW_OP_regx: - # Read register number + # Read register number self.assertTrue(len(dwarf_opcode) > (index + 1)) reg_no = int(dwarf_opcode.pop(index + 1), 16) @@ -201,7 +201,7 @@ def evaluateDwarfExpression(self, dwarf_opcode, byte_order): ["read packet: $p{0:x}#00".format(reg_no), {"direction": "send", "regex": r"^\$([0-9a-fA-F]+)#", "capture": {1: "p_response"}}],True) - + Context = self.expect_gdbremote_sequence() self.assertIsNotNone(Context) p_response = Context.get("p_response") @@ -219,7 +219,7 @@ def evaluateDwarfExpression(self, dwarf_opcode, byte_order): elif val == DW_OP_lit1: # Push literal 1 dwarf_data.append(1) - + elif val == DW_OP_lit26: # Push literal 26 dwarf_data.append(26) diff --git a/packages/Python/lldbsuite/test/lldbtest.py b/packages/Python/lldbsuite/test/lldbtest.py index d5dd90a8651..1b6302ae96a 100644 --- a/packages/Python/lldbsuite/test/lldbtest.py +++ b/packages/Python/lldbsuite/test/lldbtest.py @@ -184,9 +184,10 @@ def CMD_MSG(str): return "Command '%s' returns successfully" % str -def COMPLETION_MSG(str_before, str_after): +def COMPLETION_MSG(str_before, str_after, completions): '''A generic message generator for the completion mechanism.''' - return "'%s' successfully completes to '%s'" % (str_before, str_after) + return ("'%s' successfully completes to '%s', but completions were:\n%s" + % (str_before, str_after, "\n".join(completions))) def EXP_MSG(str, actual, exe): @@ -702,8 +703,8 @@ def getBuildDir(self): """Return the full path to the current test.""" return os.path.join(os.environ["LLDB_BUILD"], self.mydir, self.getBuildDirBasename()) - - + + def makeBuildDir(self): """Create the test-specific working directory, deleting any previous contents.""" @@ -712,11 +713,11 @@ def makeBuildDir(self): if os.path.isdir(bdir): shutil.rmtree(bdir) lldbutil.mkdir_p(bdir) - + def getBuildArtifact(self, name="a.out"): """Return absolute path to an artifact in the test's build directory.""" return os.path.join(self.getBuildDir(), name) - + def getSourcePath(self, name): """Return absolute path to a file in the test's source directory.""" return os.path.join(self.getSourceDir(), name) @@ -1844,7 +1845,7 @@ def generateSource(self, source): temp = os.path.join(self.getSourceDir(), template) with open(temp, 'r') as f: content = f.read() - + public_api_dir = os.path.join( os.environ["LLDB_SRC"], "include", "lldb", "API") diff --git a/packages/Python/lldbsuite/test/lldbutil.py b/packages/Python/lldbsuite/test/lldbutil.py index 90ac799f489..dc84383333e 100644 --- a/packages/Python/lldbsuite/test/lldbutil.py +++ b/packages/Python/lldbsuite/test/lldbutil.py @@ -740,7 +740,7 @@ def get_crashed_threads(test, process): def run_to_breakpoint_make_target(test, exe_name, in_cwd): if in_cwd: exe = test.getBuildArtifact(exe_name) - + # Create the target target = test.dbg.CreateTarget(exe) test.assertTrue(target, "Target: %s is not valid."%(exe_name)) @@ -756,8 +756,8 @@ def run_to_breakpoint_do_run(test, target, bkpt, launch_info): error = lldb.SBError() process = target.Launch(launch_info, error) - test.assertTrue(process, - "Could not create a valid process for %s: %s"%(target.GetExecutable().GetFilename(), + test.assertTrue(process, + "Could not create a valid process for %s: %s"%(target.GetExecutable().GetFilename(), error.GetCString())) # Frame #0 should be at our breakpoint. @@ -768,7 +768,7 @@ def run_to_breakpoint_do_run(test, target, bkpt, launch_info): thread = threads[0] return (target, process, thread, bkpt) -def run_to_name_breakpoint (test, bkpt_name, launch_info = None, +def run_to_name_breakpoint (test, bkpt_name, launch_info = None, exe_name = "a.out", bkpt_module = None, in_cwd = True): @@ -818,7 +818,7 @@ def run_to_source_breakpoint(test, bkpt_pattern, source_spec, # Set the breakpoints breakpoint = target.BreakpointCreateBySourceRegex( bkpt_pattern, source_spec, bkpt_module) - test.assertTrue(breakpoint.GetNumLocations() > 0, + test.assertTrue(breakpoint.GetNumLocations() > 0, 'No locations found for source breakpoint: "%s", file: "%s", dir: "%s"'%(bkpt_pattern, source_spec.GetFilename(), source_spec.GetDirectory())) return run_to_breakpoint_do_run(test, target, breakpoint, launch_info) diff --git a/packages/Python/lldbsuite/test/macosx/find-app-in-bundle/TestFindAppInBundle.py b/packages/Python/lldbsuite/test/macosx/find-app-in-bundle/TestFindAppInBundle.py index af6beeefd39..c380d537996 100644 --- a/packages/Python/lldbsuite/test/macosx/find-app-in-bundle/TestFindAppInBundle.py +++ b/packages/Python/lldbsuite/test/macosx/find-app-in-bundle/TestFindAppInBundle.py @@ -55,12 +55,12 @@ def find_app_in_bundle_test(self): error = lldb.SBError() process = target.Launch(launch_info, error) - + self.assertTrue(process.IsValid(), "Could not create a valid process for TestApp: %s"%(error.GetCString())) - + # Frame #0 should be at our breakpoint. threads = lldbutil.get_threads_stopped_at_breakpoint(process, bkpt) - + self.assertTrue(len(threads) == 1, "Expected 1 thread to stop at breakpoint, %d did."%(len(threads))) diff --git a/packages/Python/lldbsuite/test/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py b/packages/Python/lldbsuite/test/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py index 9a046cf0b29..ad90d85ab3f 100644 --- a/packages/Python/lldbsuite/test/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py +++ b/packages/Python/lldbsuite/test/macosx/find-dsym/bundle-with-dot-in-filename/TestBundleWithDotInFilename.py @@ -47,7 +47,7 @@ def test_attach_and_check_dsyms(self): sleep(5) # Since the library that was dlopen()'ed is now removed, lldb will need to find the - # binary & dSYM via target.exec-search-paths + # binary & dSYM via target.exec-search-paths settings_str = "settings set target.exec-search-paths " + self.get_process_working_directory() + "/hide.app" self.runCmd(settings_str) diff --git a/packages/Python/lldbsuite/test/macosx/find-dsym/deep-bundle/TestDeepBundle.py b/packages/Python/lldbsuite/test/macosx/find-dsym/deep-bundle/TestDeepBundle.py index d6123e39c3f..2ed7fdfd3fe 100644 --- a/packages/Python/lldbsuite/test/macosx/find-dsym/deep-bundle/TestDeepBundle.py +++ b/packages/Python/lldbsuite/test/macosx/find-dsym/deep-bundle/TestDeepBundle.py @@ -46,7 +46,7 @@ def test_attach_and_check_dsyms(self): sleep(5) # Since the library that was dlopen()'ed is now removed, lldb will need to find the - # binary & dSYM via target.exec-search-paths + # binary & dSYM via target.exec-search-paths settings_str = "settings set target.exec-search-paths " + self.get_process_working_directory() + "/hide.app" self.runCmd(settings_str) self.runCmd("process attach -p " + str(popen.pid)) @@ -67,7 +67,7 @@ def test_attach_and_check_dsyms(self): dsym_name = mod.GetSymbolFileSpec().GetFilename() self.assertTrue (dsym_name == 'MyFramework', "Check that we found the dSYM for the bundle that was loaded") i=i+1 - + self.assertTrue(found_module, "Check that we found the framework loaded in lldb's image list") if __name__ == '__main__': diff --git a/packages/Python/lldbsuite/test/macosx/thread-names/TestInterruptThreadNames.py b/packages/Python/lldbsuite/test/macosx/thread-names/TestInterruptThreadNames.py index 925dc92951c..515ab3f2bbd 100644 --- a/packages/Python/lldbsuite/test/macosx/thread-names/TestInterruptThreadNames.py +++ b/packages/Python/lldbsuite/test/macosx/thread-names/TestInterruptThreadNames.py @@ -1,4 +1,4 @@ -"""Test that we get thread names when interrupting a process.""" +"""Test that we get thread names when interrupting a process.""" from __future__ import print_function @@ -63,7 +63,7 @@ def test_with_python_api(self): process.Kill() - # The process will set a global variable 'threads_up_and_running' to 1 when + # The process will set a global variable 'threads_up_and_running' to 1 when # it has has completed its setup. Sleep for one second, pause the program, # check to see if the global has that value, and continue if it does not. def wait_until_program_setup_complete(self, process, listener): @@ -107,7 +107,7 @@ def wait_for_running(self, process, listener): return False # Listen to the process events until we get an event saying the process is - # stopped. Retry up to five times in case we get other events that we are + # stopped. Retry up to five times in case we get other events that we are # not looking for. def wait_for_stop(self, process, listener): retry_count = 5 diff --git a/packages/Python/lldbsuite/test/python_api/name_lookup/TestNameLookup.py b/packages/Python/lldbsuite/test/python_api/name_lookup/TestNameLookup.py index 6511ff865bd..ba68ca926d8 100644 --- a/packages/Python/lldbsuite/test/python_api/name_lookup/TestNameLookup.py +++ b/packages/Python/lldbsuite/test/python_api/name_lookup/TestNameLookup.py @@ -23,7 +23,7 @@ class TestNameLookup(TestBase): @expectedFailureAll(oslist=["windows"], bugnumber='llvm.org/pr21765') def test_target(self): """Exercise SBTarget.FindFunctions() with various name masks. - + A previous regression caused mangled names to not be able to be looked up. This test verifies that using a mangled name with eFunctionNameTypeFull works and that using a function basename with eFunctionNameTypeFull works for all @@ -36,7 +36,7 @@ def test_target(self): self.assertTrue(target, VALID_TARGET) exe_module = target.FindModule(target.GetExecutable()) - + c_name_to_symbol = {} cpp_name_to_symbol = {} mangled_to_symbol = {} @@ -54,7 +54,7 @@ def test_target(self): c_name_to_symbol[name] = symbol # Make sure each mangled name turns up exactly one match when looking up - # functions by full name and using the mangled name as the name in the + # functions by full name and using the mangled name as the name in the # lookup self.assertGreaterEqual(len(mangled_to_symbol), 6) for mangled in mangled_to_symbol.keys(): @@ -63,5 +63,5 @@ def test_target(self): for symbol_context in symbol_contexts: self.assertTrue(symbol_context.GetFunction().IsValid()) self.assertTrue(symbol_context.GetSymbol().IsValid()) - - + + diff --git a/packages/Python/lldbsuite/test/python_api/sbdata/TestSBData.py b/packages/Python/lldbsuite/test/python_api/sbdata/TestSBData.py index a1a400a076b..6bdf9a2036e 100644 --- a/packages/Python/lldbsuite/test/python_api/sbdata/TestSBData.py +++ b/packages/Python/lldbsuite/test/python_api/sbdata/TestSBData.py @@ -23,7 +23,7 @@ def setUp(self): @add_test_categories(['pyapi']) def test_byte_order_and_address_byte_size(self): - """Test the SBData::SetData() to ensure the byte order and address + """Test the SBData::SetData() to ensure the byte order and address byte size are obeyed""" addr_data = b'\x11\x22\x33\x44\x55\x66\x77\x88' error = lldb.SBError() diff --git a/packages/Python/lldbsuite/test/sample_test/TestSampleTest.py b/packages/Python/lldbsuite/test/sample_test/TestSampleTest.py index 9a1748bbabb..97674f5336a 100644 --- a/packages/Python/lldbsuite/test/sample_test/TestSampleTest.py +++ b/packages/Python/lldbsuite/test/sample_test/TestSampleTest.py @@ -17,7 +17,7 @@ class RenameThisSampleTestTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) - # If your test case doesn't stress debug info, the + # If your test case doesn't stress debug info, the # set this to true. That way it won't be run once for # each debug info format. NO_DEBUG_INFO_TESTCASE = True @@ -40,7 +40,7 @@ def sample_test(self): # It optionally takes an SBLaunchOption argument if you want to pass # arguments or environment variables. (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, - "Set a breakpoint here", self.main_source_file) + "Set a breakpoint here", self.main_source_file) frame = thread.GetFrameAtIndex(0) test_var = frame.FindVariable("test_var") diff --git a/packages/Python/lldbsuite/test/settings/TestSettings.py b/packages/Python/lldbsuite/test/settings/TestSettings.py index 6b8ac7c3d5d..d6fa5a93b72 100644 --- a/packages/Python/lldbsuite/test/settings/TestSettings.py +++ b/packages/Python/lldbsuite/test/settings/TestSettings.py @@ -528,7 +528,7 @@ def test_all_settings_exist(self): # settings under an ".experimental" domain should have two properties: # 1. If the name does not exist with "experimental" in the name path, # the name lookup should try to find it without "experimental". So - # a previously-experimental setting that has been promoted to a + # a previously-experimental setting that has been promoted to a # "real" setting will still be set by the original name. # 2. Changing a setting with .experimental., name, where the setting # does not exist either with ".experimental." or without, should diff --git a/packages/Python/lldbsuite/test/tools/lldb-mi/startup_options/TestMiStartupOptions.py b/packages/Python/lldbsuite/test/tools/lldb-mi/startup_options/TestMiStartupOptions.py index 7c225ab87a3..467952db7eb 100644 --- a/packages/Python/lldbsuite/test/tools/lldb-mi/startup_options/TestMiStartupOptions.py +++ b/packages/Python/lldbsuite/test/tools/lldb-mi/startup_options/TestMiStartupOptions.py @@ -139,7 +139,7 @@ def copyScript(self, sourceFile): with open(destFile, 'w+') as dest: dest.write(src.read().replace("a.out", self.myexe)) return destFile - + @skipIfRemote # We do not currently support remote debugging via the MI. @skipIfWindows # llvm.org/pr24452: Get lldb-mi tests working on Windows @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races diff --git a/packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemote_qThreadStopInfo.py b/packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemote_qThreadStopInfo.py index 647e57832b0..a25484e73ba 100644 --- a/packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemote_qThreadStopInfo.py +++ b/packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemote_qThreadStopInfo.py @@ -16,7 +16,7 @@ class TestGdbRemote_qThreadStopInfo(gdbremote_testcase.GdbRemoteTestCaseBase): THREAD_COUNT = 5 @skipIfDarwinEmbedded # lldb-server tests not updated to work on ios etc yet - @skipIfDarwinEmbedded # + @skipIfDarwinEmbedded # def gather_stop_replies_via_qThreadStopInfo(self, thread_count): # Set up the inferior args. inferior_args = [] diff --git a/packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py b/packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py index 82e76ca125b..f5169e7e202 100644 --- a/packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py +++ b/packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py @@ -1162,7 +1162,7 @@ def breakpoint_set_and_remove_work(self, want_hardware=False): BREAKPOINT_KIND = 1 # Set default packet type to Z0 (software breakpoint) - z_packet_type = 0 + z_packet_type = 0 # If hardware breakpoint is requested set packet type to Z1 if want_hardware == True: diff --git a/source/Commands/CommandCompletions.cpp b/source/Commands/CommandCompletions.cpp index bdfdbb83219..7b351c50dc6 100644 --- a/source/Commands/CommandCompletions.cpp +++ b/source/Commands/CommandCompletions.cpp @@ -90,7 +90,7 @@ int CommandCompletions::SourceFiles(CommandInterpreter &interpreter, } else { completer.DoCompletion(searcher); } - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } static int DiskFilesOrDirectories(const llvm::Twine &partial_name, @@ -103,7 +103,7 @@ static int DiskFilesOrDirectories(const llvm::Twine &partial_name, partial_name.toVector(CompletionBuffer); if (CompletionBuffer.size() >= PATH_MAX) - return 0; + return matches.GetSize(); namespace fs = llvm::sys::fs; namespace path = llvm::sys::path; @@ -145,7 +145,7 @@ static int DiskFilesOrDirectories(const llvm::Twine &partial_name, // Make sure it ends with a separator. path::append(CompletionBuffer, path::get_separator()); matches.AppendString(CompletionBuffer); - return 1; + return matches.GetSize(); } // We want to keep the form the user typed, so we special case this to @@ -224,13 +224,21 @@ static int DiskFilesOrDirectories(const llvm::Twine &partial_name, return matches.GetSize(); } +static int DiskFilesOrDirectories(CompletionRequest &request, + bool only_directories) { + request.SetWordComplete(false); + StandardTildeExpressionResolver resolver; + StringList matches; + DiskFilesOrDirectories(request.GetCursorArgumentPrefix(), only_directories, + matches, resolver); + request.AddCompletions(matches); + return request.GetNumberOfMatches(); +} + int CommandCompletions::DiskFiles(CommandInterpreter &interpreter, CompletionRequest &request, SearchFilter *searcher) { - request.SetWordComplete(false); - StandardTildeExpressionResolver Resolver; - return DiskFiles(request.GetCursorArgumentPrefix(), request.GetMatches(), - Resolver); + return DiskFilesOrDirectories(request, /*only_dirs*/ false); } int CommandCompletions::DiskFiles(const llvm::Twine &partial_file_name, @@ -242,10 +250,7 @@ int CommandCompletions::DiskFiles(const llvm::Twine &partial_file_name, int CommandCompletions::DiskDirectories(CommandInterpreter &interpreter, CompletionRequest &request, SearchFilter *searcher) { - request.SetWordComplete(false); - StandardTildeExpressionResolver Resolver; - return DiskDirectories(request.GetCursorArgumentPrefix(), - request.GetMatches(), Resolver); + return DiskFilesOrDirectories(request, /*only_dirs*/ true); } int CommandCompletions::DiskDirectories(const llvm::Twine &partial_file_name, @@ -267,7 +272,7 @@ int CommandCompletions::Modules(CommandInterpreter &interpreter, } else { completer.DoCompletion(searcher); } - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } int CommandCompletions::Symbols(CommandInterpreter &interpreter, @@ -283,7 +288,7 @@ int CommandCompletions::Symbols(CommandInterpreter &interpreter, } else { completer.DoCompletion(searcher); } - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } int CommandCompletions::SettingsNames(CommandInterpreter &interpreter, @@ -304,20 +309,23 @@ int CommandCompletions::SettingsNames(CommandInterpreter &interpreter, } size_t exact_matches_idx = SIZE_MAX; - const size_t num_matches = - g_property_names.AutoComplete(request.GetCursorArgumentPrefix(), - request.GetMatches(), exact_matches_idx); + StringList matches; + g_property_names.AutoComplete(request.GetCursorArgumentPrefix(), matches, + exact_matches_idx); request.SetWordComplete(exact_matches_idx != SIZE_MAX); - return num_matches; + request.AddCompletions(matches); + return request.GetNumberOfMatches(); } int CommandCompletions::PlatformPluginNames(CommandInterpreter &interpreter, CompletionRequest &request, SearchFilter *searcher) { - const uint32_t num_matches = PluginManager::AutoCompletePlatformName( - request.GetCursorArgumentPrefix(), request.GetMatches()); + StringList new_matches; + std::size_t num_matches = PluginManager::AutoCompletePlatformName( + request.GetCursorArgumentPrefix(), new_matches); request.SetWordComplete(num_matches == 1); - return num_matches; + request.AddCompletions(new_matches); + return request.GetNumberOfMatches(); } int CommandCompletions::ArchitectureNames(CommandInterpreter &interpreter, @@ -409,10 +417,10 @@ CommandCompletions::SourceFileCompleter::DoCompletion(SearchFilter *filter) { filter->Search(*this); // Now convert the filelist to completions: for (size_t i = 0; i < m_matching_files.GetSize(); i++) { - m_request.GetMatches().AppendString( + m_request.AddCompletion( m_matching_files.GetFileSpecAtIndex(i).GetFilename().GetCString()); } - return m_request.GetMatches().GetSize(); + return m_request.GetNumberOfMatches(); } //---------------------------------------------------------------------- @@ -478,9 +486,9 @@ size_t CommandCompletions::SymbolCompleter::DoCompletion(SearchFilter *filter) { filter->Search(*this); collection::iterator pos = m_match_set.begin(), end = m_match_set.end(); for (pos = m_match_set.begin(); pos != end; pos++) - m_request.GetMatches().AppendString((*pos).GetCString()); + m_request.AddCompletion((*pos).GetCString()); - return m_request.GetMatches().GetSize(); + return m_request.GetNumberOfMatches(); } //---------------------------------------------------------------------- @@ -517,7 +525,7 @@ Searcher::CallbackReturn CommandCompletions::ModuleCompleter::SearchCallback( match = false; if (match) { - m_request.GetMatches().AppendString(cur_file_name); + m_request.AddCompletion(cur_file_name); } } return Searcher::eCallbackReturnContinue; @@ -525,5 +533,5 @@ Searcher::CallbackReturn CommandCompletions::ModuleCompleter::SearchCallback( size_t CommandCompletions::ModuleCompleter::DoCompletion(SearchFilter *filter) { filter->Search(*this); - return m_request.GetMatches().GetSize(); + return m_request.GetNumberOfMatches(); } diff --git a/source/Commands/CommandObjectCommands.cpp b/source/Commands/CommandObjectCommands.cpp index 3012ee4a188..333f72056cb 100644 --- a/source/Commands/CommandObjectCommands.cpp +++ b/source/Commands/CommandObjectCommands.cpp @@ -241,7 +241,7 @@ class CommandObjectCommandsSource : public CommandObjectParsed { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } Options *GetOptions() override { return &m_options; } @@ -1429,7 +1429,7 @@ class CommandObjectCommandsScriptImport : public CommandObjectParsed { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } Options *GetOptions() override { return &m_options; } diff --git a/source/Commands/CommandObjectFrame.cpp b/source/Commands/CommandObjectFrame.cpp index 0183c43f85b..64de14f2edb 100644 --- a/source/Commands/CommandObjectFrame.cpp +++ b/source/Commands/CommandObjectFrame.cpp @@ -470,7 +470,7 @@ class CommandObjectFrameVariable : public CommandObjectParsed { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eVariablePathCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: diff --git a/source/Commands/CommandObjectMultiword.cpp b/source/Commands/CommandObjectMultiword.cpp index ade1a2d01f3..19fcf60e557 100644 --- a/source/Commands/CommandObjectMultiword.cpp +++ b/source/Commands/CommandObjectMultiword.cpp @@ -143,7 +143,7 @@ bool CommandObjectMultiword::Execute(const char *args_string, if (num_subcmd_matches > 0) { error_msg.append(" Possible completions:"); - for (size_t i = 0; i < num_subcmd_matches; i++) { + for (size_t i = 0; i < matches.GetSize(); i++) { error_msg.append("\n\t"); error_msg.append(matches.GetStringAtIndex(i)); } @@ -190,21 +190,22 @@ int CommandObjectMultiword::HandleCompletion(CompletionRequest &request) { // Any of the command matches will provide a complete word, otherwise the // individual completers will override this. request.SetWordComplete(true); - auto &matches = request.GetMatches(); auto arg0 = request.GetParsedLine()[0].ref; if (request.GetCursorIndex() == 0) { - AddNamesMatchingPartialString(m_subcommand_dict, arg0, matches); + StringList new_matches; + AddNamesMatchingPartialString(m_subcommand_dict, arg0, new_matches); + request.AddCompletions(new_matches); - if (matches.GetSize() == 1 && matches.GetStringAtIndex(0) != nullptr && - (arg0 == matches.GetStringAtIndex(0))) { + if (new_matches.GetSize() == 1 && + new_matches.GetStringAtIndex(0) != nullptr && + (arg0 == new_matches.GetStringAtIndex(0))) { StringList temp_matches; CommandObject *cmd_obj = GetSubcommandObject(arg0, &temp_matches); if (cmd_obj != nullptr) { if (request.GetParsedLine().GetArgumentCount() == 1) { request.SetWordComplete(true); } else { - matches.DeleteStringAtIndex(0); request.GetParsedLine().Shift(); request.SetCursorCharPosition(0); request.GetParsedLine().AppendArgument(llvm::StringRef()); @@ -212,14 +213,17 @@ int CommandObjectMultiword::HandleCompletion(CompletionRequest &request) { } } } - return matches.GetSize(); + return new_matches.GetSize(); } else { - CommandObject *sub_command_object = GetSubcommandObject(arg0, &matches); + StringList new_matches; + CommandObject *sub_command_object = GetSubcommandObject(arg0, &new_matches); if (sub_command_object == nullptr) { - return matches.GetSize(); + request.AddCompletions(new_matches); + return request.GetNumberOfMatches(); } else { // Remove the one match that we got from calling GetSubcommandObject. - matches.DeleteStringAtIndex(0); + new_matches.DeleteStringAtIndex(0); + request.AddCompletions(new_matches); request.GetParsedLine().Shift(); request.SetCursorIndex(request.GetCursorIndex() - 1); return sub_command_object->HandleCompletion(request); @@ -366,7 +370,6 @@ int CommandObjectProxy::HandleCompletion(CompletionRequest &request) { CommandObject *proxy_command = GetProxyCommandObject(); if (proxy_command) return proxy_command->HandleCompletion(request); - request.GetMatches().Clear(); return 0; } @@ -375,7 +378,6 @@ int CommandObjectProxy::HandleArgumentCompletion( CommandObject *proxy_command = GetProxyCommandObject(); if (proxy_command) return proxy_command->HandleArgumentCompletion(request, opt_element_vector); - request.GetMatches().Clear(); return 0; } diff --git a/source/Commands/CommandObjectPlatform.cpp b/source/Commands/CommandObjectPlatform.cpp index f822a8b54cb..22a9a169c7c 100644 --- a/source/Commands/CommandObjectPlatform.cpp +++ b/source/Commands/CommandObjectPlatform.cpp @@ -181,7 +181,7 @@ class CommandObjectPlatformSelect : public CommandObjectParsed { int HandleCompletion(CompletionRequest &request) override { CommandCompletions::PlatformPluginNames(GetCommandInterpreter(), request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } Options *GetOptions() override { return &m_option_group; } @@ -1583,9 +1583,9 @@ class CommandObjectPlatformProcessAttach : public CommandObjectParsed { const uint32_t num_matches = process_infos.GetSize(); if (num_matches > 0) { for (uint32_t i = 0; i < num_matches; ++i) { - request.GetMatches().AppendString( + request.AddCompletion(llvm::StringRef( process_infos.GetProcessNameAtIndex(i), - process_infos.GetProcessNameLengthAtIndex(i)); + process_infos.GetProcessNameLengthAtIndex(i))); } } } diff --git a/source/Commands/CommandObjectPlugin.cpp b/source/Commands/CommandObjectPlugin.cpp index 1f379a2660e..13ef6b227c5 100644 --- a/source/Commands/CommandObjectPlugin.cpp +++ b/source/Commands/CommandObjectPlugin.cpp @@ -48,7 +48,7 @@ class CommandObjectPluginLoad : public CommandObjectParsed { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: diff --git a/source/Commands/CommandObjectProcess.cpp b/source/Commands/CommandObjectProcess.cpp index 3ac27918df4..eb5a19aa4d3 100644 --- a/source/Commands/CommandObjectProcess.cpp +++ b/source/Commands/CommandObjectProcess.cpp @@ -141,7 +141,7 @@ class CommandObjectProcessLaunch : public CommandObjectProcessLaunchOrAttach { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } Options *GetOptions() override { return &m_options; } @@ -410,9 +410,9 @@ class CommandObjectProcessAttach : public CommandObjectProcessLaunchOrAttach { const size_t num_matches = process_infos.GetSize(); if (num_matches > 0) { for (size_t i = 0; i < num_matches; ++i) { - request.GetMatches().AppendString( + request.AddCompletion(llvm::StringRef( process_infos.GetProcessNameAtIndex(i), - process_infos.GetProcessNameLengthAtIndex(i)); + process_infos.GetProcessNameLengthAtIndex(i))); } } } diff --git a/source/Commands/CommandObjectSettings.cpp b/source/Commands/CommandObjectSettings.cpp index f259f2fe200..3db1e35cd70 100644 --- a/source/Commands/CommandObjectSettings.cpp +++ b/source/Commands/CommandObjectSettings.cpp @@ -172,7 +172,7 @@ insert-before or insert-after."); } } } - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: @@ -272,7 +272,7 @@ class CommandObjectSettingsShow : public CommandObjectParsed { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: @@ -338,7 +338,7 @@ class CommandObjectSettingsList : public CommandObjectParsed { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: @@ -427,7 +427,7 @@ class CommandObjectSettingsRemove : public CommandObjectRaw { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: @@ -544,7 +544,7 @@ class CommandObjectSettingsReplace : public CommandObjectRaw { GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: @@ -644,7 +644,7 @@ class CommandObjectSettingsInsertBefore : public CommandObjectRaw { GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: @@ -749,7 +749,7 @@ class CommandObjectSettingsInsertAfter : public CommandObjectRaw { GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: @@ -843,7 +843,7 @@ class CommandObjectSettingsAppend : public CommandObjectRaw { GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: @@ -924,7 +924,7 @@ class CommandObjectSettingsClear : public CommandObjectParsed { GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: diff --git a/source/Commands/CommandObjectTarget.cpp b/source/Commands/CommandObjectTarget.cpp index a9062c14b36..8be43cbf9bb 100644 --- a/source/Commands/CommandObjectTarget.cpp +++ b/source/Commands/CommandObjectTarget.cpp @@ -201,7 +201,7 @@ class CommandObjectTargetCreate : public CommandObjectParsed { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: @@ -1810,7 +1810,7 @@ class CommandObjectTargetModulesModuleAutoComplete CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eModuleCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } }; @@ -1851,7 +1851,7 @@ class CommandObjectTargetModulesSourceFileAutoComplete CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSourceFileCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } }; @@ -2393,7 +2393,7 @@ class CommandObjectTargetModulesAdd : public CommandObjectParsed { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } protected: @@ -3987,7 +3987,7 @@ class CommandObjectTargetSymbolsAdd : public CommandObjectParsed { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } Options *GetOptions() override { return &m_option_group; } diff --git a/source/Core/FormatEntity.cpp b/source/Core/FormatEntity.cpp index 2257b7e273e..743c7c40499 100644 --- a/source/Core/FormatEntity.cpp +++ b/source/Core/FormatEntity.cpp @@ -2350,7 +2350,6 @@ size_t FormatEntity::AutoComplete(CompletionRequest &request) { request.SetWordComplete(false); str = str.drop_front(request.GetMatchStartPoint()); - request.GetMatches().Clear(); const size_t dollar_pos = str.rfind('$'); if (dollar_pos == llvm::StringRef::npos) @@ -2360,7 +2359,7 @@ size_t FormatEntity::AutoComplete(CompletionRequest &request) { if (dollar_pos == str.size() - 1) { std::string match = str.str(); match.append("{"); - request.GetMatches().AppendString(match); + request.AddCompletion(match); return 1; } @@ -2378,8 +2377,10 @@ size_t FormatEntity::AutoComplete(CompletionRequest &request) { llvm::StringRef partial_variable(str.substr(dollar_pos + 2)); if (partial_variable.empty()) { // Suggest all top level entites as we are just past "${" - AddMatches(&g_root, str, llvm::StringRef(), request.GetMatches()); - return request.GetMatches().GetSize(); + StringList new_matches; + AddMatches(&g_root, str, llvm::StringRef(), new_matches); + request.AddCompletions(new_matches); + return request.GetNumberOfMatches(); } // We have a partially specified variable, find it @@ -2395,19 +2396,23 @@ size_t FormatEntity::AutoComplete(CompletionRequest &request) { // Exact match if (n > 0) { // "${thread.info" - request.GetMatches().AppendString(MakeMatch(str, ".")); + request.AddCompletion(MakeMatch(str, ".")); } else { // "${thread.id" - request.GetMatches().AppendString(MakeMatch(str, "}")); + request.AddCompletion(MakeMatch(str, "}")); request.SetWordComplete(true); } } else if (remainder.equals(".")) { // "${thread." - AddMatches(entry_def, str, llvm::StringRef(), request.GetMatches()); + StringList new_matches; + AddMatches(entry_def, str, llvm::StringRef(), new_matches); + request.AddCompletions(new_matches); } else { // We have a partial match // "${thre" - AddMatches(entry_def, str, remainder, request.GetMatches()); + StringList new_matches; + AddMatches(entry_def, str, remainder, new_matches); + request.AddCompletions(new_matches); } - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } diff --git a/source/Core/IOHandler.cpp b/source/Core/IOHandler.cpp index 8474e4b8c56..e7ebeea1b88 100644 --- a/source/Core/IOHandler.cpp +++ b/source/Core/IOHandler.cpp @@ -245,10 +245,10 @@ int IOHandlerDelegate::IOHandlerComplete(IOHandler &io_handler, io_handler.GetDebugger().GetCommandInterpreter(), CommandCompletions::eVariablePathCompletion, request, nullptr); - size_t num_matches = request.GetMatches().GetSize(); + size_t num_matches = request.GetNumberOfMatches(); if (num_matches > 0) { std::string common_prefix; - request.GetMatches().LongestCommonPrefix(common_prefix); + matches.LongestCommonPrefix(common_prefix); const size_t partial_name_len = request.GetCursorArgumentPrefix().size(); // If we matched a unique single command, add a space... Only do this if diff --git a/source/Interpreter/CommandInterpreter.cpp b/source/Interpreter/CommandInterpreter.cpp index 4c8b6544136..64d2c3222fb 100644 --- a/source/Interpreter/CommandInterpreter.cpp +++ b/source/Interpreter/CommandInterpreter.cpp @@ -478,7 +478,7 @@ void CommandInterpreter::LoadCommandDictionary() { std::unique_ptr break_regex_cmd_ap( new CommandObjectRegexCommand( *this, "_regexp-break", - "Set a breakpoint using one of several shorthand formats.\n", + "Set a breakpoint using one of several shorthand formats.", "\n" "_regexp-break :\n" " main.c:12 // Break at line 12 of " @@ -527,7 +527,7 @@ void CommandInterpreter::LoadCommandDictionary() { std::unique_ptr tbreak_regex_cmd_ap( new CommandObjectRegexCommand( *this, "_regexp-tbreak", - "Set a one-shot breakpoint using one of several shorthand formats.\n", + "Set a one-shot breakpoint using one of several shorthand formats.", "\n" "_regexp-break :\n" " main.c:12 // Break at line 12 of " @@ -1703,7 +1703,6 @@ bool CommandInterpreter::HandleCommand(const char *command_line, } int CommandInterpreter::HandleCompletionMatches(CompletionRequest &request) { - auto &matches = request.GetMatches(); int num_command_matches = 0; bool look_for_subcommand = false; @@ -1713,30 +1712,34 @@ int CommandInterpreter::HandleCompletionMatches(CompletionRequest &request) { if (request.GetCursorIndex() == -1) { // We got nothing on the command line, so return the list of commands bool include_aliases = true; + StringList new_matches; num_command_matches = - GetCommandNamesMatchingPartialString("", include_aliases, matches); + GetCommandNamesMatchingPartialString("", include_aliases, new_matches); + request.AddCompletions(new_matches); } else if (request.GetCursorIndex() == 0) { // The cursor is in the first argument, so just do a lookup in the // dictionary. + StringList new_matches; CommandObject *cmd_obj = GetCommandObject( - request.GetParsedLine().GetArgumentAtIndex(0), &matches); - num_command_matches = matches.GetSize(); + request.GetParsedLine().GetArgumentAtIndex(0), &new_matches); if (num_command_matches == 1 && cmd_obj && cmd_obj->IsMultiwordObject() && - matches.GetStringAtIndex(0) != nullptr && + new_matches.GetStringAtIndex(0) != nullptr && strcmp(request.GetParsedLine().GetArgumentAtIndex(0), - matches.GetStringAtIndex(0)) == 0) { + new_matches.GetStringAtIndex(0)) == 0) { if (request.GetParsedLine().GetArgumentCount() == 1) { request.SetWordComplete(true); } else { look_for_subcommand = true; num_command_matches = 0; - matches.DeleteStringAtIndex(0); + new_matches.DeleteStringAtIndex(0); request.GetParsedLine().AppendArgument(llvm::StringRef()); request.SetCursorIndex(request.GetCursorIndex() + 1); request.SetCursorCharPosition(0); } } + request.AddCompletions(new_matches); + num_command_matches = request.GetNumberOfMatches(); } if (request.GetCursorIndex() > 0 || look_for_subcommand) { @@ -1773,8 +1776,7 @@ int CommandInterpreter::HandleCompletion( return 0; else if (first_arg[0] == CommandHistory::g_repeat_char) { if (auto hist_str = m_command_history.FindString(first_arg)) { - request.GetMatches().Clear(); - request.GetMatches().InsertStringAtIndex(0, *hist_str); + matches.InsertStringAtIndex(0, *hist_str); return -2; } else return 0; @@ -1812,7 +1814,7 @@ int CommandInterpreter::HandleCompletion( common_prefix.push_back(quote_char); common_prefix.push_back(' '); } - request.GetMatches().InsertStringAtIndex(0, common_prefix.c_str()); + matches.InsertStringAtIndex(0, common_prefix.c_str()); } return num_command_matches; } diff --git a/source/Interpreter/CommandObject.cpp b/source/Interpreter/CommandObject.cpp index 07be9139f21..324b0b51122 100644 --- a/source/Interpreter/CommandObject.cpp +++ b/source/Interpreter/CommandObject.cpp @@ -267,7 +267,6 @@ int CommandObject::HandleCompletion(CompletionRequest &request) { if (WantsRawCommandString() && !WantsCompletion()) { // FIXME: Abstract telling the completion to insert the completion // character. - request.GetMatches().Clear(); return -1; } else { // Can we do anything generic with the options? @@ -282,7 +281,7 @@ int CommandObject::HandleCompletion(CompletionRequest &request) { bool handled_by_options = cur_options->HandleOptionCompletion( request, opt_element_vector, GetCommandInterpreter()); if (handled_by_options) - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } // If we got here, the last word is not an option or an option argument. diff --git a/source/Interpreter/CommandObjectRegexCommand.cpp b/source/Interpreter/CommandObjectRegexCommand.cpp index f975c0eea2e..ec89ad8fb16 100644 --- a/source/Interpreter/CommandObjectRegexCommand.cpp +++ b/source/Interpreter/CommandObjectRegexCommand.cpp @@ -97,9 +97,8 @@ int CommandObjectRegexCommand::HandleCompletion(CompletionRequest &request) { if (m_completion_type_mask) { CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), m_completion_type_mask, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } else { - request.GetMatches().Clear(); request.SetWordComplete(false); } return 0; diff --git a/source/Interpreter/OptionValue.cpp b/source/Interpreter/OptionValue.cpp index 2d7c69eaa43..c3f363b0598 100644 --- a/source/Interpreter/OptionValue.cpp +++ b/source/Interpreter/OptionValue.cpp @@ -575,8 +575,7 @@ bool OptionValue::DumpQualifiedName(Stream &strm) const { size_t OptionValue::AutoComplete(CommandInterpreter &interpreter, CompletionRequest &request) { request.SetWordComplete(false); - request.GetMatches().Clear(); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } Status OptionValue::SetValueFromString(llvm::StringRef value, diff --git a/source/Interpreter/OptionValueArch.cpp b/source/Interpreter/OptionValueArch.cpp index 3d08780ae6f..d4f1fcb8a70 100644 --- a/source/Interpreter/OptionValueArch.cpp +++ b/source/Interpreter/OptionValueArch.cpp @@ -76,9 +76,8 @@ lldb::OptionValueSP OptionValueArch::DeepCopy() const { size_t OptionValueArch::AutoComplete(CommandInterpreter &interpreter, CompletionRequest &request) { request.SetWordComplete(false); - request.GetMatches().Clear(); CommandCompletions::InvokeCommonCompletionCallbacks( interpreter, CommandCompletions::eArchitectureCompletion, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } diff --git a/source/Interpreter/OptionValueBoolean.cpp b/source/Interpreter/OptionValueBoolean.cpp index 8a340792d78..94c774d6911 100644 --- a/source/Interpreter/OptionValueBoolean.cpp +++ b/source/Interpreter/OptionValueBoolean.cpp @@ -79,7 +79,6 @@ lldb::OptionValueSP OptionValueBoolean::DeepCopy() const { size_t OptionValueBoolean::AutoComplete(CommandInterpreter &interpreter, CompletionRequest &request) { request.SetWordComplete(false); - request.GetMatches().Clear(); static const llvm::StringRef g_autocomplete_entries[] = { "true", "false", "on", "off", "yes", "no", "1", "0"}; @@ -91,7 +90,7 @@ size_t OptionValueBoolean::AutoComplete(CommandInterpreter &interpreter, for (auto entry : entries) { if (entry.startswith_lower(request.GetCursorArgumentPrefix())) - request.GetMatches().AppendString(entry); + request.AddCompletion(entry); } - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } diff --git a/source/Interpreter/OptionValueEnumeration.cpp b/source/Interpreter/OptionValueEnumeration.cpp index e78618ee3c6..c7cbcab7fcc 100644 --- a/source/Interpreter/OptionValueEnumeration.cpp +++ b/source/Interpreter/OptionValueEnumeration.cpp @@ -112,20 +112,18 @@ lldb::OptionValueSP OptionValueEnumeration::DeepCopy() const { size_t OptionValueEnumeration::AutoComplete(CommandInterpreter &interpreter, CompletionRequest &request) { request.SetWordComplete(false); - request.GetMatches().Clear(); const uint32_t num_enumerators = m_enumerations.GetSize(); if (!request.GetCursorArgumentPrefix().empty()) { for (size_t i = 0; i < num_enumerators; ++i) { llvm::StringRef name = m_enumerations.GetCStringAtIndex(i).GetStringRef(); if (name.startswith(request.GetCursorArgumentPrefix())) - request.GetMatches().AppendString(name); + request.AddCompletion(name); } } else { // only suggest "true" or "false" by default for (size_t i = 0; i < num_enumerators; ++i) - request.GetMatches().AppendString( - m_enumerations.GetCStringAtIndex(i).GetStringRef()); + request.AddCompletion(m_enumerations.GetCStringAtIndex(i).GetStringRef()); } - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } diff --git a/source/Interpreter/OptionValueFileSpec.cpp b/source/Interpreter/OptionValueFileSpec.cpp index 18bfcd69394..2b93628679c 100644 --- a/source/Interpreter/OptionValueFileSpec.cpp +++ b/source/Interpreter/OptionValueFileSpec.cpp @@ -102,10 +102,9 @@ lldb::OptionValueSP OptionValueFileSpec::DeepCopy() const { size_t OptionValueFileSpec::AutoComplete(CommandInterpreter &interpreter, CompletionRequest &request) { request.SetWordComplete(false); - request.GetMatches().Clear(); CommandCompletions::InvokeCommonCompletionCallbacks( interpreter, m_completion_mask, request, nullptr); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } const lldb::DataBufferSP &OptionValueFileSpec::GetFileContents() { diff --git a/source/Interpreter/OptionValueUUID.cpp b/source/Interpreter/OptionValueUUID.cpp index 7fa155277ce..355e07bb2b5 100644 --- a/source/Interpreter/OptionValueUUID.cpp +++ b/source/Interpreter/OptionValueUUID.cpp @@ -70,7 +70,6 @@ lldb::OptionValueSP OptionValueUUID::DeepCopy() const { size_t OptionValueUUID::AutoComplete(CommandInterpreter &interpreter, CompletionRequest &request) { request.SetWordComplete(false); - request.GetMatches().Clear(); ExecutionContext exe_ctx(interpreter.GetExecutionContext()); Target *target = exe_ctx.GetTargetPtr(); if (target) { @@ -86,12 +85,12 @@ size_t OptionValueUUID::AutoComplete(CommandInterpreter &interpreter, llvm::ArrayRef module_bytes = module_uuid.GetBytes(); if (module_bytes.size() >= uuid_bytes.size() && module_bytes.take_front(uuid_bytes.size()).equals(uuid_bytes)) { - request.GetMatches().AppendString(module_uuid.GetAsString()); + request.AddCompletion(module_uuid.GetAsString()); } } } } } } - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } diff --git a/source/Interpreter/Options.cpp b/source/Interpreter/Options.cpp index f4758978e2a..c9567e91f6b 100644 --- a/source/Interpreter/Options.cpp +++ b/source/Interpreter/Options.cpp @@ -680,7 +680,7 @@ bool Options::HandleOptionCompletion(CompletionRequest &request, if (!def.short_option) continue; opt_str[1] = def.short_option; - request.GetMatches().AppendString(opt_str); + request.AddCompletion(opt_str); } return true; @@ -692,7 +692,7 @@ bool Options::HandleOptionCompletion(CompletionRequest &request, full_name.erase(full_name.begin() + 2, full_name.end()); full_name.append(def.long_option); - request.GetMatches().AppendString(full_name.c_str()); + request.AddCompletion(full_name.c_str()); } return true; } else if (opt_defs_index != OptionArgElement::eUnrecognizedArg) { @@ -705,10 +705,10 @@ bool Options::HandleOptionCompletion(CompletionRequest &request, strcmp(opt_defs[opt_defs_index].long_option, cur_opt_str) != 0) { std::string full_name("--"); full_name.append(opt_defs[opt_defs_index].long_option); - request.GetMatches().AppendString(full_name.c_str()); + request.AddCompletion(full_name.c_str()); return true; } else { - request.GetMatches().AppendString(request.GetCursorArgument()); + request.AddCompletion(request.GetCursorArgument()); return true; } } else { @@ -728,17 +728,7 @@ bool Options::HandleOptionCompletion(CompletionRequest &request, if (strstr(def.long_option, cur_opt_str + 2) == def.long_option) { std::string full_name("--"); full_name.append(def.long_option); - // The options definitions table has duplicates because of the - // way the grouping information is stored, so only add once. - bool duplicate = false; - for (size_t k = 0; k < request.GetMatches().GetSize(); k++) { - if (request.GetMatches().GetStringAtIndex(k) == full_name) { - duplicate = true; - break; - } - } - if (!duplicate) - request.GetMatches().AppendString(full_name.c_str()); + request.AddCompletion(full_name.c_str()); } } } @@ -790,7 +780,7 @@ bool Options::HandleOptionArgumentCompletion( for (int i = 0; enum_values[i].string_value != nullptr; i++) { if (strstr(enum_values[i].string_value, match_string.c_str()) == enum_values[i].string_value) { - request.GetMatches().AppendString(enum_values[i].string_value); + request.AddCompletion(enum_values[i].string_value); return_value = true; } } diff --git a/source/Plugins/Platform/Android/PlatformAndroid.cpp b/source/Plugins/Platform/Android/PlatformAndroid.cpp index 1cedcde97a9..4477fe371d3 100644 --- a/source/Plugins/Platform/Android/PlatformAndroid.cpp +++ b/source/Plugins/Platform/Android/PlatformAndroid.cpp @@ -83,9 +83,9 @@ PlatformSP PlatformAndroid::CreateInstance(bool force, const ArchSpec *arch) { break; #if defined(__ANDROID__) - // Only accept "unknown" for the vendor if the host is android and it + // Only accept "unknown" for the vendor if the host is android and if // "unknown" wasn't specified (it was just returned because it was NOT - // specified_ + // specified). case llvm::Triple::VendorType::UnknownVendor: create = !arch->TripleVendorWasSpecified(); break; @@ -95,7 +95,7 @@ PlatformSP PlatformAndroid::CreateInstance(bool force, const ArchSpec *arch) { } if (create) { - switch (triple.getOS()) { + switch (triple.getEnvironment()) { case llvm::Triple::Android: break; @@ -103,8 +103,8 @@ PlatformSP PlatformAndroid::CreateInstance(bool force, const ArchSpec *arch) { // Only accept "unknown" for the OS if the host is android and it // "unknown" wasn't specified (it was just returned because it was NOT // specified) - case llvm::Triple::OSType::UnknownOS: - create = !arch->TripleOSWasSpecified(); + case llvm::Triple::EnvironmentType::UnknownEnvironment: + create = !arch->TripleEnvironmentWasSpecified(); break; #endif default: diff --git a/source/Plugins/Platform/Windows/PlatformWindows.cpp b/source/Plugins/Platform/Windows/PlatformWindows.cpp index ed2bcf0cbee..45e906f88e0 100644 --- a/source/Plugins/Platform/Windows/PlatformWindows.cpp +++ b/source/Plugins/Platform/Windows/PlatformWindows.cpp @@ -78,7 +78,7 @@ PlatformSP PlatformWindows::CreateInstance(bool force, create = true; break; - case llvm::Triple::UnknownArch: + case llvm::Triple::UnknownVendor: create = !arch->TripleVendorWasSpecified(); break; diff --git a/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h b/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h index 9c1fc82f58b..d20f31505ed 100644 --- a/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h +++ b/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h @@ -13,8 +13,6 @@ #include "DWARFUnit.h" class DWARFCompileUnit : public DWARFUnit { - friend class DWARFUnit; - public: static DWARFUnitSP Extract(SymbolFileDWARF *dwarf2Data, const lldb_private::DWARFDataExtractor &debug_info, diff --git a/source/Plugins/SymbolFile/DWARF/DWARFUnit.h b/source/Plugins/SymbolFile/DWARF/DWARFUnit.h index c9e48c538bc..3cc24d4202b 100644 --- a/source/Plugins/SymbolFile/DWARF/DWARFUnit.h +++ b/source/Plugins/SymbolFile/DWARF/DWARFUnit.h @@ -33,8 +33,6 @@ enum DWARFProducer { }; class DWARFUnit { - friend class DWARFCompileUnit; - using die_iterator_range = llvm::iterator_range; diff --git a/source/Symbol/Variable.cpp b/source/Symbol/Variable.cpp index 7eafef1e895..af84872a97a 100644 --- a/source/Symbol/Variable.cpp +++ b/source/Symbol/Variable.cpp @@ -644,11 +644,12 @@ static void PrivateAutoComplete( break; case '-': - if (partial_path[1] == '>' && !prefix_path.str().empty()) { + if (partial_path.size() > 1 && partial_path[1] == '>' && + !prefix_path.str().empty()) { switch (type_class) { case lldb::eTypeClassPointer: { CompilerType pointee_type(compiler_type.GetPointeeType()); - if (partial_path[2]) { + if (partial_path.size() > 2 && partial_path[2]) { // If there is more after the "->", then search deeper PrivateAutoComplete( frame, partial_path.substr(2), prefix_path + "->", @@ -672,7 +673,7 @@ static void PrivateAutoComplete( case lldb::eTypeClassUnion: case lldb::eTypeClassStruct: case lldb::eTypeClassClass: - if (partial_path[1]) { + if (partial_path.size() > 1 && partial_path[1]) { // If there is more after the ".", then search deeper PrivateAutoComplete(frame, partial_path.substr(1), prefix_path + ".", compiler_type, matches, @@ -760,9 +761,11 @@ size_t Variable::AutoComplete(const ExecutionContext &exe_ctx, CompilerType compiler_type; bool word_complete = false; + StringList matches; PrivateAutoComplete(exe_ctx.GetFramePtr(), request.GetCursorArgumentPrefix(), - "", compiler_type, request.GetMatches(), word_complete); + "", compiler_type, matches, word_complete); request.SetWordComplete(word_complete); + request.AddCompletions(matches); - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } diff --git a/source/Utility/ArchSpec.cpp b/source/Utility/ArchSpec.cpp index 320f2d9d114..1c50c313e0d 100644 --- a/source/Utility/ArchSpec.cpp +++ b/source/Utility/ArchSpec.cpp @@ -255,12 +255,14 @@ size_t ArchSpec::AutoComplete(CompletionRequest &request) { for (uint32_t i = 0; i < llvm::array_lengthof(g_core_definitions); ++i) { if (NameMatches(g_core_definitions[i].name, NameMatch::StartsWith, request.GetCursorArgumentPrefix())) - request.GetMatches().AppendString(g_core_definitions[i].name); + request.AddCompletion(g_core_definitions[i].name); } } else { - ListSupportedArchNames(request.GetMatches()); + StringList matches; + ListSupportedArchNames(matches); + request.AddCompletions(matches); } - return request.GetMatches().GetSize(); + return request.GetNumberOfMatches(); } #define CPU_ANY (UINT32_MAX) diff --git a/source/Utility/CompletionRequest.cpp b/source/Utility/CompletionRequest.cpp index 1b7697a3586..c88747e2abe 100644 --- a/source/Utility/CompletionRequest.cpp +++ b/source/Utility/CompletionRequest.cpp @@ -20,6 +20,7 @@ CompletionRequest::CompletionRequest(llvm::StringRef command_line, : m_command(command_line), m_raw_cursor_pos(raw_cursor_pos), m_match_start_point(match_start_point), m_max_return_elements(max_return_elements), m_matches(&matches) { + matches.Clear(); // We parse the argument up to the cursor, so the last argument in // parsed_line is the one containing the cursor, and the cursor is after the diff --git a/source/Utility/Stream.cpp b/source/Utility/Stream.cpp index 647a0c0beb5..7df7f700808 100644 --- a/source/Utility/Stream.cpp +++ b/source/Utility/Stream.cpp @@ -526,48 +526,3 @@ size_t Stream::PutCStringAsRawHex8(const char *s) { m_flags.Set(eBinary); return bytes_written; } - -void Stream::UnitTest(Stream *s) { - s->PutHex8(0x12); - - s->PutChar(' '); - s->PutHex16(0x3456, endian::InlHostByteOrder()); - s->PutChar(' '); - s->PutHex16(0x3456, eByteOrderBig); - s->PutChar(' '); - s->PutHex16(0x3456, eByteOrderLittle); - - s->PutChar(' '); - s->PutHex32(0x789abcde, endian::InlHostByteOrder()); - s->PutChar(' '); - s->PutHex32(0x789abcde, eByteOrderBig); - s->PutChar(' '); - s->PutHex32(0x789abcde, eByteOrderLittle); - - s->PutChar(' '); - s->PutHex64(0x1122334455667788ull, endian::InlHostByteOrder()); - s->PutChar(' '); - s->PutHex64(0x1122334455667788ull, eByteOrderBig); - s->PutChar(' '); - s->PutHex64(0x1122334455667788ull, eByteOrderLittle); - - const char *hola = "Hello World!!!"; - s->PutChar(' '); - s->PutCString(hola); - - s->PutChar(' '); - s->Write(hola, 5); - - s->PutChar(' '); - s->PutCStringAsRawHex8(hola); - - s->PutChar(' '); - s->PutCStringAsRawHex8("01234"); - - s->PutChar(' '); - s->Printf("pid=%i", 12733); - - s->PutChar(' '); - s->PrintfAsRawHex8("pid=%i", 12733); - s->PutChar('\n'); -} diff --git a/unittests/Utility/CMakeLists.txt b/unittests/Utility/CMakeLists.txt index 6d9d7a4d006..4812d41ea75 100644 --- a/unittests/Utility/CMakeLists.txt +++ b/unittests/Utility/CMakeLists.txt @@ -14,6 +14,7 @@ add_lldb_unittest(UtilityTests NameMatchesTest.cpp StatusTest.cpp StreamTeeTest.cpp + StreamTest.cpp StringExtractorTest.cpp StructuredDataTest.cpp TildeExpressionResolverTest.cpp diff --git a/unittests/Utility/CompletionRequestTest.cpp b/unittests/Utility/CompletionRequestTest.cpp index 134bf517f85..58dfab0da50 100644 --- a/unittests/Utility/CompletionRequestTest.cpp +++ b/unittests/Utility/CompletionRequestTest.cpp @@ -34,7 +34,70 @@ TEST(CompletionRequest, Constructor) { EXPECT_EQ(request.GetPartialParsedLine().GetArgumentCount(), 2u); EXPECT_STREQ(request.GetPartialParsedLine().GetArgumentAtIndex(1), "b"); +} + +TEST(CompletionRequest, DuplicateFiltering) { + std::string command = "a bad c"; + const unsigned cursor_pos = 3; + StringList matches; + + CompletionRequest request(command, cursor_pos, 0, 0, matches); + + EXPECT_EQ(0U, request.GetNumberOfMatches()); + + // Add foo twice + request.AddCompletion("foo"); + EXPECT_EQ(1U, request.GetNumberOfMatches()); + EXPECT_EQ(1U, matches.GetSize()); + EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); + + request.AddCompletion("foo"); + EXPECT_EQ(1U, request.GetNumberOfMatches()); + EXPECT_EQ(1U, matches.GetSize()); + EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); + + // Add bar twice + request.AddCompletion("bar"); + EXPECT_EQ(2U, request.GetNumberOfMatches()); + EXPECT_EQ(2U, matches.GetSize()); + EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); + EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); + + request.AddCompletion("bar"); + EXPECT_EQ(2U, request.GetNumberOfMatches()); + EXPECT_EQ(2U, matches.GetSize()); + EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); + EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); + + // Add foo again. + request.AddCompletion("foo"); + EXPECT_EQ(2U, request.GetNumberOfMatches()); + EXPECT_EQ(2U, matches.GetSize()); + EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); + EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); + + // Add something with an existing prefix + request.AddCompletion("foobar"); + EXPECT_EQ(3U, request.GetNumberOfMatches()); + EXPECT_EQ(3U, matches.GetSize()); + EXPECT_STREQ("foo", matches.GetStringAtIndex(0)); + EXPECT_STREQ("bar", matches.GetStringAtIndex(1)); + EXPECT_STREQ("foobar", matches.GetStringAtIndex(2)); +} + +TEST(CompletionRequest, TestCompletionOwnership) { + std::string command = "a bad c"; + const unsigned cursor_pos = 3; + StringList matches; + + CompletionRequest request(command, cursor_pos, 0, 0, matches); + + std::string Temporary = "bar"; + request.AddCompletion(Temporary); + // Manipulate our completion. The request should have taken a copy, so that + // shouldn't influence anything. + Temporary[0] = 'f'; - // This is the generated matches should be equal to our passed string list. - EXPECT_EQ(&request.GetMatches(), &matches); + EXPECT_EQ(1U, request.GetNumberOfMatches()); + EXPECT_STREQ("bar", matches.GetStringAtIndex(0)); } diff --git a/unittests/Utility/StreamTest.cpp b/unittests/Utility/StreamTest.cpp new file mode 100644 index 00000000000..2e30357bb29 --- /dev/null +++ b/unittests/Utility/StreamTest.cpp @@ -0,0 +1,474 @@ +//===-- StreamTest.cpp ------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Utility/StreamString.h" +#include "gtest/gtest.h" + +using namespace lldb_private; + +namespace { +struct StreamTest : ::testing::Test { + // Note: Stream is an abstract class, so we use StreamString to test it. To + // make it easier to change this later, only methods in this class explicitly + // refer to the StringStream class. + StreamString s; + // We return here a std::string because that way gtest can print better + // assertion messages. + std::string TakeValue() { + std::string result = s.GetString().str(); + s.Clear(); + return result; + } +}; +} + +namespace { +// A StreamTest where we expect the Stream output to be binary. +struct BinaryStreamTest : StreamTest { + void SetUp() override { + s.GetFlags().Set(Stream::eBinary); + } +}; +} + +TEST_F(StreamTest, ChangingByteOrder) { + s.SetByteOrder(lldb::eByteOrderPDP); + EXPECT_EQ(lldb::eByteOrderPDP, s.GetByteOrder()); +} + +TEST_F(StreamTest, PutChar) { + s.PutChar('a'); + EXPECT_EQ("a", TakeValue()); + + s.PutChar('1'); + EXPECT_EQ("1", TakeValue()); +} + +TEST_F(StreamTest, PutCharWhitespace) { + s.PutChar(' '); + EXPECT_EQ(" ", TakeValue()); + + s.PutChar('\n'); + EXPECT_EQ("\n", TakeValue()); + + s.PutChar('\r'); + EXPECT_EQ("\r", TakeValue()); + + s.PutChar('\t'); + EXPECT_EQ("\t", TakeValue()); +} + +TEST_F(StreamTest, PutCString) { + s.PutCString(""); + EXPECT_EQ("", TakeValue()); + + s.PutCString("foobar"); + EXPECT_EQ("foobar", TakeValue()); + + s.PutCString(" "); + EXPECT_EQ(" ", TakeValue()); +} + +TEST_F(StreamTest, PutCStringWithStringRef) { + s.PutCString(llvm::StringRef("")); + EXPECT_EQ("", TakeValue()); + + s.PutCString(llvm::StringRef("foobar")); + EXPECT_EQ("foobar", TakeValue()); + + s.PutCString(llvm::StringRef(" ")); + EXPECT_EQ(" ", TakeValue()); +} + +TEST_F(StreamTest, QuotedCString) { + s.QuotedCString("foo"); + EXPECT_EQ(R"("foo")", TakeValue()); + + s.QuotedCString("ba r"); + EXPECT_EQ(R"("ba r")", TakeValue()); + + s.QuotedCString(" "); + EXPECT_EQ(R"(" ")", TakeValue()); +} + +TEST_F(StreamTest, PutCharNull) { + s.PutChar('\0'); + EXPECT_EQ(std::string("\0", 1), TakeValue()); + + s.PutChar('a'); + EXPECT_EQ(std::string("a", 1), TakeValue()); +} + +TEST_F(StreamTest, PutCStringAsRawHex8) { + s.PutCStringAsRawHex8("foobar"); + EXPECT_EQ("666f6f626172", TakeValue()); + + s.PutCStringAsRawHex8(" "); + EXPECT_EQ("20", TakeValue()); +} + +TEST_F(StreamTest, PutHex8) { + s.PutHex8((uint8_t)55); + EXPECT_EQ("37", TakeValue()); + s.PutHex8(std::numeric_limits::max()); + EXPECT_EQ("ff", TakeValue()); + s.PutHex8((uint8_t)0); + EXPECT_EQ("00", TakeValue()); +} + +TEST_F(StreamTest, PutNHex8) { + s.PutNHex8(0, (uint8_t)55); + EXPECT_EQ("", TakeValue()); + s.PutNHex8(1, (uint8_t)55); + EXPECT_EQ("37", TakeValue()); + s.PutNHex8(2, (uint8_t)55); + EXPECT_EQ("3737", TakeValue()); + s.PutNHex8(1, (uint8_t)56); + EXPECT_EQ("38", TakeValue()); +} + +TEST_F(StreamTest, PutHex16ByteOrderLittle) { + s.PutHex16(0x1234U, lldb::eByteOrderLittle); + EXPECT_EQ("3412", TakeValue()); + s.PutHex16(std::numeric_limits::max(), lldb::eByteOrderLittle); + EXPECT_EQ("ffff", TakeValue()); + s.PutHex16(0U, lldb::eByteOrderLittle); + EXPECT_EQ("0000", TakeValue()); +} + +TEST_F(StreamTest, PutHex16ByteOrderBig) { + s.PutHex16(0x1234U, lldb::eByteOrderBig); + EXPECT_EQ("1234", TakeValue()); + s.PutHex16(std::numeric_limits::max(), lldb::eByteOrderBig); + EXPECT_EQ("ffff", TakeValue()); + s.PutHex16(0U, lldb::eByteOrderBig); + EXPECT_EQ("0000", TakeValue()); +} + +TEST_F(StreamTest, PutHex32ByteOrderLittle) { + s.PutHex32(0x12345678U, lldb::eByteOrderLittle); + EXPECT_EQ("78563412", TakeValue()); + s.PutHex32(std::numeric_limits::max(), lldb::eByteOrderLittle); + EXPECT_EQ("ffffffff", TakeValue()); + s.PutHex32(0U, lldb::eByteOrderLittle); + EXPECT_EQ("00000000", TakeValue()); +} + +TEST_F(StreamTest, PutHex32ByteOrderBig) { + s.PutHex32(0x12345678U, lldb::eByteOrderBig); + EXPECT_EQ("12345678", TakeValue()); + s.PutHex32(std::numeric_limits::max(), lldb::eByteOrderBig); + EXPECT_EQ("ffffffff", TakeValue()); + s.PutHex32(0U, lldb::eByteOrderBig); + EXPECT_EQ("00000000", TakeValue()); +} + +TEST_F(StreamTest, PutHex64ByteOrderLittle) { + s.PutHex64(0x1234567890ABCDEFU, lldb::eByteOrderLittle); + EXPECT_EQ("efcdab9078563412", TakeValue()); + s.PutHex64(std::numeric_limits::max(), lldb::eByteOrderLittle); + EXPECT_EQ("ffffffffffffffff", TakeValue()); + s.PutHex64(0U, lldb::eByteOrderLittle); + EXPECT_EQ("0000000000000000", TakeValue()); +} + +TEST_F(StreamTest, PutHex64ByteOrderBig) { + s.PutHex64(0x1234567890ABCDEFU, lldb::eByteOrderBig); + EXPECT_EQ("1234567890abcdef", TakeValue()); + s.PutHex64(std::numeric_limits::max(), lldb::eByteOrderBig); + EXPECT_EQ("ffffffffffffffff", TakeValue()); + s.PutHex64(0U, lldb::eByteOrderBig); + EXPECT_EQ("0000000000000000", TakeValue()); +} + +//------------------------------------------------------------------------------ +// Shift operator tests. +//------------------------------------------------------------------------------ + +TEST_F(StreamTest, ShiftOperatorChars) { + s << 'a' << 'b'; + EXPECT_EQ("ab", TakeValue()); +} + +TEST_F(StreamTest, ShiftOperatorStrings) { + s << "cstring\n"; + s << llvm::StringRef("llvm::StringRef\n"); + EXPECT_EQ("cstring\nllvm::StringRef\n", TakeValue()); +} + +TEST_F(StreamTest, ShiftOperatorInts) { + s << std::numeric_limits::max() << " "; + s << std::numeric_limits::max() << " "; + s << std::numeric_limits::max() << " "; + s << std::numeric_limits::max(); + EXPECT_EQ("127 32767 2147483647 9223372036854775807", TakeValue()); +} + +TEST_F(StreamTest, ShiftOperatorUInts) { + s << std::numeric_limits::max() << " "; + s << std::numeric_limits::max() << " "; + s << std::numeric_limits::max() << " "; + s << std::numeric_limits::max(); + EXPECT_EQ("ff ffff ffffffff ffffffffffffffff", TakeValue()); +} + +TEST_F(StreamTest, ShiftOperatorPtr) { + // This test is a bit tricky because pretty much everything related to + // pointer printing seems to lead to UB or IB. So let's make the most basic + // test that just checks that we print *something*. This way we at least know + // that pointer printing doesn't do really bad things (e.g. crashing, reading + // OOB/uninitialized memory which the sanitizers would spot). + + // Shift our own pointer to the output. + int i = 3; + int *ptr = &i; + s << ptr; + + EXPECT_TRUE(!TakeValue().empty()); +} + +TEST_F(StreamTest, PutPtr) { + // See the ShiftOperatorPtr test for the rationale. + int i = 3; + int *ptr = &i; + s.PutPointer(ptr); + + EXPECT_TRUE(!TakeValue().empty()); +} + +// Alias to make it more clear that 'invalid' means for the Stream interface +// that it should use the host byte order. +const static auto hostByteOrder = lldb::eByteOrderInvalid; + +//------------------------------------------------------------------------------ +// PutRawBytes/PutBytesAsRawHex tests. +//------------------------------------------------------------------------------ + +TEST_F(StreamTest, PutBytesAsRawHex8ToBigEndian) { + uint32_t value = 0x12345678; + s.PutBytesAsRawHex8(static_cast(&value), sizeof(value), + hostByteOrder, lldb::eByteOrderBig); + EXPECT_EQ("78563412", TakeValue()); +} + +TEST_F(StreamTest, PutRawBytesToBigEndian) { + uint32_t value = 0x12345678; + s.PutRawBytes(static_cast(&value), sizeof(value), + hostByteOrder, lldb::eByteOrderBig); + EXPECT_EQ("\x78\x56\x34\x12", TakeValue()); +} + +TEST_F(StreamTest, PutBytesAsRawHex8ToLittleEndian) { + uint32_t value = 0x12345678; + s.PutBytesAsRawHex8(static_cast(&value), sizeof(value), + hostByteOrder, lldb::eByteOrderLittle); + EXPECT_EQ("12345678", TakeValue()); +} + +TEST_F(StreamTest, PutRawBytesToLittleEndian) { + uint32_t value = 0x12345678; + s.PutRawBytes(static_cast(&value), sizeof(value), + hostByteOrder, lldb::eByteOrderLittle); + EXPECT_EQ("\x12\x34\x56\x78", TakeValue()); +} + +TEST_F(StreamTest, PutBytesAsRawHex8ToMixedEndian) { + uint32_t value = 0x12345678; + s.PutBytesAsRawHex8(static_cast(&value), sizeof(value), + hostByteOrder, lldb::eByteOrderPDP); + + // FIXME: PDP byte order is not actually implemented but Stream just silently + // prints the value in some random byte order... +#if 0 + EXPECT_EQ("34127856", TakeValue()); +#endif +} + +TEST_F(StreamTest, PutRawBytesToMixedEndian) { + uint32_t value = 0x12345678; + s.PutRawBytes(static_cast(&value), sizeof(value), + lldb::eByteOrderInvalid, lldb::eByteOrderPDP); + + // FIXME: PDP byte order is not actually implemented but Stream just silently + // prints the value in some random byte order... +#if 0 + EXPECT_EQ("\x34\x12\x78\x56", TakeValue()); +#endif +} + +//------------------------------------------------------------------------------ +// ULEB128 support for binary streams. +//------------------------------------------------------------------------------ + +TEST_F(BinaryStreamTest, PutULEB128OneByte) { + auto bytes = s.PutULEB128(0x74ULL); + EXPECT_EQ("\x74", TakeValue()); + EXPECT_EQ(1U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128TwoBytes) { + auto bytes = s.PutULEB128(0x1985ULL); + EXPECT_EQ("\x85\x33", TakeValue()); + EXPECT_EQ(2U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128ThreeBytes) { + auto bytes = s.PutULEB128(0x5023ULL); + EXPECT_EQ("\xA3\xA0\x1", TakeValue()); + EXPECT_EQ(3U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128FourBytes) { + auto bytes = s.PutULEB128(0xA48032ULL); + EXPECT_EQ("\xB2\x80\x92\x5", TakeValue()); + EXPECT_EQ(4U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128FiveBytes) { + auto bytes = s.PutULEB128(0x12345678ULL); + EXPECT_EQ("\xF8\xAC\xD1\x91\x1", TakeValue()); + EXPECT_EQ(5U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128SixBytes) { + auto bytes = s.PutULEB128(0xABFE3FAFDFULL); + EXPECT_EQ("\xDF\xDF\xFE\xF1\xBF\x15", TakeValue()); + EXPECT_EQ(6U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128SevenBytes) { + auto bytes = s.PutULEB128(0xDABFE3FAFDFULL); + EXPECT_EQ("\xDF\xDF\xFE\xF1\xBF\xB5\x3", TakeValue()); + EXPECT_EQ(7U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128EightBytes) { + auto bytes = s.PutULEB128(0x7CDABFE3FAFDFULL); + EXPECT_EQ("\xDF\xDF\xFE\xF1\xBF\xB5\xF3\x3", TakeValue()); + EXPECT_EQ(8U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128NineBytes) { + auto bytes = s.PutULEB128(0x327CDABFE3FAFDFULL); + EXPECT_EQ("\xDF\xDF\xFE\xF1\xBF\xB5\xF3\x93\x3", TakeValue()); + EXPECT_EQ(9U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128MaxValue) { + auto bytes = s.PutULEB128(std::numeric_limits::max()); + EXPECT_EQ("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x1", TakeValue()); + EXPECT_EQ(10U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128Zero) { + auto bytes = s.PutULEB128(0x0U); + EXPECT_EQ(std::string("\0", 1), TakeValue()); + EXPECT_EQ(1U, bytes); +} + +TEST_F(BinaryStreamTest, PutULEB128One) { + auto bytes = s.PutULEB128(0x1U); + EXPECT_EQ("\x1", TakeValue()); + EXPECT_EQ(1U, bytes); +} + +//------------------------------------------------------------------------------ +// SLEB128 support for binary streams. +//------------------------------------------------------------------------------ + +TEST_F(BinaryStreamTest, PutSLEB128OneByte) { + auto bytes = s.PutSLEB128(0x74LL); + EXPECT_EQ(std::string("\xF4\0", 2), TakeValue()); + EXPECT_EQ(2U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128TwoBytes) { + auto bytes = s.PutSLEB128(0x1985LL); + EXPECT_EQ("\x85\x33", TakeValue()); + EXPECT_EQ(2U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128ThreeBytes) { + auto bytes = s.PutSLEB128(0x5023LL); + EXPECT_EQ("\xA3\xA0\x1", TakeValue()); + EXPECT_EQ(3U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128FourBytes) { + auto bytes = s.PutSLEB128(0xA48032LL); + EXPECT_EQ("\xB2\x80\x92\x5", TakeValue()); + EXPECT_EQ(4U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128FiveBytes) { + auto bytes = s.PutSLEB128(0x12345678LL); + EXPECT_EQ("\xF8\xAC\xD1\x91\x1", TakeValue()); + EXPECT_EQ(5U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128SixBytes) { + auto bytes = s.PutSLEB128(0xABFE3FAFDFLL); + EXPECT_EQ("\xDF\xDF\xFE\xF1\xBF\x15", TakeValue()); + EXPECT_EQ(6U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128SevenBytes) { + auto bytes = s.PutSLEB128(0xDABFE3FAFDFLL); + EXPECT_EQ("\xDF\xDF\xFE\xF1\xBF\xB5\x3", TakeValue()); + EXPECT_EQ(7U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128EightBytes) { + auto bytes = s.PutSLEB128(0x7CDABFE3FAFDFLL); + EXPECT_EQ("\xDF\xDF\xFE\xF1\xBF\xB5\xF3\x3", TakeValue()); + EXPECT_EQ(8U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128NineBytes) { + auto bytes = s.PutSLEB128(0x327CDABFE3FAFDFLL); + EXPECT_EQ("\xDF\xDF\xFE\xF1\xBF\xB5\xF3\x93\x3", TakeValue()); + EXPECT_EQ(9U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128MaxValue) { + auto bytes = s.PutSLEB128(std::numeric_limits::max()); + EXPECT_EQ(std::string("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0", 10), TakeValue()); + EXPECT_EQ(10U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128Zero) { + auto bytes = s.PutSLEB128(0x0); + EXPECT_EQ(std::string("\0", 1), TakeValue()); + EXPECT_EQ(1U, bytes); +} + +TEST_F(BinaryStreamTest, PutSLEB128One) { + auto bytes = s.PutSLEB128(0x1); + EXPECT_EQ(std::string("\x1", 1), TakeValue()); + EXPECT_EQ(1U, bytes); +} + +//------------------------------------------------------------------------------ +// SLEB128/ULEB128 support for non-binary streams. +//------------------------------------------------------------------------------ + +// The logic for this is very simple, so it should be enough to test some basic +// use cases. + +TEST_F(StreamTest, PutULEB128) { + auto bytes = s.PutULEB128(0x74ULL); + EXPECT_EQ("0x74", TakeValue()); + EXPECT_EQ(4U, bytes); +} + +TEST_F(StreamTest, PutSLEB128) { + auto bytes = s.PutSLEB128(0x1985LL); + EXPECT_EQ("0x6533", TakeValue()); + EXPECT_EQ(6U, bytes); +} -- 2.45.0