Skip to content

Commit abda0a9

Browse files
committed
Simplified pattern matching from lecture.
1 parent 957331d commit abda0a9

File tree

1 file changed

+23
-30
lines changed

1 file changed

+23
-30
lines changed

langs/knock/compile.rkt

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -218,84 +218,77 @@
218218
(define (compile-match-clause p e c done t?)
219219
(let ((next (gensym)))
220220
(match (compile-pattern p '() next)
221-
[(list i f cm)
221+
[(list i cm)
222222
(seq (Mov rax (Offset rsp 0)) ; restore value being matched
223223
i
224224
(compile-e e (append cm c) t?)
225225
(Add rsp (* 8 (length cm)))
226226
(Jmp done)
227-
f
228227
(Label next))])))
229228

230-
;; Pat CEnv Symbol -> (list Asm Asm CEnv)
229+
;; Pat CEnv Symbol -> (list Asm CEnv)
231230
(define (compile-pattern p cm next)
232231
(match p
233232
[(PWild)
234-
(list (seq) (seq) cm)]
233+
(list (seq) cm)]
235234
[(PVar x)
236-
(list (seq (Push rax))
237-
(seq)
238-
(cons x cm))]
235+
(list (seq (Push rax)) (cons x cm))]
239236
[(PLit l)
240-
(let ((fail (gensym)))
237+
(let ((ok (gensym)))
241238
(list (seq (Cmp rax (value->bits l))
242-
(Jne fail))
243-
(seq (Label fail)
239+
(Je ok)
244240
(Add rsp (* 8 (length cm)))
245-
(Jmp next))
241+
(Jmp next)
242+
(Label ok))
246243
cm))]
247244
[(PAnd p1 p2)
248245
(match (compile-pattern p1 (cons #f cm) next)
249-
[(list i1 f1 cm1)
246+
[(list i1 cm1)
250247
(match (compile-pattern p2 cm1 next)
251-
[(list i2 f2 cm2)
248+
[(list i2 cm2)
252249
(list
253250
(seq (Push rax)
254251
i1
255252
(Mov rax (Offset rsp (* 8 (- (sub1 (length cm1)) (length cm)))))
256253
i2)
257-
(seq f1 f2)
258254
cm2)])])]
259255
[(PBox p)
260256
(match (compile-pattern p cm next)
261-
[(list i1 f1 cm1)
262-
(let ((fail (gensym)))
257+
[(list i1 cm1)
258+
(let ((ok (gensym)))
263259
(list
264260
(seq (Mov r8 rax)
265261
(And r8 ptr-mask)
266262
(Cmp r8 type-box)
267-
(Jne fail)
263+
(Je ok)
264+
(Add rsp (* 8 (length cm))) ; haven't pushed anything yet
265+
(Jmp next)
266+
(Label ok)
268267
(Xor rax type-box)
269268
(Mov rax (Offset rax 0))
270269
i1)
271-
(seq f1
272-
(Label fail)
273-
(Add rsp (* 8 (length cm))) ; haven't pushed anything yet
274-
(Jmp next))
275270
cm1))])]
276271
[(PCons p1 p2)
277272
(match (compile-pattern p1 (cons #f cm) next)
278-
[(list i1 f1 cm1)
273+
[(list i1 cm1)
279274
(match (compile-pattern p2 cm1 next)
280-
[(list i2 f2 cm2)
281-
(let ((fail (gensym)))
275+
[(list i2 cm2)
276+
(let ((ok (gensym)))
282277
(list
283278
(seq (Mov r8 rax)
284279
(And r8 ptr-mask)
285280
(Cmp r8 type-cons)
286-
(Jne fail)
281+
(Je ok)
282+
(Add rsp (* 8 (length cm))) ; haven't pushed anything yet
283+
(Jmp next)
284+
(Label ok)
287285
(Xor rax type-cons)
288286
(Mov r8 (Offset rax 0))
289287
(Push r8) ; push cdr
290288
(Mov rax (Offset rax 8)) ; mov rax car
291289
i1
292290
(Mov rax (Offset rsp (* 8 (- (sub1 (length cm1)) (length cm)))))
293291
i2)
294-
(seq f1
295-
f2
296-
(Label fail)
297-
(Add rsp (* 8 (length cm))) ; haven't pushed anything yet
298-
(Jmp next))
299292
cm2))])])]))
300293

301294
;; Id CEnv -> Integer

0 commit comments

Comments
 (0)