shithub: fnt

Download patch

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)