Add in basic element section

This commit is contained in:
Nathan Braswell
2021-08-01 00:23:41 -04:00
parent ee4a664660
commit dfde35ee79
2 changed files with 41 additions and 25 deletions

View File

@@ -21,7 +21,7 @@
(memory $mem 1) (memory $mem 1)
(global $gi i32 (i32.const 8)) (global $gi i32 (i32.const 8))
(global $gb (mut i64) (i64.const 9)) (global $gb (mut i64) (i64.const 9))
(table $tab 8 funcref) (table $tab 2 funcref)
;(table $tab2 8 16 funcref) ;(table $tab2 8 16 funcref)
(data (i32.const 16) "HellH") ;; adder to put, then data (data (i32.const 16) "HellH") ;; adder to put, then data
(func $start (func $start
@@ -82,6 +82,7 @@
) )
drop drop
) )
(elem (i32.const 0) $start $start)
(export "memory" (memory $mem)) (export "memory" (memory $mem))
(export "_start" (func $start)) (export "_start" (func $start))
(start $start) (start $start)

63
wasm.kp
View File

@@ -187,6 +187,14 @@
) (concat [0x06] (encode_u_LEB128 (len encoded)) encoded )) ) (concat [0x06] (encode_u_LEB128 (len encoded)) encoded ))
) )
; only supporting one type of element section for now, active funcrefs with offset
encode_element (lambda (x) (concat [0x00] (encode_expr (idx x 0)) (encode_vector encode_u_LEB128 (idx x 1))))
encode_element_section (lambda (x)
(let (
encoded (encode_vector encode_element x)
) (concat [0x09] (encode_u_LEB128 (len encoded)) encoded ))
)
encode_data (lambda (data) (cond (= 2 (len data)) (concat [0x00] (encode_expr (idx data 0)) (encode_bytes (idx data 1))) encode_data (lambda (data) (cond (= 2 (len data)) (concat [0x00] (encode_expr (idx data 0)) (encode_bytes (idx data 1)))
(= 1 (len data)) (concat [0x01] (encode_bytes (idx data 0))) (= 1 (len data)) (concat [0x01] (encode_bytes (idx data 0)))
(= 3 (len data)) (concat [0x02] (encode_u_LEB128 (idx data 0)) (encode_expr (idx data 1)) (encode_bytes (idx data 2))) (= 3 (len data)) (concat [0x02] (encode_u_LEB128 (idx data 0)) (encode_expr (idx data 1)) (encode_bytes (idx data 2)))
@@ -200,8 +208,8 @@
wasm_to_binary (lambda (wasm_code) wasm_to_binary (lambda (wasm_code)
(let ( (let (
(type_section import_section function_section table_section memory_section global_section export_section start_section code_section data_section) wasm_code (type_section import_section function_section table_section memory_section global_section export_section start_section element_section code_section data_section) wasm_code
_ (println "type_section" type_section "import_section" import_section "function_section" function_section "memory_section" memory_section "global_section" global_section "export_section" export_section "start_section" start_section "code_section" code_section "data_section" data_section) _ (println "type_section" type_section "import_section" import_section "function_section" function_section "memory_section" memory_section "global_section" global_section "export_section" export_section "start_section" start_section "element_section" element_section "code_section" code_section "data_section" data_section)
magic [ 0x00 0x61 0x73 0x6D ] magic [ 0x00 0x61 0x73 0x6D ]
version [ 0x01 0x00 0x00 0x00 ] version [ 0x01 0x00 0x00 0x00 ]
type (encode_type_section type_section) type (encode_type_section type_section)
@@ -212,28 +220,29 @@
global (encode_global_section global_section) global (encode_global_section global_section)
export (encode_export_section export_section) export (encode_export_section export_section)
start (encode_start_section start_section) start (encode_start_section start_section)
elem (encode_element_section element_section)
code (encode_code_section code_section) code (encode_code_section code_section)
data (encode_data_section data_section) data (encode_data_section data_section)
;data_count (let (body (encode_u_LEB128 (len data_section))) (concat [0x0C] (encode_u_LEB128 (len body)) body)) ;data_count (let (body (encode_u_LEB128 (len data_section))) (concat [0x0C] (encode_u_LEB128 (len body)) body))
data_count [] data_count []
) (concat magic version type import function table memory global export data_count start code data)) ) (concat magic version type import function table memory global export data_count start elem code data))
) )
module (lambda (& args) (let ( module (lambda (& args) (let (
helper (rec-lambda recurse (entries i name_dict type import function table memory global export start code data) helper (rec-lambda recurse (entries i name_dict type import function table memory global export start elem code data)
(if (= i (len entries)) [ type import function table memory global export start code data] (if (= i (len entries)) [ type import function table memory global export start elem code data]
(let ( (let (
(n_d t im f ta m g e s c d) ((idx entries i) name_dict type import function table memory global export start code data) (n_d t im f ta m g e s elm c d) ((idx entries i) name_dict type import function table memory global export start elem code data)
) (recurse entries (+ i 1) n_d t im f ta m g e s c d)))) ) (recurse entries (+ i 1) n_d t im f ta m g e s elm c d))))
) (helper args 0 empty_dict [] [] [] [] [] [] [] [] [] []))) ) (helper args 0 empty_dict [] [] [] [] [] [] [] [] [] [] [])))
table (vau de (idx_name & limits_type) (lambda (name_dict type import function table memory global export start code data) table (vau de (idx_name & limits_type) (lambda (name_dict type import function table memory global export start elem code data)
[ (put name_dict idx_name (len table)) type import function (concat table [[ (idx limits_type -1) (map (lambda (x) (eval x de)) (slice limits_type 0 -2)) ]]) memory global export start code data ])) [ (put name_dict idx_name (len table)) type import function (concat table [[ (idx limits_type -1) (map (lambda (x) (eval x de)) (slice limits_type 0 -2)) ]]) memory global export start elem code data ]))
memory (vau de (idx_name & limits) (lambda (name_dict type import function table memory global export start code data) memory (vau de (idx_name & limits) (lambda (name_dict type import function table memory global export start elem code data)
[ (put name_dict idx_name (len memory)) type import function table (concat memory [(map (lambda (x) (eval x de)) limits)]) global export start code data ])) [ (put name_dict idx_name (len memory)) type import function table (concat memory [(map (lambda (x) (eval x de)) limits)]) global export start elem code data ]))
func (vau de (name & inside) (lambda (name_dict type import function table memory global export start code data) func (vau de (name & inside) (lambda (name_dict type import function table memory global export start elem code data)
(let ( (let (
(params result locals body) ((rec-lambda recurse (i pe re) (params result locals body) ((rec-lambda recurse (i pe re)
(cond (and (= nil pe) (< i (len inside)) (array? (idx inside i)) (< 0 (len (idx inside i))) (= 'param (idx (idx inside i) 0))) (cond (and (= nil pe) (< i (len inside)) (array? (idx inside i)) (< 0 (len (idx inside i))) (= 'param (idx (idx inside i) 0)))
@@ -290,6 +299,8 @@
export export
; start ; start
start start
; element
elem
; code ; code
(concat code [ [ compressed_locals our_code ] ]) (concat code [ [ compressed_locals our_code ] ])
; data ; data
@@ -333,35 +344,39 @@
rest (flat_eval_ins flatten de) rest (flat_eval_ins flatten de)
) (concat rest [['br_if block_val]]))) ) (concat rest [['br_if block_val]])))
call (lambda (f & flatten) (concat (flat_map (lambda (x) x) flatten) [['call f]])) call (lambda (f & flatten) (concat (flat_map (lambda (x) x) flatten) [['call f]]))
import (vau de (mod_name name t_idx_typ) (lambda (name_dict type import function table memory global export start code data) (let ( import (vau de (mod_name name t_idx_typ) (lambda (name_dict type import function table memory global export start elem code data) (let (
_ (if (!= 'func (idx t_idx_typ 0)) (error "only supporting importing functions rn")) _ (if (!= 'func (idx t_idx_typ 0)) (error "only supporting importing functions rn"))
(import_type idx_name param_type result_type) t_idx_typ (import_type idx_name param_type result_type) t_idx_typ
actual_type_idx (len type) actual_type_idx (len type)
actual_type [ (slice param_type 1 -1) (slice result_type 1 -1) ] actual_type [ (slice param_type 1 -1) (slice result_type 1 -1) ]
) )
[ (put name_dict idx_name (len function)) (concat type [actual_type]) (concat import [ [mod_name name import_type actual_type_idx] ]) (concat function [nil]) table memory global export start code data ]) [ (put name_dict idx_name (len function)) (concat type [actual_type]) (concat import [ [mod_name name import_type actual_type_idx] ]) (concat function [nil]) table memory global export start elem code data ])
)) ))
global (vau de (idx_name global_type expr) (lambda (name_dict type import function table memory global export start code data) global (vau de (idx_name global_type expr) (lambda (name_dict type import function table memory global export start elem code data)
[ (put name_dict idx_name (len global)) [ (put name_dict idx_name (len global))
type import function table memory type import function table memory
(concat global [[(if (array? global_type) (reverse global_type) [global_type 'const]) (eval expr de) ]]) (concat global [[(if (array? global_type) (reverse global_type) [global_type 'const]) (eval expr de) ]])
export start code data ] export start elem code data ]
)) ))
export (vau de (name t_v) (lambda (name_dict type import function table memory global export start code data) export (vau de (name t_v) (lambda (name_dict type import function table memory global export start elem code data)
[ name_dict type import function table memory global (concat export [ [ name (idx t_v 0) (get-value name_dict (idx t_v 1)) ] ]) start code data ] [ name_dict type import function table memory global (concat export [ [ name (idx t_v 0) (get-value name_dict (idx t_v 1)) ] ]) start elem code data ]
)) ))
start (vau de (name) (lambda (name_dict type import function table memory global export start code data) start (vau de (name) (lambda (name_dict type import function table memory global export start elem code data)
[ name_dict type import function table memory global export (concat start [(get-value name_dict name)]) code data ] [ name_dict type import function table memory global export (concat start [(get-value name_dict name)]) elem code data ]
)) ))
data (lambda (& it) (lambda (name_dict type import function table memory global export start code data) elem (vau de (offset & entries) (lambda (name_dict type import function table memory global export start elem code data)
[name_dict type import function table memory global export start code (concat data [it])])) [ name_dict type import function table memory global export start (concat elem [[(eval offset de) (map (lambda (x) (get-value name_dict x)) entries)]]) code data ]
))
data (lambda (& it) (lambda (name_dict type import function table memory global export start elem code data)
[name_dict type import function table memory global export start elem code (concat data [it])]))
) )
(provide wasm_to_binary (provide wasm_to_binary
module import table memory start func global export data module import table memory start elem func global export data
drop i32.const i64.const local.get i32.add drop i32.const i64.const local.get i32.add
i32.load i64.load i32.load i64.load
i32.store i64.store i32.store i64.store