blob: 7bd9775cdda5a07e7923f824a8dc69ad3822ef69 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
(defpackage #:sarcasm.types
(:use #:cl)
(:export
#:i32 #:i64 #:f32 #:f64
#:numtype
#:typeidx
#:vectype
#:funcref
#:externref
#:reftype
#:valtype
#:stacksig))
(in-package #:sarcasm.types)
(deftype i32 ()
'(integer 0 #.(expt 2 32)))
(deftype i64 ()
'(integer 0 #. (expt 2 64)))
(deftype f32 ()
'single-float)
(deftype f64 ()
'double-float)
(deftype numtype ()
'(or i32 i64 f32 f64))
(deftype typeidx ()
'i32)
(deftype vectype ()
'(bit-vector 128))
(deftype funcref ()
't)
(deftype externref ()
't)
(deftype reftype ()
'(or funcref externref))
(deftype valtype ()
'(or numtype vectype reftype))
(defun stacksig-p (thing)
"A stack effect type is a two element list of lists of keywords.
It describes the types of values consumed off the stack and returned
to the stack by instructions."
(and (listp thing)
(= 2 (length thing))
(listp (first thing))
(listp (second thing))
(every #'keywordp (first thing))
(every #'keywordp (second thing))))
(deftype stacksig ()
"This is not part of the standard grammar, but appears implicitly in
the WASM table of instructions found
https://webassembly.github.io/spec/core/appendix/index-instructions.html
In the `Type` column."
'(satisfies stack-effect-type-p))
|