Skip to content

Commit c4e5a17

Browse files
committed
crook
1 parent 30f8a88 commit c4e5a17

File tree

14 files changed

+178
-116
lines changed

14 files changed

+178
-116
lines changed

iniquity-plus/assert.rkt

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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+
26+
(define assert-char
27+
(assert-type mask-char type-char))
28+
29+
30+
31+
32+
(define assert-box
33+
(assert-type ptr-mask type-box))
34+
(define assert-cons
35+
(assert-type ptr-mask type-cons))
36+
(define assert-vector
37+
(assert-type ptr-mask type-vect))
38+
(define assert-string
39+
(assert-type ptr-mask type-str))
40+
41+
;; Register -> Asm
42+
(define (assert-codepoint r)
43+
(let ((ok (gensym)))
44+
(seq (assert-integer r)
45+
(Cmp r (value->bits 0))
46+
(Jl 'err)
47+
(Cmp r (value->bits 1114111))
48+
(Jg 'err)
49+
(Cmp r (value->bits 55295))
50+
(Jl ok)
51+
(Cmp r (value->bits 57344))
52+
(Jg ok)
53+
(Jmp 'err)
54+
(Label ok))))
55+
56+
;; Register -> Asm
57+
(define (assert-byte r)
58+
(seq (assert-integer r)
59+
(Cmp r (value->bits 0))
60+
(Jl 'err)
61+
(Cmp r (value->bits 255))
62+
(Jg 'err)))
63+
64+
;; Register -> Asm
65+
(define (assert-natural r)
66+
(seq (assert-integer r)
67+
(Cmp r (value->bits 0))
68+
(Jl 'err)))
69+

iniquity-plus/compile-ops.rkt

Lines changed: 9 additions & 54 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)
@@ -270,71 +271,25 @@
270271
(Mov (Offset r8 8) rax)
271272
(Mov rax (value->bits (void))))]))
272273

274+
(define (type-pred mask type)
275+
(seq (And rax mask)
276+
(Cmp rax type)
277+
if-equal))
273278

274-
;; -> Asm
279+
;; Asm
275280
;; set rax to #t or #f if comparison flag is equal
276281
(define if-equal
277282
(seq (Mov rax (value->bits #f))
278283
(Mov r9 (value->bits #t))
279284
(Cmove rax r9)))
280285

281-
;; -> Asm
286+
;; Asm
282287
;; set rax to #t or #f if comparison flag is less than
283288
(define if-lt
284289
(seq (Mov rax (value->bits #f))
285290
(Mov r9 (value->bits #t))
286291
(Cmovl rax r9)))
287292

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)))
338293

339294
;; Asm
340295
;; Dynamically pad the stack to be aligned for a call

iniquity-plus/exec-io.rkt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#lang racket
22
(require a86/interp)
33
(require "compile.rkt")
4-
(require "interp-io.rkt")
54
(require "types.rkt")
65
(require "build-runtime.rkt")
76
(provide exec/io)

iniquity-plus/exec.rkt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#lang racket
22
(require a86/interp)
33
(require "compile.rkt")
4-
(require "interp.rkt")
54
(require "types.rkt")
65
(require "build-runtime.rkt")
76
(provide exec)

iniquity-plus/interp-io.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
(require "interp.rkt")
44
;; String Prog -> (Cons Value 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)
88
(define result (box #f))
99
(define output

iniquity-plus/interp.rkt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
;; | (string Character ...)
1717
;; | (vector Value ...)
1818

19+
;; type Answer = Value | 'err
20+
1921
;; type Env = (Listof (List Id Value))
2022
;; Prog -> Answer
2123
(define (interp p)

iniquity-plus/main.rkt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,19 @@
22
(require "ast.rkt")
33
(require "parse.rkt")
44
(require "interp.rkt")
5+
(require "interp-io.rkt")
56
(require "compile.rkt")
7+
(require "types.rkt")
68
(require "run.rkt")
9+
(require "exec.rkt")
10+
(require "exec-io.rkt")
711
(provide (all-from-out "ast.rkt"))
812
(provide (all-from-out "parse.rkt"))
913
(provide (all-from-out "interp.rkt"))
14+
(provide (all-from-out "interp-io.rkt"))
1015
(provide (all-from-out "compile.rkt"))
16+
(provide (all-from-out "types.rkt"))
1117
(provide (all-from-out "run.rkt"))
12-
18+
(provide (all-from-out "exec.rkt"))
19+
(provide (all-from-out "exec-io.rkt"))
1320

knock-plus/assert.rkt

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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+
26+
(define assert-char
27+
(assert-type mask-char type-char))
28+
29+
30+
31+
32+
(define assert-box
33+
(assert-type ptr-mask type-box))
34+
(define assert-cons
35+
(assert-type ptr-mask type-cons))
36+
(define assert-vector
37+
(assert-type ptr-mask type-vect))
38+
(define assert-string
39+
(assert-type ptr-mask type-str))
40+
41+
;; Register -> Asm
42+
(define (assert-codepoint r)
43+
(let ((ok (gensym)))
44+
(seq (assert-integer r)
45+
(Cmp r (value->bits 0))
46+
(Jl 'err)
47+
(Cmp r (value->bits 1114111))
48+
(Jg 'err)
49+
(Cmp r (value->bits 55295))
50+
(Jl ok)
51+
(Cmp r (value->bits 57344))
52+
(Jg ok)
53+
(Jmp 'err)
54+
(Label ok))))
55+
56+
;; Register -> Asm
57+
(define (assert-byte r)
58+
(seq (assert-integer r)
59+
(Cmp r (value->bits 0))
60+
(Jl 'err)
61+
(Cmp r (value->bits 255))
62+
(Jg 'err)))
63+
64+
;; Register -> Asm
65+
(define (assert-natural r)
66+
(seq (assert-integer r)
67+
(Cmp r (value->bits 0))
68+
(Jl 'err)))
69+

0 commit comments

Comments
 (0)