Fix an issue where one could not define a Python command with the same name as an existing alias (or rather, one could but the results of invoking the command were far from satisfactory)

llvm-svn: 275080
This commit is contained in:
Enrico Granata 2016-07-11 17:36:55 +00:00
parent 71021cdf47
commit 02989a4b5d
4 changed files with 56 additions and 2 deletions

View File

@ -0,0 +1,37 @@
"""
Test lldb Python commands.
"""
from __future__ import print_function
import os, time
import lldb
from lldbsuite.test.lldbtest import *
class CommandScriptAliasTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
def test (self):
self.pycmd_tests ()
def pycmd_tests (self):
self.runCmd("command script import tcsacmd.py")
self.runCmd("command script add -f tcsacmd.some_command_here attach")
# This is the function to remove the custom commands in order to have a
# clean slate for the next test case.
def cleanup():
self.runCmd('command script delete attach', check=False)
# Execute the cleanup function during test case tear down.
self.addTearDownHook(cleanup)
# We don't want to display the stdout if not in TraceOn() mode.
if not self.TraceOn():
self.HideStdout()
self.expect('attach a', substrs = ['Victory is mine']);
self.runCmd("command script delete attach")
self.runCmd('attach noprocessexistswiththisname', check=False) # this can't crash but we don't care whether the actual attach works

View File

@ -0,0 +1,11 @@
from __future__ import print_function
import lldb, sys
def some_command_here(debugger, command, result, d):
if command == "a":
print("Victory is mine", file=result)
return True
else:
print("Sadness for all", file=result)
return False

View File

@ -3172,8 +3172,12 @@ CommandInterpreter::ResolveCommandImpl(std::string &command_line, CommandReturnO
if (cmd_obj == nullptr)
{
std::string full_name;
if (GetAliasFullName(next_word.c_str(), full_name))
bool is_alias = GetAliasFullName(next_word.c_str(), full_name);
cmd_obj = GetCommandObject(next_word.c_str(), &matches);
bool is_real_command = (is_alias == false) || (cmd_obj != nullptr && cmd_obj->IsAlias() == false);
if (!is_real_command)
{
matches.Clear();
std::string alias_result;
cmd_obj = BuildAliasResult(full_name.c_str(), scratch_command, alias_result, result);
revised_command_line.Printf("%s", alias_result.c_str());
@ -3185,7 +3189,8 @@ CommandInterpreter::ResolveCommandImpl(std::string &command_line, CommandReturnO
}
else
{
cmd_obj = GetCommandObject(next_word.c_str(), &matches);
if (!cmd_obj)
cmd_obj = GetCommandObject(next_word.c_str(), &matches);
if (cmd_obj)
{
actual_cmd_name_len += strlen(cmd_obj->GetCommandName());