~ chicken-core (chicken-5) 339b8ffa1b133a117aef6dd6757e1885302878ff
commit 339b8ffa1b133a117aef6dd6757e1885302878ff
Author: Evan Hanson <evhan@foldling.org>
AuthorDate: Mon Feb 15 22:05:42 2016 +1300
Commit: Peter Bex <peter@more-magic.net>
CommitDate: Sat Jun 18 16:16:09 2016 +0200
Track source nodes for better scrutiny output
Adds a map from specialized nodes back to their original source nodes so
that the scrutinizer can (a) print line numbers for parts of the program
that started out as ##core#call nodes but ended up being specialized to
something without line number information, and (b) print program
fragments as they appeared in the user's source, pre-specialization.
Signed-off-by: Peter Bex <peter@more-magic.net>
diff --git a/scrutinizer.scm b/scrutinizer.scm
index da897658..d2ce3582 100644
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -26,9 +26,10 @@
(declare
(unit scrutinizer)
- (hide specialize-node! specialization-statistics
+ (hide specialize-node! specialization-statistics mutate-node! node-mutations
procedure-type? named? procedure-result-types procedure-argument-types
noreturn-type? rest-type procedure-name d-depth
+ source-node source-node-tree node-line-number node-debug-info
noreturn-procedure-type? trail trail-restore walked-result
multiples procedure-arguments procedure-results typeset-min
smash-component-types! generate-type-checks! over-all-instantiations
@@ -123,16 +124,6 @@
(define (walked-result n)
(first (node-parameters n))) ; assumes ##core#the/result node
-(define (node-line-number n)
- (case (node-class n)
- ((##core#call)
- (let ((params (node-parameters n)))
- (and (pair? (cdr params))
- (pair? (cadr params)) ; debug-info has line-number information?
- (source-info->line (cadr params)))))
- ((##core#typecase)
- (car (node-parameters n)))
- (else #f)))
(define (scrutinize node db complain specialize)
(let ((blist '()) ; (((VAR . FLOW) TYPE) ...)
@@ -265,7 +256,7 @@
(define (node-source-prefix n)
(let ((line (node-line-number n)))
- (if (not line) "" (sprintf "(~a) " line))))
+ (if (not line) "" (sprintf "(~a) " line))))
(define (location-name loc)
(define (lname loc1)
@@ -284,7 +275,7 @@
(define add-loc cons)
(define (fragment x)
- (let ((x (build-expression-tree x)))
+ (let ((x (build-expression-tree (source-node-tree x))))
(let walk ((x x) (d 0))
(cond ((atom? x) (##sys#strip-syntax x))
((>= d +fragment-max-depth+) '...)
@@ -836,7 +827,7 @@
(append (type-typeenv (car types)) typeenv)
#t)
;; drops exp
- (copy-node! (car subs) n)
+ (mutate-node! n (car subs))
(walk n e loc dest tail flow ctags))
(else
(trail-restore trail0 typeenv)
@@ -1821,6 +1812,47 @@
db)
(print "; END OF FILE"))))
+;;
+;; Source node tracking
+;;
+;; Nodes are mutated in place during specialization, which may lose line
+;; number information if, for example, a node is changed from a
+;; ##core#call to a class without debug info. To preserve line numbers
+;; and allow us to print fragments of the original source, we maintain a
+;; side table of mappings from mutated nodes to copies of the originals.
+;;
+
+(define node-mutations '())
+
+(define (mutate-node! node expr)
+ (set! node-mutations (alist-update! node (copy-node node) node-mutations))
+ (copy-node! (build-node-graph expr) node))
+
+(define (source-node n #!optional (k values))
+ (let ((orig (alist-ref n node-mutations eq?)))
+ (if (not orig) (k n) (source-node orig k))))
+
+(define (source-node-tree n)
+ (source-node
+ n
+ (lambda (n*)
+ (make-node (node-class n*)
+ (node-parameters n*)
+ (map source-node (node-subexpressions n*))))))
+
+(define (node-line-number n)
+ (node-debug-info (source-node n)))
+
+(define (node-debug-info n)
+ (case (node-class n)
+ ((##core#call)
+ (let ((params (node-parameters n)))
+ (and (pair? (cdr params))
+ (pair? (cadr params)) ; debug-info has line-number information?
+ (source-info->line (cadr params)))))
+ ((##core#typecase)
+ (car (node-parameters n)))
+ (else #f)))
;; Mutate node for specialization
@@ -1848,8 +1880,7 @@
((not (pair? x)) x)
((eq? 'quote (car x)) x) ; to handle numeric constants
(else (cons (subst (car x)) (subst (cdr x))))))
- (let ((spec (subst template)))
- (copy-node! (build-node-graph spec) node))))
+ (mutate-node! node (subst template))))
;;; Type-validation and -normalization
diff --git a/support.scm b/support.scm
index 5c614ab8..d7c993e6 100644
--- a/support.scm
+++ b/support.scm
@@ -760,6 +760,11 @@
(cons (rec (car t)) (rec (cdr t)))
t) ) )
+(define (copy-node n)
+ (make-node (node-class n)
+ (node-parameters n)
+ (node-subexpressions n)))
+
(define (copy-node! from to)
(node-class-set! to (node-class from))
(node-parameters-set! to (node-parameters from))
Trap