initial experiment - generating a simple wasm function
This commit is contained in:
commit
3a84af5840
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
|
@ -0,0 +1,24 @@
|
|||
node_modules/
|
||||
|
||||
/target
|
||||
/checkouts
|
||||
/src/gen
|
||||
|
||||
pom.xml
|
||||
pom.xml.asc
|
||||
*.iml
|
||||
*.jar
|
||||
*.log
|
||||
.shadow-cljs
|
||||
.idea
|
||||
.lein-*
|
||||
.nrepl-*
|
||||
.DS_Store
|
||||
|
||||
.hgignore
|
||||
.hg/
|
||||
|
||||
.calva
|
||||
experiment/js
|
||||
.clj-kondo
|
||||
.lsp
|
1145
package-lock.json
generated
Normal file
1145
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
8
package.json
Normal file
8
package.json
Normal file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "tock",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"devDependencies": {
|
||||
"shadow-cljs": "2.28.6"
|
||||
}
|
||||
}
|
9
public/index.html
Normal file
9
public/index.html
Normal file
|
@ -0,0 +1,9 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Hello, world!</title>
|
||||
<script src="/js/main.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
Hello!!
|
||||
</body>
|
||||
</html>
|
BIN
public/release.wasm
Normal file
BIN
public/release.wasm
Normal file
Binary file not shown.
BIN
public/test-debug.wasm
Normal file
BIN
public/test-debug.wasm
Normal file
Binary file not shown.
20
shadow-cljs.edn
Normal file
20
shadow-cljs.edn
Normal file
|
@ -0,0 +1,20 @@
|
|||
;; shadow-cljs configuration
|
||||
{:source-paths
|
||||
["src/dev"
|
||||
"src/main"
|
||||
"src/test"]
|
||||
|
||||
:dependencies
|
||||
[[io.helins/wasm "0.0.0-alpha3"] ; https://cljdoc.org/d/io.helins/wasm/0.0.0-alpha3/doc/readme
|
||||
[io.helins/binf "1.1.0"]
|
||||
[metosin/malli "0.16.1"] ; https://github.com/metosin/malli
|
||||
[meander/epsilon "0.0.650"] ; https://github.com/noprompt/meander
|
||||
[org.clojure/tools.reader "1.4.2"] ; https://github.com/clojure/tools.reader
|
||||
[binaryage/devtools "1.0.7"]]
|
||||
|
||||
:builds
|
||||
{:experiment {:target :browser
|
||||
:output-dir "experiment/js"
|
||||
:modules {:main {:init-fn tock.experiment/main}}}}
|
||||
|
||||
:dev-http {8909 ["experiment" "public"]}}
|
35
src/main/tock/experiment.cljs
Normal file
35
src/main/tock/experiment.cljs
Normal file
|
@ -0,0 +1,35 @@
|
|||
(ns tock.experiment
|
||||
(:require [helins.wasm :as wasm]
|
||||
[helins.wasm.ir :as ir]
|
||||
[helins.wasm.bin :as op]
|
||||
[helins.binf :as binf]
|
||||
[helins.binf.string :as binf.string]
|
||||
;; [malli.core :as malli]
|
||||
[malli.util]))
|
||||
|
||||
(def test-wasm
|
||||
(-> (wasm/ctx)
|
||||
(ir/assoc-type (ir/type-signature {} [[op/numtype-i32 op/numtype-i32] [op/numtype-i32]]))
|
||||
(ir/assoc-func (ir/func {} 0))
|
||||
(assoc-in [:wasm/codesec 0] (ir/func' {} [] [[op/local-get 0] [op/local-get 1] [op/i32-add]]))
|
||||
(assoc-in [:wasm/exportsec :wasm.export/func 0] [(ir/export' {} (binf.string/encode "add"))])))
|
||||
|
||||
(defn decompile-url [url]
|
||||
(-> (js/fetch url)
|
||||
(.then #(.arrayBuffer %))
|
||||
(.then #(let [v (binf/view %)]
|
||||
(binf/endian-set v :little-endian)
|
||||
(wasm/decompile v)))))
|
||||
|
||||
(defn instantiate-wasm [wasm importObject]
|
||||
(-> (wasm/compile wasm)
|
||||
(binf/backing-buffer)
|
||||
(js/WebAssembly.instantiate importObject)))
|
||||
|
||||
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
|
||||
(defn main []
|
||||
(js/console.log test-wasm)
|
||||
(-> (instantiate-wasm test-wasm #js {})
|
||||
(.then #(js/console.log (-> % (.-instance) (.-exports) (.add 1 2)))))
|
||||
(-> (decompile-url "release.wasm")
|
||||
(.then #(js/console.log (-> % :wasm/exportsec :wasm.export/func (get 0))))))
|
Loading…
Reference in a new issue