teak-llvm/lldb/packages/Python/lldbsuite/test/commands/command/script/callables.py
Lawrence D'Anna 2386537c24 [LLDB] bugfix: command script add -f doesn't work for some callables
Summary:
When users define a debugger command from python, they provide a callable
object.   Because the signature of the function has been extended, LLDB
needs to inspect the number of parameters the callable can take.

The rule it was using to decide was weird, apparently not tested, and
giving wrong results for some kinds of python callables.

This patch replaces the weird rule with a simple one: if the callable can
take 5 arguments, it gets the 5 argument version of the signature.
Otherwise it gets the old 4 argument version.

It also adds tests with a bunch of different kinds of python callables
with both 4 and 5 arguments.

Reviewers: JDevlieghere, clayborg, labath, jingham

Reviewed By: labath

Subscribers: lldb-commits

Tags: #lldb

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

llvm-svn: 375333
2019-10-19 07:05:33 +00:00

63 lines
2.1 KiB
Python

from __future__ import print_function
import lldb
# bunch of different kinds of python callables that should
# all work as commands.
def check(debugger, command, context, result, internal_dict):
if (not isinstance(debugger, lldb.SBDebugger) or
not isinstance(command, str) or
not isinstance(result, lldb.SBCommandReturnObject) or
not isinstance(internal_dict, dict) or
(not context is None and
not isinstance(context, lldb.SBExecutionContext))):
raise Exception()
result.AppendMessage("All good.")
def vfoobar(*args):
check(*args)
def v5foobar(debugger, command, context, result, internal_dict, *args):
check(debugger, command, context, result, internal_dict)
def foobar(debugger, command, context, result, internal_dict):
check(debugger, command, context, result, internal_dict)
def foobar4(debugger, command, result, internal_dict):
check(debugger, command, None, result, internal_dict)
class FooBar:
@staticmethod
def sfoobar(debugger, command, context, result, internal_dict):
check(debugger, command, context, result, internal_dict)
@classmethod
def cfoobar(cls, debugger, command, context, result, internal_dict):
check(debugger, command, context, result, internal_dict)
def ifoobar(self, debugger, command, context, result, internal_dict):
check(debugger, command, context, result, internal_dict)
def __call__(self, debugger, command, context, result, internal_dict):
check(debugger, command, context, result, internal_dict)
@staticmethod
def sfoobar4(debugger, command, result, internal_dict):
check(debugger, command, None, result, internal_dict)
@classmethod
def cfoobar4(cls, debugger, command, result, internal_dict):
check(debugger, command, None, result, internal_dict)
def ifoobar4(self, debugger, command, result, internal_dict):
check(debugger, command, None, result, internal_dict)
class FooBar4:
def __call__(self, debugger, command, result, internal_dict):
check(debugger, command, None, result, internal_dict)
FooBarObj = FooBar()
FooBar4Obj = FooBar4()