Author: Armin Rigo <[email protected]>
Branch: reverse-debugger
Changeset: r85322:1e5b6abe3bdb
Date: 2016-06-22 12:13 +0200
http://bitbucket.org/pypy/pypy/changeset/1e5b6abe3bdb/
Log: in-progress
diff --git a/rpython/rlib/revdb.py b/rpython/rlib/revdb.py
--- a/rpython/rlib/revdb.py
+++ b/rpython/rlib/revdb.py
@@ -16,9 +16,12 @@
CMD_BREAKPOINTS = 4
CMD_MOREINFO = 5
CMD_ATTACHID = 6
+CMD_WATCH = 7
+CMD_EXPECTED = 8
ANSWER_TEXT = 20
ANSWER_MOREINFO = 21
ANSWER_NEXTNID = 22
+ANSWER_COMPILED = 23
def stop_point():
@@ -33,9 +36,6 @@
def register_debug_command(command, lambda_func):
"""Register the extra RPython-implemented debug command."""
-def register_allocation_command(lambda_func):
- """Register the extra RPython-implemented callback for allocation."""
-
def send_answer(cmd, arg1=0, arg2=0, arg3=0, extra=""):
"""For RPython debug commands: writes an answer block to stdout"""
llop.revdb_send_answer(lltype.Void, cmd, arg1, arg2, arg3, extra)
@@ -126,55 +126,38 @@
_about_ = register_debug_command
def compute_result_annotation(self, s_command_num, s_lambda_func):
- from rpython.annotator import model as annmodel
- from rpython.rtyper import llannotation
-
command_num = s_command_num.const
lambda_func = s_lambda_func.const
- assert isinstance(command_num, int)
+ assert isinstance(command_num, (int, str))
t = self.bookkeeper.annotator.translator
if t.config.translation.reverse_debugger:
func = lambda_func()
try:
cmds = t.revdb_commands
except AttributeError:
- cmds = t.revdb_commands = []
- for old_num, old_func in cmds:
- if old_num == command_num:
- assert old_func is func
- break
- else:
- cmds.append((command_num, func))
+ cmds = t.revdb_commands = {}
+ old_func = cmds.setdefault(command_num, func)
+ assert old_func is func
s_func = self.bookkeeper.immutablevalue(func)
- s_ptr1 = llannotation.SomePtr(ll_ptrtype=_CMDPTR)
- s_str2 = annmodel.SomeString()
+ arg_getter = getattr(self, 'arguments_' + str(command_num),
+ self.default_arguments)
self.bookkeeper.emulate_pbc_call(self.bookkeeper.position_key,
- s_func, [s_ptr1, s_str2])
+ s_func, arg_getter())
+
+ def default_arguments(self):
+ from rpython.annotator import model as annmodel
+ from rpython.rtyper import llannotation
+ return [llannotation.SomePtr(ll_ptrtype=_CMDPTR),
+ annmodel.SomeString()]
+
+ def arguments_ALLOCATING(self):
+ from rpython.annotator import model as annmodel
+ from rpython.rtyper import llannotation
+ return [annmodel.SomeInteger(knowntype=r_longlong),
+ llannotation.lltype_to_annotation(llmemory.GCREF)]
+
+ def arguments_WATCHING(self):
+ return []
def specialize_call(self, hop):
hop.exception_cannot_occur()
-
-
-class RegisterAllocationCommand(ExtRegistryEntry):
- _about_ = register_allocation_command
-
- def compute_result_annotation(self, s_lambda_func):
- from rpython.annotator import model as annmodel
- from rpython.rtyper import llannotation
-
- lambda_func = s_lambda_func.const
- t = self.bookkeeper.annotator.translator
- if t.config.translation.reverse_debugger:
- func = lambda_func()
- try:
- assert t.revdb_allocation_cmd is func
- except AttributeError:
- t.revdb_allocation_cmd = func
- s_func = self.bookkeeper.immutablevalue(func)
- s_int1 = annmodel.SomeInteger(knowntype=r_longlong)
- s_ref2 = llannotation.lltype_to_annotation(llmemory.GCREF)
- self.bookkeeper.emulate_pbc_call(self.bookkeeper.position_key,
- s_func, [s_int1, s_ref2])
-
- def specialize_call(self, hop):
- hop.exception_cannot_occur()
diff --git a/rpython/translator/revdb/gencsupp.py
b/rpython/translator/revdb/gencsupp.py
--- a/rpython/translator/revdb/gencsupp.py
+++ b/rpython/translator/revdb/gencsupp.py
@@ -27,27 +27,35 @@
lltype.Void))
ALLOCFUNCPTR = lltype.Ptr(lltype.FuncType([rffi.LONGLONG, llmemory.GCREF],
lltype.Void))
+ WATCHFUNCPTR = lltype.Ptr(lltype.FuncType([], lltype.Signed))
bk = db.translator.annotator.bookkeeper
- cmds = getattr(db.translator, 'revdb_commands', [])
+ cmds = getattr(db.translator, 'revdb_commands', {})
+ numcmds = [(num, func) for (num, func) in cmds.items()
+ if isinstance(num, int)]
S = lltype.Struct('RPY_REVDB_COMMANDS',
- ('names', lltype.FixedSizeArray(rffi.INT, len(cmds) +
1)),
- ('funcs', lltype.FixedSizeArray(FUNCPTR, len(cmds))),
- ('alloc', ALLOCFUNCPTR))
+ ('names', lltype.FixedSizeArray(rffi.INT, len(numcmds) + 1)),
+ ('funcs', lltype.FixedSizeArray(FUNCPTR, len(numcmds))),
+ ('alloc', ALLOCFUNCPTR),
+ ('watch', WATCHFUNCPTR))
s = lltype.malloc(S, flavor='raw', immortal=True, zero=True)
- for i, (name, func) in enumerate(cmds):
+ i = 0
+ for name, func in cmds.items():
fnptr = lltype.getfunctionptr(bk.getdesc(func).getuniquegraph())
- assert lltype.typeOf(fnptr) == FUNCPTR
- assert isinstance(name, int) and name != 0
- s.names[i] = rffi.cast(rffi.INT, name)
- s.funcs[i] = fnptr
-
- allocation_cmd = getattr(db.translator, 'revdb_allocation_cmd', None)
- if allocation_cmd is not None:
- s.alloc = lltype.getfunctionptr(
- bk.getdesc(allocation_cmd).getuniquegraph())
+ if isinstance(name, int):
+ assert name != 0
+ s.names[i] = rffi.cast(rffi.INT, name)
+ s.funcs[i] = fnptr
+ i += 1
+ elif name == "ALLOCATING":
+ s.alloc = fnptr
+ elif name == "WATCHING":
+ s.watch = fnptr
+ else:
+ raise AssertionError("bad tag in register_debug_command(): %r"
+ % (name,))
exports.EXPORTS_obj2name[s._as_obj()] = 'rpy_revdb_commands'
db.get(s)
diff --git a/rpython/translator/revdb/interact.py
b/rpython/translator/revdb/interact.py
--- a/rpython/translator/revdb/interact.py
+++ b/rpython/translator/revdb/interact.py
@@ -109,6 +109,15 @@
lst = [str(n) for n in sorted(self.pgroup.paused)]
print ', '.join(lst)
+ def cmd_info_breakpoints(self):
+ """List current breakpoints"""
+ lst = self.pgroup.all_breakpoints.num2name.items()
+ if lst:
+ for num, name in sorted(lst):
+ print '%8d: %s' % (num, name)
+ else:
+ print 'no breakpoints.'
+
def move_forward(self, steps):
self.remove_tainting()
try:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit