Skip to content

Commit 3ec3f39

Browse files
committed
crook
1 parent d4c3a21 commit 3ec3f39

36 files changed

+975
-362
lines changed

iniquity-plus/assert.rkt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#lang racket
2+
(provide assert-integer assert-char assert-byte assert-codepoint
3+
assert-box assert-cons
4+
assert-natural assert-vector assert-string)
5+
(require a86/ast)
6+
(require "types.rkt")
7+
8+
(define r9 'r9)
9+
10+
(define (assert-type mask type)
11+
(λ (arg)
12+
(seq (Mov r9 arg)
13+
(And r9 mask)
14+
(Cmp r9 type)
15+
(Jne 'err))))
16+
17+
;; Register -> Asm
18+
19+
20+
(define assert-integer
21+
(assert-type mask-int type-int))
22+
23+
;; Register -> Asm
24+
25+
(define assert-char
26+
(assert-type mask-char type-char))
27+
(define assert-box
28+
(assert-type ptr-mask type-box))
29+
(define assert-cons
30+
(assert-type ptr-mask type-cons))
31+
(define assert-vector
32+
(assert-type ptr-mask type-vect))
33+
(define assert-string
34+
(assert-type ptr-mask type-str))
35+
36+
;; Register -> Asm
37+
(define (assert-codepoint r)
38+
(let ((ok (gensym)))
39+
(seq (assert-integer r)
40+
(Cmp r (value->bits 0))
41+
(Jl 'err)
42+
(Cmp r (value->bits 1114111))
43+
(Jg 'err)
44+
(Cmp r (value->bits 55295))
45+
(Jl ok)
46+
(Cmp r (value->bits 57344))
47+
(Jg ok)
48+
(Jmp 'err)
49+
(Label ok))))
50+
51+
;; Register -> Asm
52+
(define (assert-byte r)
53+
(seq (assert-integer r)
54+
(Cmp r (value->bits 0))
55+
(Jl 'err)
56+
(Cmp r (value->bits 255))
57+
(Jg 'err)))
58+
59+
;; Register -> Asm
60+
(define (assert-natural r)
61+
(seq (assert-integer r)
62+
(Cmp r (value->bits 0))
63+
(Jl 'err)))
64+

iniquity-plus/ast.rkt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
;; | (App Id (Listof Expr))
3131
;; | (Apply Id (Listof Expr) Expr)
3232

33+
;; type ClosedExpr = { e ∈ Expr | e contains no free variables }
34+
3335
;; type Id = Symbol
3436
;; type Datum = Integer
3537
;; | Boolean

iniquity-plus/compile-ops.rkt

Lines changed: 16 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
(provide compile-op0 compile-op1 compile-op2 compile-op3 pad-stack assert-cons)
33
(require "ast.rkt")
44
(require "types.rkt")
5+
(require "assert.rkt")
56
(require a86/ast)
67

78
(define rax 'rax)
@@ -44,15 +45,15 @@
4445
(Sar rax char-shift)
4546
(Sal rax int-shift))]
4647
['integer->char
47-
(seq (assert-codepoint)
48+
(seq (assert-codepoint rax)
4849
(Sar rax int-shift)
4950
(Sal rax char-shift)
5051
(Xor rax type-char))]
5152
['eof-object?
5253
(seq (Cmp rax (value->bits eof))
5354
if-equal)]
5455
['write-byte
55-
(seq assert-byte
56+
(seq (assert-byte rax)
5657
pad-stack
5758
(Mov rdi rax)
5859
(Call 'write_byte)
@@ -64,16 +65,13 @@
6465
(Add rbx 8))]
6566
['unbox
6667
(seq (assert-box rax)
67-
(Xor rax type-box)
68-
(Mov rax (Offset rax 0)))]
68+
(Mov rax (Offset rax (- type-box))))]
6969
['car
7070
(seq (assert-cons rax)
71-
(Xor rax type-cons)
72-
(Mov rax (Offset rax 8)))]
71+
(Mov rax (Offset rax (- 8 type-cons))))]
7372
['cdr
7473
(seq (assert-cons rax)
75-
(Xor rax type-cons)
76-
(Mov rax (Offset rax 0)))]
74+
(Mov rax (Offset rax (- type-cons))))]
7775

7876
['empty? (seq (Cmp rax (value->bits '())) if-equal)]
7977
['cons? (type-pred ptr-mask type-cons)]
@@ -84,10 +82,9 @@
8482
(let ((zero (gensym))
8583
(done (gensym)))
8684
(seq (assert-vector rax)
87-
(Xor rax type-vect)
88-
(Cmp rax 0)
85+
(Cmp rax type-vect)
8986
(Je zero)
90-
(Mov rax (Offset rax 0))
87+
(Mov rax (Offset rax (- type-vect)))
9188
(Sal rax int-shift)
9289
(Jmp done)
9390
(Label zero)
@@ -97,10 +94,9 @@
9794
(let ((zero (gensym))
9895
(done (gensym)))
9996
(seq (assert-string rax)
100-
(Xor rax type-str)
101-
(Cmp rax 0)
97+
(Cmp rax type-str)
10298
(Je zero)
103-
(Mov rax (Offset rax 0))
99+
(Mov rax (Offset rax (- type-str)))
104100
(Sal rax int-shift)
105101
(Jmp done)
106102
(Label zero)
@@ -270,71 +266,25 @@
270266
(Mov (Offset r8 8) rax)
271267
(Mov rax (value->bits (void))))]))
272268

269+
(define (type-pred mask type)
270+
(seq (And rax mask)
271+
(Cmp rax type)
272+
if-equal))
273273

274-
;; -> Asm
274+
;; Asm
275275
;; set rax to #t or #f if comparison flag is equal
276276
(define if-equal
277277
(seq (Mov rax (value->bits #f))
278278
(Mov r9 (value->bits #t))
279279
(Cmove rax r9)))
280280

281-
;; -> Asm
281+
;; Asm
282282
;; set rax to #t or #f if comparison flag is less than
283283
(define if-lt
284284
(seq (Mov rax (value->bits #f))
285285
(Mov r9 (value->bits #t))
286286
(Cmovl rax r9)))
287287

288-
(define (assert-type mask type)
289-
(λ (arg)
290-
(seq (Mov r9 arg)
291-
(And r9 mask)
292-
(Cmp r9 type)
293-
(Jne 'err))))
294-
295-
(define (type-pred mask type)
296-
(seq (And rax mask)
297-
(Cmp rax type)
298-
if-equal))
299-
300-
(define assert-integer
301-
(assert-type mask-int type-int))
302-
(define assert-char
303-
(assert-type mask-char type-char))
304-
(define assert-box
305-
(assert-type ptr-mask type-box))
306-
(define assert-cons
307-
(assert-type ptr-mask type-cons))
308-
(define assert-vector
309-
(assert-type ptr-mask type-vect))
310-
(define assert-string
311-
(assert-type ptr-mask type-str))
312-
313-
(define (assert-codepoint)
314-
(let ((ok (gensym)))
315-
(seq (assert-integer rax)
316-
(Cmp rax (value->bits 0))
317-
(Jl 'err)
318-
(Cmp rax (value->bits 1114111))
319-
(Jg 'err)
320-
(Cmp rax (value->bits 55295))
321-
(Jl ok)
322-
(Cmp rax (value->bits 57344))
323-
(Jg ok)
324-
(Jmp 'err)
325-
(Label ok))))
326-
327-
(define assert-byte
328-
(seq (assert-integer rax)
329-
(Cmp rax (value->bits 0))
330-
(Jl 'err)
331-
(Cmp rax (value->bits 255))
332-
(Jg 'err)))
333-
334-
(define (assert-natural r)
335-
(seq (assert-integer r)
336-
(Cmp r (value->bits 0))
337-
(Jl 'err)))
338288

339289
;; Asm
340290
;; Dynamically pad the stack to be aligned for a call

iniquity-plus/compile-stdin.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@
1010
;; emit asm code on stdout
1111
(define (main)
1212
(read-line) ; ignore #lang racket line
13-
(asm-display (compile (apply parse (read-all)))))
13+
(asm-display (compile (apply parse-closed (read-all)))))
1414

iniquity-plus/compile.rkt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
#lang racket
2-
(provide (all-defined-out))
2+
(provide compile
3+
compile-e
4+
compile-es
5+
compile-define)
6+
37
(require "ast.rkt")
48
(require "compile-ops.rkt")
59
(require "types.rkt")

iniquity-plus/correct.rkt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#lang racket
2+
(provide check-compiler)
3+
(require rackunit)
4+
(require "interp-io.rkt")
5+
(require "exec-io.rkt")
6+
;; ClosedExpr String -> Void
7+
(define (check-compiler e i)
8+
(check-equal? (interp/io e i)
9+
(exec/io e i)))
10+

iniquity-plus/env.rkt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#lang racket
2+
(provide lookup ext)
3+
4+
;; Env Variable -> Answer
5+
(define (lookup env x)
6+
(match env
7+
['() 'err]
8+
[(cons (list y i) env)
9+
(match (symbol=? x y)
10+
[#t i]
11+
[#f (lookup env x)])]))
12+
13+
;; Env Variable Value -> Value
14+
(define (ext r x i)
15+
(cons (list x i) r))
16+

iniquity-plus/exec-io.rkt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#lang racket
2+
(require a86/interp)
3+
(require "compile.rkt")
4+
(require "types.rkt")
5+
(require "build-runtime.rkt")
6+
(provide exec/io)
7+
;; Prog String -> (cons Answer String)
8+
(define (exec/io p in)
9+
(parameterize ((current-objs (list (path->string runtime-path))))
10+
(match (asm-interp/io (compile p) in)
11+
[(cons 'err o) (cons 'err o)]
12+
[(cons b o) (cons (bits->value b) o)])))
13+

iniquity-plus/exec.rkt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#lang racket
2+
(require a86/interp)
3+
(require "compile.rkt")
4+
(require "types.rkt")
5+
(require "build-runtime.rkt")
6+
(provide exec)
7+
;; Prog -> Answer
8+
(define (exec p)
9+
(parameterize ((current-objs (list (path->string runtime-path))))
10+
(match (asm-interp (compile p))
11+
['err 'err]
12+
[b (bits->value b)])))
13+

iniquity-plus/interp-io.rkt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
#lang racket
22
(provide interp/io)
33
(require "interp.rkt")
4-
;; String Prog -> (Cons Value String)
4+
;; String Prog -> (Cons Answer String)
55
;; Interpret p with given string as input,
6-
;; return value and collected output as string
6+
;; return answer and collected output as string
77
(define (interp/io p input)
8-
(parameterize ((current-output-port (open-output-string))
9-
(current-input-port (open-input-string input)))
10-
(cons (interp p)
11-
(get-output-string (current-output-port)))))
8+
(define result (box #f))
9+
(define output
10+
(with-input-from-string input
11+
(λ ()
12+
(with-output-to-string
13+
(λ ()
14+
(set-box! result (interp p)))))))
15+
(cons (unbox result) output))
1216

0 commit comments

Comments
 (0)