~ 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