diff --git a/comp_wasm.kp b/comp_wasm.kp index 5881e98..e72e296 100644 --- a/comp_wasm.kp +++ b/comp_wasm.kp @@ -4,48 +4,59 @@ (_ _ out) (cond (!= (len *ARGV*) 3) (error "wrong number of params to comp_wasm (please provide out)") true *ARGV*) _ (println "out" out) - wasm_code (module - (import "wasi_unstable" "fd_write" (func $fd_write (param i32 i32 i32 i32) (result i32))) - (memory $mem 1) - (data (i32.const 16) "HellH") ;; adder to put, then data - (func $add (param $num i32) (result i32) - (local $tmp1 i32) - (local $tmp2 i32) - (block $test - (i32.const 1337) - (i32.const 1338) + wasm_code + (module + (import "wasi_unstable" "path_open" + (func $path_open (param i32 i32 i32 i32 i32 i64 i64 i32 i32) + (result i32))) + (import "wasi_unstable" "fd_prestat_dir_name" + (func $fd_prestat_dir_name (param i32 i32 i32) + (result i32))) + (import "wasi_unstable" "fd_read" + (func $fd_read (param i32 i32 i32 i32) + (result i32))) + (import "wasi_unstable" "fd_write" + (func $fd_write (param i32 i32 i32 i32) + (result i32))) + (memory $mem 1) + (data (i32.const 16) "HellH") ;; adder to put, then data + (func $start (i32.store (i32.const 8) (i32.const 16)) ;; adder of data - (i32.load (i32.const 8)) - (i64.store (i32.const 8) (i64.const 16)) ;; adder of data - (i64.load (i32.const 8)) - drop - drop - drop - (block $inner_test - (br $inner_test) - (br $test) - ) - (br $test) + (i32.store (i32.const 12) (i32.const 5)) ;; len of data + ;; open file + (call $path_open + (i32.const 3) ;; file descriptor + (i32.const 0) ;; lookup flags + (i32.const 16) ;; path string * + (i32.load (i32.const 12)) ;; path string len + (i32.const 1) ;; o flags + (i64.const 66) ;; base rights + (i64.const 66) ;; inheriting rights + (i32.const 0) ;; fdflags + (i32.const 4) ;; opened fd out ptr + ) drop - (call $fd_write + (call $fd_read (i32.const 0) ;; file descriptor (i32.const 8) ;; *iovs (i32.const 1) ;; iovs_len + (i32.const 12) ;; nwritten, overwrite buf len with it + ) + drop + + ;; print name + (call $fd_write + (i32.load (i32.const 4)) ;; file descriptor + (i32.const 8) ;; *iovs + (i32.const 1) ;; iovs_len (i32.const 4) ;; nwritten ) drop - ) - (i32.const 11) - (local.get $tmp2) - i32.add - (i32.add (local.get $num)) + ) + (export "memory" (memory $mem)) + (export "_start" (func $start)) ) - ; nothing - (export "add" (func $add)) - ) - - _ (write_file out (wasm_to_binary wasm_code)) return_code 0 ) return_code )) diff --git a/wasm.kp b/wasm.kp index a42b371..708a731 100644 --- a/wasm.kp +++ b/wasm.kp @@ -3,14 +3,16 @@ ; Vectors and Values ; Bytes encode themselves - encode_u_LEB128 (rec-lambda recurse (x) - (cond (< x 0x80) [x] - true (cons (| (& x 0x7F) 0x80) (recurse (>> x 7)))) + encode_LEB128_helper (rec-lambda recurse (allow_neg x) + (cond (and allow_neg (< x 0x80)) [x] + (< x 0x40) [x] + true (cons (| (& x 0x7F) 0x80) (recurse true (>> x 7)))) ) - encode_s8_LEB128 (lambda (x) (encode_u_LEB128 (& x 0xFF))) - encode_s32_LEB128 (lambda (x) (encode_u_LEB128 (& x 0xFFFFFFFF))) - encode_s33_LEB128 (lambda (x) (encode_u_LEB128 (& x 0x1FFFFFFFF))) - encode_s64_LEB128 (lambda (x) (encode_u_LEB128 (& x 0xFFFFFFFFFFFFFFFF))) + encode_u_LEB128 (lambda (x) (encode_LEB128_helper true x)) + encode_s8_LEB128 (lambda (x) (encode_LEB128_helper (< x 0) (& x 0xFF))) + encode_s32_LEB128 (lambda (x) (encode_LEB128_helper (< x 0) (& x 0xFFFFFFFF))) + encode_s33_LEB128 (lambda (x) (encode_LEB128_helper (< x 0) (& x 0x1FFFFFFFF))) + encode_s64_LEB128 (lambda (x) (encode_LEB128_helper (< x 0) (& x 0xFFFFFFFFFFFFFFFF))) encode_vector (lambda (enc v) (concat (encode_u_LEB128 (len v)) (flat_map enc v) ) ) @@ -59,7 +61,7 @@ (encode_name name) (cond (= type 'func) (concat [0x00] (encode_u_LEB128 idx)) (= type 'table) (concat [0x01] (error "can't encode table type")) - (= type 'mem) (concat [0x02] (error "can't encode mem type")) + (= type 'memory) (concat [0x02] (error "can't encode memory type")) (= type 'global) (concat [0x03] (error "can't encode global type")) true (error (str "bad import type" type)))) ) @@ -80,7 +82,7 @@ ) (concat (encode_name name) (cond (= type 'func) [0x00] (= type 'table) [0x01] - (= type 'mem) [0x02] + (= type 'memory) [0x02] (= type 'global) [0x03] true (error "bad export type")) (encode_u_LEB128 idx) @@ -202,7 +204,9 @@ (and (= nil pe) (= nil re) (< i (len inside)) (array? (idx inside i)) (< 0 (len (idx inside i))) (= 'result (idx (idx inside i) 0))) ; only one result possible (recurse (+ i 1) i (+ i 1)) - (= nil pe) (recurse (+ i 1) i i) + (and (= nil re) (< i (len inside)) (array? (idx inside i)) (< 0 (len (idx inside i))) (= 'result (idx (idx inside i) 0))) + ; only one result possible + (recurse (+ i 1) pe (+ i 1)) (and (< i (len inside)) (array? (idx inside i)) (< 0 (len (idx inside i))) (= 'local (idx (idx inside i) 0))) (recurse (+ i 1) pe re) true [ (slice inside 0 (or pe 0)) (slice inside (or pe 0) (or re pe 0)) (slice inside (or re pe 0) i) (slice inside i -1) ]