~ chicken-core (chicken-5) ab53ba3f0f4e133ab6b71d90845f1f570bc5d0e3
commit ab53ba3f0f4e133ab6b71d90845f1f570bc5d0e3 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Apr 11 11:58:28 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Apr 11 11:58:28 2011 +0200 CPS does not treat ##core#inline[_allocate] as atomic to avoid unboxing problem with nested unboxing; -debug h instead of question-mark; -debug i; updated scrutiny.expected; modules used non-existant map-se in debugging build diff --git a/batch-driver.scm b/batch-driver.scm index 639ff2eb..dfb115cf 100644 --- a/batch-driver.scm +++ b/batch-driver.scm @@ -178,7 +178,7 @@ (map (lambda (c) (string->symbol (string c))) (string->list do) ) ) (collect-options 'debug) ) ) - (when (memq '? debugging-chicken) + (when (memq 'h debugging-chicken) (print-debug-options) (exit)) (set! dumpnodes (memq '|D| debugging-chicken)) diff --git a/compiler.scm b/compiler.scm index 5d8be8c3..065b58ba 100644 --- a/compiler.scm +++ b/compiler.scm @@ -1497,8 +1497,8 @@ (eq? 'procedure (car type)) (symbol? (cadr type))) (set-car! (cdr type) name)) - (mark-variable name '##core#type type) - (mark-variable name '##core#declared-type) + (mark-variable name '##compiler#type type) + (mark-variable name '##compiler#declared-type) (when (pair? (cddr spec)) (mark-variable name '##compiler#specializations @@ -1731,8 +1731,8 @@ (define (atomic? n) (let ((class (node-class n))) (or (memq class '(quote ##core#variable ##core#undefined ##core#global-ref)) - (and (memq class '(##core#inline ##core#inline_allocate ##core#inline_ref ##core#inline_update - ##core#inline_loc_ref ##core#inline_loc_update)) + (and (memq class '(##core#inline_ref ##core#inline_update ##core#inline_loc_ref + ##core#inline_loc_update)) (every atomic? (node-subexpressions n)) ) ) ) ) (walk node values) ) diff --git a/expand.scm b/expand.scm index 0f305baa..27fc8787 100644 --- a/expand.scm +++ b/expand.scm @@ -50,8 +50,6 @@ (define-alias dm d) (define-alias dx d) -(define-syntax d (syntax-rules () ((_ . _) (void)))) - (define-inline (getp sym prop) (##core#inline "C_i_getprop" sym prop #f)) diff --git a/modules.scm b/modules.scm index d60560e2..f67c5a63 100644 --- a/modules.scm +++ b/modules.scm @@ -52,6 +52,12 @@ ((getp id '##core#macro-alias)) (else #f))) +#+debugbuild +(define (map-se se) + (map (lambda (a) + (cons (car a) (if (symbol? (cdr a)) (cdr a) '<macro>))) + se)) + ;;; low-level module support diff --git a/scrutinizer.scm b/scrutinizer.scm index 4c6a8e35..bbd71d42 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -28,7 +28,8 @@ (unit scrutinizer) (hide match-specialization specialize-node! specialization-statistics procedure-type? named? procedure-result-types procedure-argument-types - noreturn-type? rest-type procedure-name d-depth)) + noreturn-type? rest-type procedure-name d-depth + compatible-types? type<=?)) (include "compiler-namespace") @@ -374,50 +375,6 @@ ((match (car results1) (car results2)) (match-results (cdr results1) (cdr results2))) (else #f))) - (define (compatible-types? t1 t2) - (or (type<=? t1 t2) - (type<=? t2 t1))) - (define (type<=? t1 t2) - (or (eq? t1 t2) - (memq t2 '(* undefined)) - (case t2 - ((list) (memq t1 '(null pair))) - ((procedure) (and (pair? t1) (eq? 'procedure (car t1)))) - ((number) (memq t1 '(fixnum float))) - (else - (and (pair? t1) (pair? t2) - (case (car t1) - ((or) (every (cut type<=? <> t2) (cdr t1))) - ((procedure) - (let ((args1 (if (named? t1) (caddr t1) (cadr t1))) - (args2 (if (named? t2) (caddr t2) (cadr t2))) - (res1 (if (named? t1) (cdddr t1) (cddr t1))) - (res2 (if (named? t2) (cdddr t2) (cddr t2))) ) - (let loop1 ((args1 args1) - (args2 args2) - (m1 0) - (m2 0)) - (cond ((null? args1) - (and (or (null? args2) (> m2 0)) - (let loop2 ((res1 res1) (res2 res2)) - (cond ((eq? '* res2) #t) - ((null? res2) (null? res1)) - ((eq? '* res1) #f) - ((type<=? (car res1) (car res2)) - (loop2 (cdr res1) (cdr res2))) - (else #f))))) - ((null? args2) #f) - ((eq? (car args1) '#!optional) - (loop1 (cdr args1) args2 1 m2)) - ((eq? (car args2) '#!optional) - (loop1 args1 (cdr args2) m1 1)) - ((eq? (car args1) '#!rest) - (loop1 (cdr args1) args2 2 m2)) - ((eq? (car args2) '#!rest) - (loop1 args1 (cdr args2) m1 2)) - ((type<=? (car args1) (car args2)) - (loop1 (cdr args1) (cdr args2) m1 m2)) - (else #f))))))))))) (define (multiples n) (if (= n 1) "" "s")) (define (single what tv loc) @@ -697,7 +654,7 @@ (and-let* ((val (or (get db var 'value) (get db var 'local-value)))) (when (eq? val (first subs)) - (debugging 'x (sprintf "(: ~s ~s)" var rt)) + (debugging 'i (sprintf "(: ~s ~s)" var rt)) (mark-variable var '##compiler#declared-type) (mark-variable var '##compiler#type rt)))) (when b @@ -797,6 +754,52 @@ (debugging 'x "safe calls" safe-calls)) rn))) +(define (compatible-types? t1 t2) + (or (type<=? t1 t2) + (type<=? t2 t1))) + +(define (type<=? t1 t2) + (or (eq? t1 t2) + (memq t2 '(* undefined)) + (case t2 + ((list) (memq t1 '(null pair))) + ((procedure) (and (pair? t1) (eq? 'procedure (car t1)))) + ((number) (memq t1 '(fixnum float))) + (else + (and (pair? t1) (pair? t2) + (case (car t1) + ((or) (every (cut type<=? <> t2) (cdr t1))) + ((procedure) + (let ((args1 (if (named? t1) (caddr t1) (cadr t1))) + (args2 (if (named? t2) (caddr t2) (cadr t2))) + (res1 (if (named? t1) (cdddr t1) (cddr t1))) + (res2 (if (named? t2) (cdddr t2) (cddr t2))) ) + (let loop1 ((args1 args1) + (args2 args2) + (m1 0) + (m2 0)) + (cond ((null? args1) + (and (or (null? args2) (> m2 0)) + (let loop2 ((res1 res1) (res2 res2)) + (cond ((eq? '* res2) #t) + ((null? res2) (null? res1)) + ((eq? '* res1) #f) + ((type<=? (car res1) (car res2)) + (loop2 (cdr res1) (cdr res2))) + (else #f))))) + ((null? args2) #f) + ((eq? (car args1) '#!optional) + (loop1 (cdr args1) args2 1 m2)) + ((eq? (car args2) '#!optional) + (loop1 args1 (cdr args2) m1 1)) + ((eq? (car args1) '#!rest) + (loop1 (cdr args1) args2 2 m2)) + ((eq? (car args2) '#!rest) + (loop1 args1 (cdr args2) m1 2)) + ((type<=? (car args1) (car args2)) + (loop1 (cdr args1) (cdr args2) m1 m2)) + (else #f))))))))))) + (define (procedure-type? t) (or (eq? 'procedure t) (and (pair? t) diff --git a/support.scm b/support.scm index d2c11dd5..de5895d2 100644 --- a/support.scm +++ b/support.scm @@ -749,10 +749,10 @@ (##sys#hash-table-for-each (lambda (sym plist) (when (variable-visible? sym) - (when (variable-mark sym '##core#declared-type) + (when (variable-mark sym '##compiler#declared-type) (let ((specs (or (variable-mark sym '##compiler#specializations) '()))) - (pp (cons* sym (variable-mark sym '##core#type) specs)))))) + (pp (cons* sym (variable-mark sym '##compiler#type) specs)))))) db) (print "; END OF FILE")))) @@ -1616,6 +1616,7 @@ Available debugging options: c print every expression before macro-expansion u lists all unassigned global variable references d lists all assigned global variables + i show inferred type information for unexported globals x display information about experimental features D when printing nodes, use node-tree output N show the real-name mapping table @@ -1633,7 +1634,7 @@ Available debugging options: 7 show expressions after complete optimization 8 show database after final analysis 9 show expressions after closure conversion - ? you already figured that out + h you already figured that out EOF diff --git a/tests/scrutiny.expected b/tests/scrutiny.expected index d919b18b..c33165bd 100644 --- a/tests/scrutiny.expected +++ b/tests/scrutiny.expected @@ -45,4 +45,10 @@ Warning: at toplevel: Warning: at toplevel: g89: in procedure call to `g89', expected a value of type `(procedure () *)', but was given a value of type `fixnum' +Warning: in toplevel procedure `foo': + expected value of type boolean in conditional but were given a value of +type `(procedure bar24 () *)' which is always true: + +(if bar24 '3 (##core#undefined)) + Warning: redefinition of standard binding: car diff --git a/unboxing.scm b/unboxing.scm index 3059bb72..961dc9cc 100644 --- a/unboxing.scm +++ b/unboxing.scm @@ -105,7 +105,7 @@ (let ((n2 (make-node '##core#inline_unboxed (list alt) (reverse iargs)))) - (pp (build-expression-tree n2)) + ;(pp (build-expression-tree n2)) (if (and dest (cdr dest)) n2 (let ((tmp (gensym "tu"))) @@ -179,6 +179,7 @@ (define (straighten-binding! n) ;; change `(let ((<v> (let (...) <x2>))) <x>)' into ;; `(let (...) (let ((<v> <x2>)) <x>))' + ;; (also for "##core#let_unboxed") (let* ((subs (node-subexpressions n)) (bnode (first subs)) (bcl (node-class bnode))) @@ -203,6 +204,7 @@ (define (straighten-conditional! n) ;; change `(if (let (...) <x1>) <x2> <x3>)' into ;; `(let (...) (if <x1> <x2> <x3>))' + ;; (also for "##core#let_unboxed") (let* ((subs (node-subexpressions n)) (bnode (first subs)) (bcl (node-class bnode))) @@ -226,6 +228,7 @@ (define (straighten-call! n) ;; change `(<proc> ... (let (...) <x>) ...)' into ;; `(let (...) (<proc> ... <x> ...))' + ;; (also for "##core#let_unboxed") (let* ((class (node-class n)) (subs (node-subexpressions n)) (params (node-parameters n)) @@ -381,8 +384,11 @@ (for-each (o invalidate (cut walk <> #f #f pass2?)) subs) #f)))) - (d "walk lambda: ~a" id) + (d "walk lambda: ~a (pass 1)" id) + ;; walk once and mark boxed/unboxed variables in environment (walk body #f #f #f) + ;; walk a second time and rewrite + (d "walk lambda: ~a (pass 2)" id) (walk body #f #f #t))) (walk-lambda #f '() node) @@ -463,25 +469,3 @@ (C_u_i_pointer_f32_set (pointer flonum) flonum "C_ub_i_pointer_f32_set") (C_u_i_pointer_f64_set (pointer flonum) flonum "C_ub_i_pointer_f64_set") (C_null_pointerp (pointer) bool "C_ub_i_null_pointerp")) - - -;;; - -#|XXX - -This breaks: - -(use srfi-4) - -(define (foo) - (let ((v (f64vector 1.0 2.0)) - (n (f64vector-ref v 0)) - (m (f64vector-ref v 1))) - (print (fp+ (fp* n m) (fp* n m))))) - -(foo) - -- fp* gets unboxed before fp+ and will result incorrectly nested ##core#let_unboxed - forms in argument position of the final ##core#inline_unboxed form. - -|#Trap