~ chicken-core (chicken-5) 7f1fd58a30dd5402ca0b75b4fffa962575a4fecb
commit 7f1fd58a30dd5402ca0b75b4fffa962575a4fecb 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:43:43 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 433ed2ed..3eafa1a5 100644 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -129,16 +129,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 strict block-compilation) (let ((blist '()) ; (((VAR . FLOW) TYPE) ...) @@ -274,7 +264,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) @@ -293,7 +283,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) (strip-syntax x)) ((>= d +fragment-max-depth+) '...) @@ -844,7 +834,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) @@ -1846,6 +1836,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 @@ -1873,8 +1904,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 a7396c08..b129f252 100644 --- a/support.scm +++ b/support.scm @@ -45,7 +45,7 @@ node-parameters node-parameters-set! node-subexpressions node-subexpressions-set! varnode qnode build-node-graph build-expression-tree fold-boolean inline-lambda-bindings - tree-copy copy-node! emit-global-inline-file load-inline-file + tree-copy copy-node! copy-node emit-global-inline-file load-inline-file match-node expression-has-side-effects? simple-lambda-node? dump-undefined-globals dump-defined-globals dump-global-refs make-foreign-callback-stub foreign-callback-stub? @@ -733,6 +733,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