ref: 62d35d45d158769cefe5545c1fa5c46643cbe9ad
parent: 260b588d2228f593be128e9de725822b2ffac663
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Jun 10 17:18:13 EDT 2024
allow only uint16 to be used for indexing arrays
--- a/otf.rkt
+++ b/otf.rkt
@@ -11,6 +11,9 @@
(define types '()) ; base types set
(define cmplxs '()) ; complex types set
+; types allowed to be used as index
+(define-for-syntax (type-index? type) (member type '(uint16)))
+
(define size-in-bits/c
(make-contract #:name 'size-in-bits/c #:first-order (λ (x) (member x '(8 16 24 32 40 48 64)))))
@@ -148,9 +151,16 @@
[(_ ({~literal =} vs:number ...+)) #''(= vs ...)]
[(_ ({~literal count} n:id))
(begin
- (if (assoc (syntax->datum #`n) fields)
- #''(count n)
- (raise-syntax-error #f "no such field" stx #'n)))]
+ (define counter (assoc (syntax->datum #`n) fields))
+ (cond
+ [(pair? counter)
+ (if (type-index? (cadr counter))
+ #''(count n)
+ (raise-syntax-error #f
+ (~a "type " (cadr counter) " can't be used as index to the array")
+ stx
+ #'n))]
+ [else (raise-syntax-error #f "no such field" stx #'n)]))]
[(_ {~literal unused}) #''(unused #t)]))
(define-syntax (mkfield stx)