summaryrefslogtreecommitdiff
path: root/src/types.lisp
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))