|
232 | 232 | ;; Pat Expr CEnv GEnv Symbol Bool -> Asm |
233 | 233 | (define (compile-match-clause p e c g done t?) |
234 | 234 | (let ((next (gensym))) |
235 | | - (match (compile-pattern p '() next) |
| 235 | + (match (compile-pattern p c g '() next) |
236 | 236 | [(list i f cm) |
237 | 237 | (seq (Mov rax (Offset rsp 0)) ; restore value being matched |
238 | 238 | i |
|
242 | 242 | f |
243 | 243 | (Label next))]))) |
244 | 244 |
|
245 | | -;; Pat CEnv Symbol -> (list Asm Asm CEnv) |
246 | | -(define (compile-pattern p cm next) |
| 245 | +;; Pat CEnv GEnv CEnv Symbol -> (list Asm Asm CEnv) |
| 246 | +(define (compile-pattern p c g cm next) |
247 | 247 | (match p |
248 | 248 | [(PWild) |
249 | 249 | (list (seq) (seq) cm)] |
|
287 | 287 | (Jmp next)) |
288 | 288 | cm))] |
289 | 289 | [(PAnd p1 p2) |
290 | | - (match (compile-pattern p1 (cons #f cm) next) |
| 290 | + (match (compile-pattern p1 c g (cons #f cm) next) |
291 | 291 | [(list i1 f1 cm1) |
292 | | - (match (compile-pattern p2 cm1 next) |
| 292 | + (match (compile-pattern p2 c g cm1 next) |
293 | 293 | [(list i2 f2 cm2) |
294 | 294 | (list |
295 | 295 | (seq (Push rax) |
|
299 | 299 | (seq f1 f2) |
300 | 300 | cm2)])])] |
301 | 301 | [(PBox p) |
302 | | - (match (compile-pattern p cm next) |
| 302 | + (match (compile-pattern p c g cm next) |
303 | 303 | [(list i1 f1 cm1) |
304 | 304 | (let ((fail (gensym))) |
305 | 305 | (list |
|
316 | 316 | (Jmp next)) |
317 | 317 | cm1))])] |
318 | 318 | [(PCons p1 p2) |
319 | | - (match (compile-pattern p1 (cons #f cm) next) |
| 319 | + (match (compile-pattern p1 c g (cons #f cm) next) |
320 | 320 | [(list i1 f1 cm1) |
321 | | - (match (compile-pattern p2 cm1 next) |
| 321 | + (match (compile-pattern p2 c g cm1 next) |
322 | 322 | [(list i2 f2 cm2) |
323 | 323 | (let ((fail (gensym))) |
324 | 324 | (list |
|
340 | 340 | (Jmp next)) |
341 | 341 | cm2))])])] |
342 | 342 | [(PStruct n ps) |
343 | | - (match (compile-struct-patterns ps (cons #f cm) next 1) |
| 343 | + (match (compile-struct-patterns ps c g (cons #f cm) next 1) |
344 | 344 | [(list i f cm) |
345 | 345 | (let ((fail (gensym))) |
346 | 346 | (list |
|
359 | 359 | (Label fail) |
360 | 360 | (Add rsp (*8 (length cm))) |
361 | 361 | (Jmp next)) |
362 | | - cm))])])) |
| 362 | + cm))])] |
| 363 | + |
| 364 | + [(PPred e) |
| 365 | + (list |
| 366 | + (let ((r (gensym 'ret))) |
| 367 | + (seq (Lea r15 r) |
| 368 | + (Push r15) ; rp |
| 369 | + (Push rax) ; arg (saved for the moment) |
| 370 | + (compile-e e (list* #f #f c) g #f) |
| 371 | + (Pop r15) |
| 372 | + (Push rax) |
| 373 | + (Push r15) |
| 374 | + |
| 375 | + (assert-proc rax) |
| 376 | + (Xor rax type-proc) |
| 377 | + (Mov r15 1) |
| 378 | + (Mov rax (Offset rax 0)) |
| 379 | + (Jmp rax) |
| 380 | + (Label r) |
| 381 | + (Cmp rax val-false) |
| 382 | + (Je next))) |
| 383 | + (seq) |
| 384 | + cm)])) |
| 385 | + |
| 386 | + |
| 387 | + |
363 | 388 |
|
364 | 389 | ;; [Listof Pat] CEnv Symbol Nat -> (list Asm Asm CEnv) |
365 | | -(define (compile-struct-patterns ps cm next i) |
| 390 | +(define (compile-struct-patterns ps c g cm next i) |
366 | 391 | (match ps |
367 | 392 | ['() (list '() '() cm)] |
368 | 393 | [(cons p ps) |
369 | | - (match (compile-pattern p cm next) |
| 394 | + (match (compile-pattern p c g cm next) |
370 | 395 | [(list i1 f1 cm1) |
371 | | - (match (compile-struct-patterns ps cm1 next (add1 i)) |
| 396 | + (match (compile-struct-patterns ps c g cm1 next (add1 i)) |
372 | 397 | [(list is fs cmn) |
373 | 398 | (list |
374 | 399 | (seq (Mov rax (Offset rax (*8 i))) |
|
0 commit comments