File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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))]))
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
Original file line number Diff line number Diff line change 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)
Original file line number Diff line number Diff line change 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))]))
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
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
Original file line number Diff line number Diff line change 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)
Original file line number Diff line number Diff line change 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))]))
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
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
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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 )
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
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
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments