47 lines
1.3 KiB
Plaintext
47 lines
1.3 KiB
Plaintext
|
|
|
||
|
|
(let (
|
||
|
|
; Vectors and Values
|
||
|
|
; Bytes encode themselves
|
||
|
|
encode_u_LEB128 (rec-lambda recurse (x)
|
||
|
|
(cond (< x 0x80) [x]
|
||
|
|
true (cons (| (& x 0x7F) 0x1) (recurse (>> x 8))))
|
||
|
|
)
|
||
|
|
encode_s8_LEB128 (lambda (x) (encode_u_LEB128 (& x 255)))
|
||
|
|
encode_vector (lambda (enc v)
|
||
|
|
(concat (encode_u_LEB128 (len v)) (flat_map enc v) )
|
||
|
|
)
|
||
|
|
encode_floating_point (lambda (x) (error "unimplemented"))
|
||
|
|
encode_name (lambda (name)
|
||
|
|
(encode_vector (lambda (x) [x]) name)
|
||
|
|
)
|
||
|
|
|
||
|
|
; Types
|
||
|
|
; TODO
|
||
|
|
encode_limits (lambda (x)
|
||
|
|
(cond (= 1 (len x)) (concat [0x00] (encode_u_LEB128 (idx x 0)))
|
||
|
|
(= 2 (len x)) (concat [0x01] (encode_u_LEB128 (idx x 0)) (encode_u_LEB128 (idx x 1)))
|
||
|
|
true (error "trying to encode bad limits"))
|
||
|
|
)
|
||
|
|
|
||
|
|
; Instructions
|
||
|
|
; TODO
|
||
|
|
|
||
|
|
; Modules
|
||
|
|
encode_memory_section (lambda (x)
|
||
|
|
(let (
|
||
|
|
encoded (encode_vector encode_limits x)
|
||
|
|
) (concat [0x05] (encode_u_LEB128 (len encoded)) encoded ))
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
wasm_to_binary (lambda (wasm_code)
|
||
|
|
(let (
|
||
|
|
magic [ 0x00 0x61 0x73 0x6D ]
|
||
|
|
version [ 0x01 0x00 0x00 0x00 ]
|
||
|
|
memory (encode_memory_section [ [0x20 0x30] ])
|
||
|
|
) (concat magic version memory))
|
||
|
|
)
|
||
|
|
)
|
||
|
|
(provide wasm_to_binary)
|
||
|
|
)
|