~ chicken-core (chicken-5) b8d61402ca068fad127cced77589dba0ce30ef8c
commit b8d61402ca068fad127cced77589dba0ce30ef8c Author: felix <felix@call-with-current-continuation.org> AuthorDate: Tue Aug 24 15:11:21 2010 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Tue Aug 24 15:11:21 2010 +0200 profiling-decoration was applied to non-global procedures (reported by sjamaan) diff --git a/batch-driver.scm b/batch-driver.scm index 637fd79b..040c6cf3 100644 --- a/batch-driver.scm +++ b/batch-driver.scm @@ -349,7 +349,7 @@ (if acc '((set! ##sys#profile-append-mode #t)) '() ) ) ) - (dribble "Generating ~aprofile" (if acc "accumulated " "")) ) ) + (dribble "generating ~aprofiled code" (if acc "accumulative " "")) ) ) ;;*** hardcoded "modules.db" is bad (also used in chicken-install.scm) (load-identifier-database "modules.db") @@ -591,7 +591,7 @@ ;; change semantics (when (and inline-output-file insert-timer-checks) (let ((f inline-output-file)) - (dribble "Generating global inline file `~a' ..." f) + (dribble "generating global inline file `~a' ..." f) (emit-global-inline-file f db) ) ) (check-for-unsafe-toplevel-procedure-calls node2 db) (begin-time) diff --git a/compiler.scm b/compiler.scm index 5d064d2f..ab02e395 100644 --- a/compiler.scm +++ b/compiler.scm @@ -440,14 +440,14 @@ (cadr x) x) ) - (define (resolve-variable x0 e se dest) + (define (resolve-variable x0 e se dest ldest) (let ((x (lookup x0 se))) (d `(RESOLVE-VARIABLE: ,x0 ,x ,(map car se))) (cond ((not (symbol? x)) x0) ; syntax? [(and constants-used (##sys#hash-table-ref constant-table x)) - => (lambda (val) (walk (car val) e se dest)) ] + => (lambda (val) (walk (car val) e se dest ldest)) ] [(and inline-table-used (##sys#hash-table-ref inline-table x)) - => (lambda (val) (walk val e se dest)) ] + => (lambda (val) (walk val e se dest ldest)) ] [(assq x foreign-variables) => (lambda (fv) (let* ([t (second fv)] @@ -457,7 +457,7 @@ (foreign-type-convert-result (finish-foreign-result ft body) t) - e se dest)))] + e se dest ldest)))] [(assq x location-pointer-map) => (lambda (a) (let* ([t (third a)] @@ -467,7 +467,7 @@ (foreign-type-convert-result (finish-foreign-result ft body) t) - e se dest))) ] + e se dest ldest))) ] ((##sys#get x '##core#primitive)) ((not (memq x e)) (##sys#alias-global-hook x #f)) ; only if global (else x)))) @@ -504,13 +504,13 @@ (for-each pretty-print imps) (print "\n;; END OF FILE"))))) ) ) - (define (walk x e se dest) + (define (walk x e se dest ldest) (cond ((symbol? x) (cond ((keyword? x) `(quote ,x)) ((memq x unlikely-variables) (warning (sprintf "reference to variable `~s' possibly unintended" x) ))) - (resolve-variable x e se dest)) + (resolve-variable x e se dest ldest)) ((not-pair? x) (if (constant? x) `(quote ,x) @@ -527,11 +527,11 @@ (name (or (and (symbol? name0) (##sys#get name0 '##core#primitive)) name0)) (xexpanded (##sys#expand x se compiler-syntax-enabled))) (cond ((not (eq? x xexpanded)) - (walk xexpanded e se dest)) + (walk xexpanded e se dest ldest)) [(and inline-table-used (##sys#hash-table-ref inline-table name)) => (lambda (val) - (walk (cons val (cdr x)) e se dest)) ] + (walk (cons val (cdr x)) e se dest ldest)) ] [else (when ln (update-line-number-database! xexpanded ln)) @@ -539,11 +539,11 @@ ((##core#if) `(if - ,(walk (cadr x) e se #f) - ,(walk (caddr x) e se #f) + ,(walk (cadr x) e se #f #f) + ,(walk (caddr x) e se #f #f) ,(if (null? (cdddr x)) '(##core#undefined) - (walk (cadddr x) e se #f) ) ) ) + (walk (cadddr x) e se #f #f) ) ) ) ((##core#syntax ##core#quote) `(quote ,(##sys#strip-syntax (cadr x)))) @@ -551,7 +551,7 @@ ((##core#check) (if unsafe ''#t - (walk (cadr x) e se dest) ) ) + (walk (cadr x) e se dest ldest) ) ) ((##core#immutable) (let ((c (cadadr x))) @@ -572,7 +572,7 @@ ((##core#inline_loc_ref) `(##core#inline_loc_ref ,(##sys#strip-syntax (cadr x)) - ,(walk (caddr x) e se dest))) + ,(walk (caddr x) e se dest ldest))) ((##core#require-for-syntax) (let ([ids (map eval (cdr x))]) @@ -603,7 +603,7 @@ (warning (sprintf "extension `~A' is currently not installed" id))) `(##core#begin ,exp ,(loop (cdr ids))) ) ) ) ) - e se dest) ) ) + e se dest ldest) ) ) ((##core#let) (let* ((bindings (cadr x)) @@ -613,11 +613,12 @@ (set-real-names! aliases vars) `(let ,(map (lambda (alias b) - (list alias (walk (cadr b) e se (car b))) ) + (list alias (walk (cadr b) e se (car b) #t)) ) aliases bindings) - ,(walk (##sys#canonicalize-body (cddr x) se2 compiler-syntax-enabled) + ,(walk (##sys#canonicalize-body + (cddr x) se2 compiler-syntax-enabled) (append aliases e) - se2 dest) ) ) ) + se2 dest ldest) ) ) ) ((##core#letrec) (let ((bindings (cadr x)) @@ -631,7 +632,7 @@ `(##core#set! ,(car b) ,(cadr b))) bindings) (##core#let () ,@body) ) - e se dest))) + e se dest ldest))) ((##core#lambda) (let ((llist (cadr x)) @@ -646,8 +647,9 @@ (lambda (vars argc rest) (let* ((aliases (map gensym vars)) (se2 (append (map cons vars aliases) se)) - (body0 (##sys#canonicalize-body obody se2 compiler-syntax-enabled)) - (body (walk body0 (append aliases e) se2 #f)) + (body0 (##sys#canonicalize-body + obody se2 compiler-syntax-enabled)) + (body (walk body0 (append aliases e) se2 #f #f)) (llist2 (build-lambda-list aliases argc @@ -655,16 +657,16 @@ (l `(##core#lambda ,llist2 ,body)) ) (set-real-names! aliases vars) (cond ((or (not dest) + ldest (assq dest se)) ; not global? l) ((and emit-profile (or (eq? profiled-procedures 'all) (and (eq? profiled-procedures 'some) - (variable-mark dest '##compiler#profile))) - (##sys#interned-symbol? dest)) + (variable-mark dest '##compiler#profile)))) (expand-profile-lambda - (if (memq dest e) ;XXX should normally not be the case + (if (memq dest e) ; should normally not be the case e (##sys#alias-global-hook dest #f)) llist2 body) ) @@ -683,7 +685,7 @@ (walk (##sys#canonicalize-body (cddr x) se2 compiler-syntax-enabled) e se2 - dest) ) ) + dest ldest) ) ) ((##core#letrec-syntax) (let* ((ms (map (lambda (b) @@ -700,7 +702,7 @@ ms) (walk (##sys#canonicalize-body (cddr x) se2 compiler-syntax-enabled) - e se2 dest))) + e se2 dest ldest))) ((##core#define-syntax) (##sys#check-syntax @@ -726,7 +728,7 @@ (##sys#current-environment) (##sys#er-transformer ,body)) ;*** possibly wrong se? '(##core#undefined) ) - e se dest)) ) + e se dest ldest)) ) ((##core#define-compiler-syntax) (let* ((var (cadr x)) @@ -753,7 +755,7 @@ (##sys#er-transformer ,body) (##sys#current-environment)))) '(##core#undefined) ) - e se dest))) + e se dest ldest))) ((##core#let-compiler-syntax) (let ((bs (map @@ -774,12 +776,15 @@ bs) ) (lambda () (walk - (##sys#canonicalize-body (cddr x) se compiler-syntax-enabled) - e se dest) ) + (##sys#canonicalize-body + (cddr x) se compiler-syntax-enabled) + e se dest ldest) ) (lambda () (for-each (lambda (b) - (##sys#put! (car b) '##compiler#compiler-syntax (caddr b))) + (##sys#put! + (car b) + '##compiler#compiler-syntax (caddr b))) bs) ) ) ) ) ((##core#include) @@ -787,7 +792,7 @@ `(##core#begin ,@(fluid-let ((##sys#default-read-info-hook read-info-hook)) (##sys#include-forms-from-file (cadr x)))) - e se dest)) + e se dest ldest)) ((##core#module) (let* ((x (##sys#strip-syntax x)) @@ -850,7 +855,7 @@ (car body) e ;? (##sys#current-environment) - #f) + #f #f) xs)))))))) (let ((body (canonicalize-begin-body @@ -862,7 +867,7 @@ (walk x e ;? - (##sys#current-meta-environment) #f) ) + (##sys#current-meta-environment) #f #f) ) mreg)) body)))) (do ((cs compiler-syntax (cdr cs))) @@ -880,7 +885,7 @@ (walk (##sys#canonicalize-body obody se2 compiler-syntax-enabled) (append aliases e) - se2 #f) ] ) + se2 #f #f) ] ) (set-real-names! aliases vars) `(##core#lambda ,aliases ,body) ) ) @@ -902,7 +907,7 @@ (##core#inline_update (,(third fv) ,type) ,(foreign-type-check tmp type) ) ) - e se #f)))) + e se #f #f)))) ((assq var location-pointer-map) => (lambda (a) (let* ([type (third a)] @@ -913,7 +918,7 @@ (,type) ,(second a) ,(foreign-type-check tmp type) ) ) - e se #f)))) + e se #f #f)))) (else (unless (memq var e) ; global? (set! var (or (##sys#get var '##core#primitive) @@ -932,7 +937,7 @@ (##sys#notice "assignment to imported value binding" var))) (when (keyword? var) (warning (sprintf "assignment to keyword `~S'" var) )) - `(set! ,var ,(walk val e se var0)))))) + `(set! ,var ,(walk val e se var0 (memq var e))))))) ((##core#inline) `(##core#inline ,(unquotify (cadr x) se) ,@(mapwalk (cddr x) e se))) @@ -943,18 +948,18 @@ ,@(mapwalk (cddr x) e se))) ((##core#inline_update) - `(##core#inline_update ,(cadr x) ,(walk (caddr x) e se #f)) ) + `(##core#inline_update ,(cadr x) ,(walk (caddr x) e se #f #f)) ) ((##core#inline_loc_update) `(##core#inline_loc_update ,(cadr x) - ,(walk (caddr x) e se #f) - ,(walk (cadddr x) e se #f)) ) + ,(walk (caddr x) e se #f #f) + ,(walk (cadddr x) e se #f #f)) ) ((##core#compiletimetoo ##core#elaborationtimetoo) (let ((exp (cadr x))) (eval/meta exp) - (walk exp e se dest) ) ) + (walk exp e se dest #f) ) ) ((##core#compiletimeonly ##core#elaborationtimeonly) (eval/meta (cadr x)) @@ -967,24 +972,24 @@ (let ([x (car xs)] [r (cdr xs)] ) (if (null? r) - (list (walk x e se dest)) - (cons (walk x e se #f) (fold r)) ) ) ) ) + (list (walk x e se dest #f)) + (cons (walk x e se #f #f) (fold r)) ) ) ) ) '(##core#undefined) ) ) ((##core#foreign-lambda) - (walk (expand-foreign-lambda x #f) e se dest) ) + (walk (expand-foreign-lambda x #f) e se dest ldest) ) ((##core#foreign-safe-lambda) - (walk (expand-foreign-lambda x #t) e se dest) ) + (walk (expand-foreign-lambda x #t) e se dest ldest) ) ((##core#foreign-lambda*) - (walk (expand-foreign-lambda* x #f) e se dest) ) + (walk (expand-foreign-lambda* x #f) e se dest ldest) ) ((##core#foreign-safe-lambda*) - (walk (expand-foreign-lambda* x #t) e se dest) ) + (walk (expand-foreign-lambda* x #t) e se dest ldest) ) ((##core#foreign-primitive) - (walk (expand-foreign-primitive x) e se dest) ) + (walk (expand-foreign-primitive x) e se dest ldest) ) ((##core#define-foreign-variable) (let* ([var (##sys#strip-syntax (second x))] @@ -1018,7 +1023,7 @@ (define ,ret ,(if (pair? (cdr conv)) (second conv) '##sys#values)) ) - e se dest) ) ] + e se dest ldest) ) ] [else (##sys#hash-table-set! foreign-type-table name type) '(##core#undefined) ] ) ) ) @@ -1061,7 +1066,7 @@ '() ) ,(if init (fifth x) (fourth x)) ) ) e (alist-cons var alias se) - dest) ) ) + dest ldest) ) ) ((##core#define-inline) (let* ((name (second x)) @@ -1093,7 +1098,7 @@ (hide-variable var) (mark-variable var '##compiler#constant) (mark-variable var '##compiler#always-bound) - (walk `(define ,var ',val) e se #f) ) ] ) ) ) + (walk `(define ,var ',val) e se #f #f) ) ] ) ) ) ((##core#declare) (walk @@ -1101,7 +1106,7 @@ ,@(map (lambda (d) (process-declaration d se)) (cdr x) ) ) - e '() #f) ) + e '() #f #f) ) ((##core#foreign-callback-wrapper) (let-values ([(args lam) (split-at (cdr x) 4)]) @@ -1176,7 +1181,7 @@ (##sys#make-c-string r ',name)) ) ) ) (else (cddr lam)) ) ) rtype) ) ) - e se #f) ) ) ) ) + e se #f #f) ) ) ) ) ((##core#location) (let ([sym (cadr x)]) @@ -1185,14 +1190,18 @@ => (lambda (a) (walk `(##sys#make-locative ,(second a) 0 #f 'location) - e se #f) ) ] + e se #f #f) ) ] [(assq sym external-to-pointer) - => (lambda (a) (walk (cdr a) e se #f)) ] + => (lambda (a) (walk (cdr a) e se #f #f)) ] [(memq sym callback-names) `(##core#inline_ref (,(symbol->string sym) c-pointer)) ] [else - (walk `(##sys#make-locative ,sym 0 #f 'location) e se #f) ] ) - (walk `(##sys#make-locative ,sym 0 #f 'location) e se #f) ) ) ) + (walk + `(##sys#make-locative ,sym 0 #f 'location) + e se #f #f) ] ) + (walk + `(##sys#make-locative ,sym 0 #f 'location) + e se #f #f) ) ) ) (else (let* ((x2 (fluid-let ((##sys#syntax-context (cons name ##sys#syntax-context))) @@ -1221,10 +1230,10 @@ `(##core#let ((,tmp ,(car x))) (,tmp ,@(cdr x))) - e se dest))))) + e se dest ldest))))) (define (mapwalk xs e se) - (map (lambda (x) (walk x e se #f)) xs) ) + (map (lambda (x) (walk x e se #f #f)) xs) ) (when (memq 'c debugging-chicken) (newline) (pretty-print exp)) (##sys#clear-trace-buffer) @@ -1237,7 +1246,7 @@ ,(begin (set! extended-bindings (append internal-bindings extended-bindings)) exp) ) - '() (##sys#current-environment) #f) ) ) + '() (##sys#current-environment) #f #f) ) ) (define (process-declaration spec se) ; se unused in the moment diff --git a/manual/Using the compiler b/manual/Using the compiler index c1bf4204..2de86f3a 100644 --- a/manual/Using the compiler +++ b/manual/Using the compiler @@ -169,9 +169,9 @@ the source text should be read from standard input. ; -prelude EXPRESSIONS : Add {{EXPRESSIONS}} before all other toplevel expressions in the compiled file. This option may be given multiple times. Processing of this option takes place before processing of {{-prologue}}. ; -profile : -; -accumulate-profile : Instruments the source code to count procedure calls and execution times. After the program terminates (either via an explicit {{exit}} or implicitly), profiling statistics are written to a file named {{PROFILE}}. Each line of the generated file contains a list with the procedure name, the number of calls and the time spent executing it. Use the {{chicken-profile}} program to display the profiling information in a more user-friendly form. Enter {{chicken-profile}} with no arguments at the command line to get a list of available options. The {{-accumulate-profile}} option is similar to {{-profile}}, but the resulting profile information will be appended to any existing {{PROFILE}} file. {{chicken-profile}} will merge and sum up the accumulated timing information, if several entries for the same procedure calls exist. +; -accumulate-profile : Instruments the source code to count procedure calls and execution times. After the program terminates (either via an explicit {{exit}} or implicitly), profiling statistics are written to a file named {{PROFILE.<randomnumber>}}. Each line of the generated file contains a list with the procedure name, the number of calls and the time spent executing it. Use the {{chicken-profile}} program to display the profiling information in a more user-friendly form. Enter {{chicken-profile}} with no arguments at the command line to get a list of available options. The {{-accumulate-profile}} option is similar to {{-profile}}, but the resulting profile information will be appended to any existing {{PROFILE}} file. {{chicken-profile}} will merge and sum up the accumulated timing information, if several entries for the same procedure calls exist. Only profiling information for global procedures will be collected. -; -profile-name FILENAME : Specifies name of the generated profile information (which defaults to {{PROFILE}}. Implies {{-profile}}. +; -profile-name FILENAME : Specifies name of the generated profile information (which defaults to {{PROFILE.<randomnumber>}}. Implies {{-profile}}. ; -prologue FILENAME : Includes the file named {{FILENAME}} at the start of the compiled source file. The include-path is not searched. This option may be given multiple times. diff --git a/support.scm b/support.scm index 69a33726..a60c7ab8 100644 --- a/support.scm +++ b/support.scm @@ -275,11 +275,11 @@ [args (gensym)] ) (set! profile-lambda-list (alist-cons index name profile-lambda-list)) (set! profile-lambda-index (add1 index)) - `(lambda ,args + `(##core#lambda ,args (##sys#dynamic-wind - (lambda () (##sys#profile-entry ',index ,profile-info-vector-name)) - (lambda () (apply (lambda ,llist ,body) ,args)) - (lambda () (##sys#profile-exit ',index ,profile-info-vector-name)) ) ) ) ) + (##core#lambda () (##sys#profile-entry ',index ,profile-info-vector-name)) + (##core#lambda () (##sys#apply (##core#lambda ,llist ,body) ,args)) + (##core#lambda () (##sys#profile-exit ',index ,profile-info-vector-name)) ) ) ) ) ;;; Database operations: diff --git a/tests/sgrep.scm b/tests/sgrep.scm index 7503256a..8ec9934e 100644 --- a/tests/sgrep.scm +++ b/tests/sgrep.scm @@ -35,48 +35,4 @@ (syntax-rules () ((_) '(: #\( (submatch (* any)) ", " (submatch (* any)))))) -;; slow -;(print "literal") (bgrep 1 (rx1)) - -#| -(print "literal (SRE)") -(bgrep 1 (rx2)) - -(print "precompiled") -(define rx (regexp (rx1))) -(bgrep 1 rx) -|# - -#| -(define-compiler-syntax (string-search x r c) - (let ((%quote (r 'quote)) - (%let (r 'let)) - (%string-search (r 'string-search)) - (%regexp (r 'regexp)) - (%or (r 'or)) - (%let* (r 'let*))) - (let ((rx (cadr x))) - (if (or (string? rx) - (and (pair? rx) (c (car rx) %quote))) - (let ((cache (vector #f)) - (%cache (r 'cache)) - (%tmp (r 'tmp))) - `(,%let* ((,%cache (,%quote ,cache)) - (,%tmp (##sys#slot ,%cache 0))) - (,%string-search - (,%or ,%tmp - (,%let ((,%tmp (,%regexp ,rx))) - (##sys#setslot ,%cache 0 ,%tmp) - ,%tmp)) - ,@(cddr x)))) - x)))) - -(print "inline cached/literal") -(bgrep 1 "\\((.*), (.*)\\)") -(print "inline cached/literal (SRE)") -(bgrep 1 '(: #\( (submatch (* any)) ", " (submatch (* any)))) - -|# - -Trap