~ chicken-core (chicken-5) 033859fd4f9b0c4393a7c7501f8ebd433c3db944
commit 033859fd4f9b0c4393a7c7501f8ebd433c3db944
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Jun 24 19:05:44 2011 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Fri Jun 24 19:05:44 2011 +0200
validate types in define-specialization
diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index a1200aa6..c7f43ac1 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -503,7 +503,7 @@
(cond ((null? clauses)
'(##core#undefined) )
((not (pair? clauses))
- (##sys#syntax-error 'select "invalid syntax" clauses))
+ (syntax-error 'select "invalid syntax" clauses))
(else
(let ((clause (##sys#slot clauses 0))
(rclauses (##sys#slot clauses 1)) )
@@ -1142,7 +1142,7 @@
(let ((name (##sys#strip-syntax (cadr x)))
(%quote (r 'quote)))
(when (eq? '* name)
- (##sys#syntax-error-hook
+ (syntax-error-hook
'define-interface "`*' is not allowed as a name for an interface"))
`(,(r 'begin-for-syntax)
(##sys#register-interface
@@ -1153,7 +1153,7 @@
((list? exps)
(##sys#validate-exports exps 'define-interface))
(else
- (##sys#syntax-error-hook
+ (syntax-error-hook
'define-interface "invalid exports" (caddr x))))))))))))
@@ -1231,8 +1231,17 @@
(##sys#append
(list
(cons atypes
- (if rtypes
- (list rtypes spec)
+ (if (and rtypes (pair? rtypes))
+ (list
+ (map (lambda (rt)
+ (let-values (((t _)
+ (##compiler#validate-type rt #f)))
+ (or t
+ (syntax-error
+ 'define-specialization
+ "invalid result type" t))))
+ rtypes)
+ spec)
(list spec))))
(or (##compiler#variable-mark
name '##compiler#local-specializations)
@@ -1249,9 +1258,16 @@
(cond ((symbol? arg)
(loop (cdr args) (cons arg anames) (cons '* atypes)))
((and (list? arg) (fx= 2 (length arg)) (symbol? (car arg)))
- (loop (cdr args) (cons (car arg) anames)
- (cons (cadr arg) atypes)))
- (else (##sys#syntax-error
+ (let-values (((t _) (##compiler#validate-type (cadr arg) #f)))
+ (if t
+ (loop
+ (cdr args)
+ (cons (car arg) anames)
+ (cons t atypes))
+ (syntax-error
+ 'define-specialization
+ "invalid argument type" arg head))))
+ (else (syntax-error
'define-specialization
"invalid argument syntax" arg head)))))))))))))
Trap