Skip to content

Commit 386a91b

Browse files
committed
crook
1 parent fcf2339 commit 386a91b

8 files changed

Lines changed: 39 additions & 0 deletions

File tree

iniquity/compile.rkt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
(match d
4949
[(Defn f xs e)
5050
(seq (Label (symbol->label f))
51+
(Cmp r8 (length xs)) ; arity check
52+
(Jne 'err)
5153
(compile-e e (reverse xs))
5254
(Add rsp (* 8 (length xs))) ; pop args
5355
(Ret))]))
@@ -158,6 +160,7 @@
158160
(seq (Lea rax r)
159161
(Push rax)
160162
(compile-es es (cons #f c))
163+
(Mov r8 (length es)) ; pass arity info
161164
(Jmp (symbol->label f))
162165
(Label r))))
163166

iniquity/test/test-runner.rkt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,12 @@
201201
'(2 3 4))
202202
(check-equal? (run '(define (f x y) y)
203203
'(f 1 (add1 #f)))
204+
'err)
205+
(check-equal? (run '(define (f x y) y)
206+
'(f 1))
207+
'err)
208+
(check-equal? (run '(define (f x y) y)
209+
'(f 1 2 3))
204210
'err)))
205211

206212
(define (test/io run)

jig/compile.rkt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
(match d
4646
[(Defn f xs e)
4747
(seq (Label (symbol->label f))
48+
(Cmp r8 (length xs)) ; arity check
49+
(Jne 'err)
4850
(compile-e e (reverse xs) #t)
4951
(Add rsp (* 8 (length xs))) ; pop args
5052
(Ret))]))
@@ -160,6 +162,7 @@
160162
(seq (compile-es es c)
161163
(move-args (length es) (length c))
162164
(Add rsp (* 8 (length c)))
165+
(Mov r8 (length es)) ; pass arity info
163166
(Jmp (symbol->label f))))
164167

165168
;; Integer Integer -> Asm
@@ -176,6 +179,7 @@
176179
(seq (Lea rax r)
177180
(Push rax)
178181
(compile-es es (cons #f c))
182+
(Mov r8 (length es)) ; pass arity info
179183
(Jmp (symbol->label f))
180184
(Label r))))
181185

jig/test/test-runner.rkt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,12 @@
201201
'(2 3 4))
202202
(check-equal? (run '(define (f x y) y)
203203
'(f 1 (add1 #f)))
204+
'err)
205+
(check-equal? (run '(define (f x y) y)
206+
'(f 1))
207+
'err)
208+
(check-equal? (run '(define (f x y) y)
209+
'(f 1 2 3))
204210
'err)))
205211

206212
(define (test/io run)

knock/compile.rkt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
(match d
5151
[(Defn f xs e)
5252
(seq (Label (symbol->label f))
53+
(Cmp r8 (length xs)) ; arity check
54+
(Jne 'err)
5355
(compile-e e (reverse xs) #t)
5456
(Add rsp (* 8 (length xs))) ; pop args
5557
(Ret))]))
@@ -166,6 +168,7 @@
166168
(seq (compile-es es c)
167169
(move-args (length es) (length c))
168170
(Add rsp (* 8 (length c)))
171+
(Mov r8 (length es)) ; pass arity info
169172
(Jmp (symbol->label f))))
170173

171174
;; Integer Integer -> Asm
@@ -182,6 +185,7 @@
182185
(seq (Lea rax r)
183186
(Push rax)
184187
(compile-es es (cons #f c))
188+
(Mov r8 (length es)) ; pass arity info
185189
(Jmp (symbol->label f))
186190
(Label r))))
187191

knock/test/test-runner.rkt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,12 @@
201201
'(2 3 4))
202202
(check-equal? (run '(define (f x y) y)
203203
'(f 1 (add1 #f)))
204+
'err)
205+
(check-equal? (run '(define (f x y) y)
206+
'(f 1))
207+
'err)
208+
(check-equal? (run '(define (f x y) y)
209+
'(f 1 2 3))
204210
'err))
205211

206212
(begin ;; Knock

loot/compile.rkt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@
7777
[(Lam f xs e)
7878
(let ((env (append (reverse fvs) (reverse xs) (list #f))))
7979
(seq (Label (symbol->label f))
80+
(Cmp r8 (length xs))
81+
(Jne 'err)
8082
(Mov rax (Mem rsp (* 8 (length xs))))
8183
(copy-env-to-stack fvs 8)
8284
(compile-e e env #t)
@@ -210,6 +212,7 @@
210212
(Mov rax (Mem rsp (* 8 (length es))))
211213
(assert-proc rax)
212214
(Mov rax (Mem rax (- type-proc)))
215+
(Mov r8 (length es)) ; pass arity info
213216
(Jmp rax)))
214217

215218
;; Integer Integer -> Asm
@@ -233,6 +236,7 @@
233236
(Mov rax (Mem rsp i))
234237
(assert-proc rax)
235238
(Mov rax (Mem rax (- type-proc))) ; fetch the code label
239+
(Mov r8 (length es)) ; pass arity info
236240
(Jmp rax)
237241
(Label r))))
238242

loot/test/test-runner.rkt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,12 @@
201201
'(2 3 4))
202202
(check-equal? (run '(define (f x y) y)
203203
'(f 1 (add1 #f)))
204+
'err)
205+
(check-equal? (run '(define (f x y) y)
206+
'(f 1))
207+
'err)
208+
(check-equal? (run '(define (f x y) y)
209+
'(f 1 2 3))
204210
'err))
205211

206212
(begin ;; Knock

0 commit comments

Comments
 (0)