guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] debugger: Support generics. WIP.


From: Jan Nieuwenhuizen
Subject: [PATCH] debugger: Support generics. WIP.
Date: Wed, 12 Sep 2018 13:44:39 +0200

Hi!

I'm looking at the debugger again and have found a number of things*)
that I would like to fix.  My first attempt is for GOOPS support: I want
,break-at-source FILE LINE to also support breaking if LINE happens to
be in a define-method.

The attached patch tries to add this support, but there's still a
problem: the trap doesn't work.  I'll keep on looking but some help
would be much appreciated; e.g., I'm doubt if using (oop goops) in
(system ...) modules is OK.

Before this patch:

    scheme@(break-at-source)> ,break-at-source "break-at-source.scm" 21
    While executing meta-command:
    No procedures found at ~a:~a. "break-at-source.scm" 21

with only (system xref) patched:

    scheme@(break-at-source)> ,break-at-source "break-at-source.scm" 21
    ;;; WARNING (no instructions found for break-at-source.scm : 21)
    Trap 0: Breakpoint at break-at-source.scm:21.

Using this patch there is no warning anymore and the trap is reported to
be set... Here's what happens

--8<---------------cut here---------------start------------->8---
$ meta/build-env guile-tools compile -o break-at-source.go break-at-source.scm
wrote `break-at-source.go'
13:28:59 address@hidden:~/src/guile/build [env]
$ meta/build-env guile -L . -C .
GNU Guile 2.2.4.14-8b75b
Copyright (C) 1995-2017 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
scheme@(guile-user)> ,m (break-at-source)

scheme@(break-at-source)> ,break-at-source "break-at-source.scm" 21
Trap 0: Breakpoint at break-at-source.scm:21.
scheme@(break-at-source)> (main)

main1
main2
test1
test2
test3
main3
scheme@(break-at-source)> ,break-at-source "break-at-source.scm" 16
Trap 1: Breakpoint at break-at-source.scm:16.
scheme@(break-at-source)> (main)
main1
main2
Trap 1: Breakpoint at break-at-source.scm:16
Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(break-at-source) [1]>
--8<---------------cut here---------------end--------------->8---

Where should I look next, what could i do next?
janneke

*) Other debugger things I would like to look at
   - also find source locations in files that were compiled using
      (compile-file ... 'absolute)
   - have ,frame and ,backtrace use GNU style error messages (I worked
     on this long ago but only have an ugly solution)
   - have procedure parameters show up in ,locals
   - get Emacs GUD integration working ootb

>From 13516b7fbee7baee20d6255619b57e3934800465 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <address@hidden>
Date: Wed, 12 Sep 2018 11:58:43 +0200
Subject: [PATCH] debugger: Support generics.  WIP.

Before this patch:

    scheme@(break-at-source)> ,break-at-source "break-at-source.scm" 21
    While executing meta-command:
    No procedures found at ~a:~a. "break-at-source.scm" 21

with only (system xref) patched:

    scheme@(break-at-source)> ,break-at-source "break-at-source.scm" 21
    ;;; WARNING (no instructions found for break-at-source.scm : 21)
    Trap 0: Breakpoint at break-at-source.scm:21.

but the breakpoint does not work, execution continues right through trap.

With also (system vm traps) patched:

    scheme@(break-at-source)> ,break-at-source "break-at-source.scm" 21
    Trap 0: Breakpoint at break-at-source.scm:21.

Yay!...but alas, the breakpoint still does not work, execution continues
right through trap.

* module/system/vm/traps.scm (generic-sources-by-line): New procedure.
(program-sources-by-line): Use it to support generics.
* module/system/xref.scm (generic-callee-rev-vars): New procedure.
(procedure-callee-rev-vars): Use it to support generics.
(generic-sources): New procedure.
(procedure-sources): Use it to support generics.
* examples/break-at-source.scm: New file.
---
 examples/break-at-source.scm | 22 ++++++++++++++++++++++
 module/system/vm/traps.scm   |  9 +++++++++
 module/system/xref.scm       | 14 ++++++++++++++
 3 files changed, 45 insertions(+)
 create mode 100644 examples/break-at-source.scm

diff --git a/examples/break-at-source.scm b/examples/break-at-source.scm
new file mode 100644
index 000000000..88d905bd1
--- /dev/null
+++ b/examples/break-at-source.scm
@@ -0,0 +1,22 @@
+#!
+cp ../examples/break-at-source.scm .
+meta/build-env guile-tools compile -o break-at-source.go break-at-source.scm
+meta/build-env guile -L examples -C examples
+,m (break-at-source)
+,break-at-source "break-at-source.scm" 21
+(main)
+!#
+
+(define-module (break-at-source)
+  #:use-module (oop goops))
+
+(define (main . args)
+  (display "main1\n")
+  (display "main2\n")
+  (test args)          ; 16
+  (display "main3\n"))
+
+(define-method (test (o <top>))
+  (display "test1\n")
+  (display "test2\n")  ; 20
+  (display "test3\n"))
diff --git a/module/system/vm/traps.scm b/module/system/vm/traps.scm
index 8bee10355..3b75d3826 100644
--- a/module/system/vm/traps.scm
+++ b/module/system/vm/traps.scm
@@ -62,6 +62,9 @@
   #:use-module (system vm program)
   #:use-module (system xref)
   #:use-module (rnrs bytevectors)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:use-module (oop goops)
   #:export (trap-at-procedure-call
             trap-in-procedure
             trap-instructions-in-procedure
@@ -335,8 +338,14 @@
                out)
               (sort! alist (lambda (x y) (< (car x) (car y))))
               alist)))))
+   ((is-a? proc <generic>) (generic-sources-by-line proc file))
    (else '())))
 
+(define (generic-sources-by-line generic file)
+  (let* ((methods (generic-function-methods generic))
+         (procedures (map (cut slot-ref <> 'procedure) methods)))
+    (append-map (cut program-sources-by-line <> file) procedures)))
+
 (define (source->ip-range proc file line)
   (or (or-map (lambda (line-and-ranges)
                 (cond
diff --git a/module/system/xref.scm b/module/system/xref.scm
index 2b943fdd9..8663af5be 100644
--- a/module/system/xref.scm
+++ b/module/system/xref.scm
@@ -22,6 +22,8 @@
   #:use-module (system vm disassembler)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:use-module (oop goops)
   #:export (*xref-ignored-modules*
             procedure-callees
             procedure-callers
@@ -80,8 +82,14 @@
 (define (procedure-callee-rev-vars proc)
   (cond
    ((program? proc) (program-callee-rev-vars proc))
+   ((is-a? proc <generic>) (generic-callee-rev-vars proc))
    (else '())))
 
+(define (generic-callee-rev-vars generic)
+  (let* ((methods (generic-function-methods generic))
+         (procedures (map (cut slot-ref <> 'procedure) methods)))
+    (append-map procedure-callee-rev-vars procedures)))
+
 (define (procedure-callees prog)
   "Evaluates to a list of the given program callees."
   (let lp ((in (procedure-callee-rev-vars prog)) (out '()))
@@ -202,8 +210,14 @@ pair of the form (module-name . variable-name), "
 (define (procedure-sources proc)
   (cond
    ((program? proc) (program-sources proc))
+   ((is-a? proc <generic>) (generic-sources proc))
    (else '())))
 
+(define (generic-sources generic)
+  (let* ((methods (generic-function-methods generic))
+         (procedures (map (cut slot-ref <> 'procedure) methods)))
+    (append-map procedure-sources procedures)))
+
 ;; file -> line -> (proc ...)
 (define *closure-sources-db* #f)
 ;; file -> line -> (proc ...)
-- 
2.18.0


reply via email to

[Prev in Thread] Current Thread [Next in Thread]