~ chicken-core (chicken-5) 30750024747f36e2e48d573722eebbbbf93eb544
commit 30750024747f36e2e48d573722eebbbbf93eb544 Author: felix <felix@z.(none)> AuthorDate: Thu Mar 10 20:55:54 2011 +0100 Commit: felix <felix@z.(none)> CommitDate: Thu Mar 10 20:55:54 2011 +0100 validate converts (... -> ...) type syntax diff --git a/chicken-syntax.scm b/chicken-syntax.scm index 136b45bc..b889f7d3 100644 --- a/chicken-syntax.scm +++ b/chicken-syntax.scm @@ -1117,15 +1117,14 @@ (##sys#er-transformer (lambda (x r c) (##sys#check-syntax ': x '(_ symbol _)) - (let ((name (##sys#globalize (cadr x))) - (type (##sys#strip-syntax (caddr x)))) - (validate-type type name) - (cond ((memq #:csi ##sys#features) '(##core#undefined)) + (let* ((name (##sys#globalize (cadr x))) + (type1 (##sys#strip-syntax (caddr x))) + (name1 (##sys#strip-syntax (cadr x))) + (type (validate-type type1 name1))) + (cond ((not type) + (syntax-error ': "invalid type syntax" name1 type1)) + ((memq #:csi ##sys#features) '(##core#undefined)) (else - (when (and (pair? type) - (eq? 'procedure (car type)) - (not (symbol? (cadr type)))) - (set! type `(procedure ,(##sys#strip-syntax name) ,@(cdr type)))) `(##core#declare (type (,name ,type))))))))) diff --git a/compiler.scm b/compiler.scm index 2beb740a..277b5f92 100644 --- a/compiler.scm +++ b/compiler.scm @@ -1471,14 +1471,16 @@ (let ((name (globalize (car spec))) (type (##sys#strip-syntax (cadr spec)))) (cond ((validate-type type name) - (##sys#put! name '##core#type type) - (##sys#put! name '##core#declared-type #t) + (mark-variable name '##core#type type) + (mark-variable name '##core#declared-type) (when (pair? (cddr spec)) - (##sys#put! + (mark-variable name '##core#specializations (##sys#strip-syntax (cddr spec))))) (else - (warning "illegal type declaration" (##sys#strip-syntax spec))))))) + (warning + "illegal type declaration" + (##sys#strip-syntax spec))))))) (cdr spec))) ((unsafe-specialized-arithmetic) (set! unchecked-specialized-arithmetic #t)) diff --git a/scrutinizer.scm b/scrutinizer.scm index a785b4ed..4aac1a35 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -745,26 +745,62 @@ (copy-node! (build-node-graph (subst template)) node))) (define (validate-type type name) + ;; - returns converted type or #f + ;; - also converts "(... -> ...)" types + (define (upto lst p) + (let loop ((lst lst)) + (cond ((eq? lst p) '()) + (else (cons (car lst) (loop (cdr lst))))))) (define (validate t) (cond ((memq t '(* string symbol char number boolean list pair procedure vector null eof undefined port blob - pointer locative fixnum float pointer-vector deprecated))) - ((not (pair? t)) #f) + pointer locative fixnum float pointer-vector + deprecated)) + t) + ((not (pair? t)) t) ((eq? 'or (car t)) (and (list t) - (every validate (cdr t)))) + (let ((ts (map validate (cdr t)))) + (and (every identity ts) + `(or ,@ts))))) ((eq? 'struct (car t)) - (and (= 2 (length t)) (symbol? (cadr t)))) + (and (= 2 (length t)) + (symbol? (cadr t)) + t)) ((eq? 'procedure (car t)) (and (pair? (cdr t)) - (let ((t (if (symbol? (cadr t)) (cddr t) (cdr t)))) - (and (pair? t) - (list? (car t)) - (every - validate - (remove (cut memq <> '(#!optional #!rest values)) (car t))) - (or (eq? '* (cddr t)) - (and (list? (cddr t)) - (every validate (cddr t)))))))) + (let* ((name (if (symbol? (cadr t)) + (cadr t) + name)) + (t2 (if (symbol? (cadr t)) (cddr t) (cdr t)))) + (and (pair? t2) + (list? (car t2)) + (let ((ts (map (lambda (x) + (if (memq + x + '(#!optional #!rest values)) + x + (validate x))) + (car t2)))) + (and (every identity ts) + (let ((rt (if (eq? '* (cddr t2)) + (cddr t2) + (and (list? (cddr t2)) + (let ((rts + (map + validate + (cddr t2)))) + (and (every identity rts) + rts)))))) + (and rt + `(procedure + ,@(if name (list name) '()) + ,ts + ,@rt))))))))) + ((and (pair? (cdr t)) (memq '-> (cadr t))) => + (lambda (p) + (validate + `(procedure ,(upto t p) ,@(cdr p)) + name))) (else #f))) (validate type))Trap