From 9cf3a96bfb6535c638c6719ca8f77a1834181b91 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Thu, 27 Feb 2020 21:17:57 -0800 Subject: [PATCH] Initial SDL2 Ripple applet --- .gitignore | 1 + README.md | 1 + examples/ripple/Makefile | 11 + examples/ripple/index.html | 41 +++ examples/ripple/main.go | 114 ++++++++ examples/ripple/main_wasm.go | 136 +++++++++ examples/ripple/photo.jpg | Bin 0 -> 99507 bytes examples/ripple/ripple.go | 123 ++++++++ examples/ripple/server.go | 127 +++++++++ examples/ripple/wasm_exec.js | 533 +++++++++++++++++++++++++++++++++++ go.mod | 14 + go.sum | 13 + 12 files changed, 1114 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 examples/ripple/Makefile create mode 100644 examples/ripple/index.html create mode 100644 examples/ripple/main.go create mode 100644 examples/ripple/main_wasm.go create mode 100644 examples/ripple/photo.jpg create mode 100644 examples/ripple/ripple.go create mode 100644 examples/ripple/server.go create mode 100644 examples/ripple/wasm_exec.js create mode 100644 go.mod create mode 100644 go.sum diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..19e1bce --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.wasm diff --git a/README.md b/README.md new file mode 100644 index 0000000..8ed99b7 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# WebAssembly Applets diff --git a/examples/ripple/Makefile b/examples/ripple/Makefile new file mode 100644 index 0000000..9f51472 --- /dev/null +++ b/examples/ripple/Makefile @@ -0,0 +1,11 @@ +.PHONY: run +run: + go run main.go ripple.go + +.PHONY: wasm +wasm: + GOOS=js GOARCH=wasm go build -v -o ripple.wasm main_wasm.go ripple.go + +.PHONY: serve +serve: wasm + go run server.go diff --git a/examples/ripple/index.html b/examples/ripple/index.html new file mode 100644 index 0000000..d6dedac --- /dev/null +++ b/examples/ripple/index.html @@ -0,0 +1,41 @@ + + + + go/render: hello wasm! + + + + + + + + + + + diff --git a/examples/ripple/main.go b/examples/ripple/main.go new file mode 100644 index 0000000..579850c --- /dev/null +++ b/examples/ripple/main.go @@ -0,0 +1,114 @@ +package main + +import ( + "math" + "math/rand" + "time" + + "git.kirsle.net/go/render" + "git.kirsle.net/go/render/sdl" +) + +// Config variables. +var ( + Filename = "photo.jpg" + Width = 640 + Height = 480 + Quality = 4 + + // computed. + Size = Width * Height +) + +// Runtime variables. +var ( + app *App + mw render.Engine + TargetFPS = 1000 / 60 // run at 60fps +) + +func main() { + setup() + mainloop() +} + +// setup the applet +func setup() { + // Seed the random number generator. + rand.Seed(time.Now().UnixNano()) + + // Create SDL2 window. + mw = sdl.New("Ripple effect", Width, Height) + if err := mw.Setup(); err != nil { + panic(err) + } + + // Load the jpeg image. + var err error + photo, err := render.OpenImage(Filename) + if err != nil { + panic(err) + } + + app = New(mw, photo) +} + +// loop runs the applet logic for each loop. +func loop() bool { + app.Ripple() + + mw.Clear(render.White) + + // Poll events. + ev, err := mw.Poll() + if err != nil { + panic(err) + } + + // Escape key closes the program. + if ev.Escape { + mw.Teardown() + return false + } + + // Is mouse over the drawing? + if ev.CursorX >= 0 && ev.CursorX < Width && ev.CursorY >= 0 && ev.CursorY < Width { + app.Disturb(ev.CursorX, ev.CursorY, 15000) + } + + // rain + app.Disturb( + int(math.Floor(rand.Float64()*float64(Width))), + int(math.Floor(rand.Float64()*float64(Height))), + int(rand.Float64()*10000), + ) + app.Present() + return true +} + +// mainloop runs a loop of loop() while maintaing the frame rate. +func mainloop() { + var ( + start time.Time + elapsed time.Duration + ok bool + ) + + for { + // Record how long the frame takes. + start = time.Now() + ok = loop() + + // Delay to maintain target frames per second. + var delay uint32 + elapsed = time.Now().Sub(start) / time.Millisecond + if TargetFPS-int(elapsed) > 0 { + delay = uint32(TargetFPS - int(elapsed)) + } + mw.Delay(delay) + + if !ok { + break + } + } +} diff --git a/examples/ripple/main_wasm.go b/examples/ripple/main_wasm.go new file mode 100644 index 0000000..97cc482 --- /dev/null +++ b/examples/ripple/main_wasm.go @@ -0,0 +1,136 @@ +// +build js,wasm + +package main + +import ( + "fmt" + "image/jpeg" + "math/rand" + "net/http" + "time" + + "git.kirsle.net/go/render" + "git.kirsle.net/go/render/canvas" +) + +// Config variables. +var ( + Filename = "photo.jpg" + Width = 640 + Height = 480 + Quality = 4 + + // computed. + Size = Width * Height +) + +// Runtime variables. +var ( + app *App + mw *canvas.Engine + TargetFPS = 1000 / 60 // run at 60fps +) + +func main() { + setup() + go mainloop() + for { + time.Sleep(10 * time.Second) + } +} + +// setup the applet +func setup() { + var err error + // Seed the random number generator. + rand.Seed(time.Now().UnixNano()) + + // Get the HTML Canvas. + mw, err = canvas.New("canvas") + if err != nil { + panic(err) + } + + // Configure the engine. + err = mw.Setup() + if err != nil { + panic(err) + } + + mw.AddEventListeners() + + // Fetch the image via HTTP. + r, err := http.Get(Filename) + if err != nil { + panic(err) + } + + // Parse it as a jpeg. + photo, err := jpeg.Decode(r.Body) + if err != nil { + panic(err) + } + + app = New(mw, photo) +} + +// loop runs the applet logic for each loop. +func loop() bool { + app.Ripple() + + fmt.Println("loop") + + mw.Clear(render.White) + + // Poll events. + ev, err := mw.Poll() + if err != nil { + panic(err) + } + + // Is mouse over the drawing? + if ev.CursorX >= 0 && ev.CursorX < Width && ev.CursorY >= 0 && ev.CursorY < Width { + app.Disturb(ev.CursorX, ev.CursorY, 15000) + } + + // rain + // app.Disturb( + // int(math.Floor(rand.Float64()*float64(Width))), + // int(math.Floor(rand.Float64()*float64(Height))), + // int(rand.Float64()*10000), + // ) + app.Present() + + // test + for pt := range render.IterLine(render.Origin, render.NewPoint(128, 128)) { + mw.DrawPoint(render.Black, pt) + } + return true +} + +// mainloop runs a loop of loop() while maintaing the frame rate. +func mainloop() { + var ( + start time.Time + elapsed time.Duration + ok bool + ) + + for { + // Record how long the frame takes. + start = time.Now() + ok = loop() + + // Delay to maintain target frames per second. + var delay uint32 + elapsed = time.Now().Sub(start) / time.Millisecond + if TargetFPS-int(elapsed) > 0 { + delay = uint32(TargetFPS - int(elapsed)) + } + mw.Delay(delay) + + if !ok { + break + } + } +} diff --git a/examples/ripple/photo.jpg b/examples/ripple/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7fdd90c37caa8483026d80921dcd8d9c2a31799 GIT binary patch literal 99507 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

@jF*A9a2i+awLZ!Y>hwrOP8b z`Y|FUW7`wxw^`TdC$G`8?e!5JZA03?ObRIMZPKy;ur_(Q<n27N54#~mUOsgV(?8O{LYi0=Ic6ing8ND~#Y&r~1hZ1*Js>;Fit%t=v?cK|9U?RfFo)Wp5kuUL z%J_>Tt<(#Nywm)#D9PaEd%$(|ue=#@{T6lfzeaDEcY51;m(22+_!DN$0{)@D3ZpvZ z>i3xTxuY?+wm#+ZLv`u5@ej#bkQyD|sA8oO{`V{$5CtMQYM{1{X?;qqz<51!%ixdO z=Cv9j=ZL@@Q87Q7{{R;9C~ z$~dMi(j(q*s=|&{ppVdvs#%j)MCEq=w&4YZjnOBEt~5oa>}l|V?)lB77AEVt9)lr zQ#bD#in#m3_aDr;G^Cj9n;};J0QX{C1Lq%!imW{!_|H_jCPcWh`^A^v(X=GFDZ7R{ zlw~^0Ov?OW`zz)u+(Akn#5x7!pBRH@C_J{^a?u=s8Y-xDssj@`H8IN&<_Ln?ir2p7 z<5jfyPGWN?_^1~bj%Um*5E@tLhT!NhUPR#A0#A%Vl|^KUvJO&URpjmFVy;JTDC!Im zTZlf1qK}0VZ9dYfDbffXt zbg0Z>6noa?w}u}u8ahj7Q*?yTFw9?~WFJ=jzo=sg%86_t%fI4fQgnHVQcz;4V52K| z;%JQHl%O!`&BWl2aV%Imib~c8qW=I9O@*FcB7Ss?tfPjHezB3(K;x7R)*U^`K+3cE zh?^|6Qv1RFo@Oz#%vID=0NRZh6PePA8lYf;6k*?wm#PyI2&D?I*)<)A!&?3K;d+Ap{$r`b

-(A;#n0-82(vj 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 S6lrzz;pv%eKg*->pa0qM2>9^; literal 0 HcmV?d00001 diff --git a/examples/ripple/ripple.go b/examples/ripple/ripple.go new file mode 100644 index 0000000..a2aac53 --- /dev/null +++ b/examples/ripple/ripple.go @@ -0,0 +1,123 @@ +package main + +import ( + "image" + + "git.kirsle.net/go/render" +) + +// App holds the ripple applet state. +type App struct { + e render.Engine + image image.Image + source *image.RGBA + data *image.RGBA + tex render.Texturer + + // computed + width int + height int + size int + + // frame buffers + buffer0 []int + buffer1 []int +} + +// New creates the ripple applet. +func New(e render.Engine, i image.Image) *App { + var ( + bounds = i.Bounds() + width = bounds.Max.X + height = bounds.Max.Y + size = width * height + ) + a := &App{ + e: e, + image: i, + source: render.ImageToRGBA(i), + data: render.ImageToRGBA(i), + width: width, + height: height, + size: size, + buffer0: make([]int, size), + buffer1: make([]int, size), + } + + tex, err := a.e.StoreTexture("pic", a.data) + if err != nil { + panic(err) + } + a.tex = tex + return a +} + +// Disturb creates a disturbance in the water. +func (a *App) Disturb(x, y, z int) { + if x < 2 || x > Width-2 || y < 1 || y > Height-2 { + return + } + var i = x + y*Width + a.buffer0[i] += z + a.buffer0[i-1] -= z +} + +// Ripple runs the ripple algorithm. +func (a *App) Ripple() { + var ( + width = a.width + size = a.size + ) + + // average cells to make the surface more even + for i := width + 1; i < size-width-1; i += 2 { + for x := 1; x < width-1; x++ { + avg := (a.buffer0[i] + a.buffer0[i+1] + a.buffer0[i-1] + a.buffer0[i-width] + a.buffer0[i+width]) / 5 + a.buffer0[i] = avg + i++ + } + } + + // Loop for every non-edge element. + y := 0 + for i := width + 1; i < size-width-1; i += 2 { + y++ + for x := 1; x < width-1; x++ { + // Wave propagation + waveHeight := (a.buffer0[i-1]+ + a.buffer0[i+1]+ + a.buffer0[i+Width]+ + a.buffer0[i-Width])/2 - a.buffer1[i] + a.buffer1[i] = waveHeight + + // Some very fake lighting + var light = int(float64(waveHeight)*2.0 - float64(a.buffer1[i-2])*0.6) + if light < -10 { + light = -10 + } else if light > 100 { + light = 100 + } + + color := a.source.At(x, y) + a.data.Set(x, y, render.FromColor(color).Lighten(light).ToColor()) + + i++ + } + } + + aux := a.buffer0 + a.buffer0 = a.buffer1 + a.buffer1 = aux + + a.tex, _ = a.e.StoreTexture("pic", a.data) +} + +// Present the visual state. +func (a *App) Present() { + rect := render.Rect{ + W: a.width, + H: a.height, + } + a.e.Copy(a.tex, rect, rect) + a.e.Present() +} diff --git a/examples/ripple/server.go b/examples/ripple/server.go new file mode 100644 index 0000000..112a3b2 --- /dev/null +++ b/examples/ripple/server.go @@ -0,0 +1,127 @@ +// +build disabled + +package main + +import ( + "fmt" + "io/ioutil" + "log" + "net/http" + "os/exec" + "path/filepath" + + "github.com/fsnotify/fsnotify" +) + +func main() { + const wasm = "/ripple.wasm" + + // Watch the dev directory for changes. + go watchChanges() + + http.Handle("/", http.FileServer(http.Dir("."))) + http.HandleFunc(wasm, func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/wasm") + http.ServeFile(w, r, "."+wasm) + }) + + fmt.Println("Listening at http://localhost:8080/") + log.Fatal(http.ListenAndServe(":8080", nil)) +} + +// onChange handler to rebuild the wasm file automatically. +func onChange() { + out, err := exec.Command("make", "wasm").Output() + if err != nil { + log.Printf("error: %s", err) + } + log.Printf("%s", out) + log.Printf("Doodle WASM file rebuilt") +} + +// Watch the Doodle source tree for changes to Go files and rebuild +// the wasm binary automatically. +func watchChanges() { + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Printf("error: %s", err) + return + } + defer watcher.Close() + + done := make(chan bool) + go func() { + log.Println("Starting watch files loop") + for { + select { + case event, ok := <-watcher.Events: + if !ok { + return + } + + log.Printf("event: %s", event) + if event.Op&fsnotify.Write == fsnotify.Write { + log.Printf("modified file: %s", event.Name) + onChange() + } + case err, ok := <-watcher.Errors: + if !ok { + return + } + + log.Printf("error: %s", err) + } + } + }() + + log.Println("Adding source directory to watcher") + dirs := crawlDirectory("../") + + // Watch all these folders. + for _, dir := range dirs { + err = watcher.Add(dir) + if err != nil { + log.Printf("error: %s", err) + } + } + <-done +} + +// Crawl the filesystem and return paths with Go files. +func crawlDirectory(root string) []string { + var ( + ext = ".go" + result []string + has bool + ) + + files, err := ioutil.ReadDir(root) + if err != nil { + log.Fatalln(err) + } + + for _, file := range files { + if file.Name() == ".git" { + continue + } + + // Recursively scan subdirectories. + if file.IsDir() { + result = append(result, + crawlDirectory(filepath.Join(root, file.Name()))..., + ) + continue + } + + // This root has a file we want? + if filepath.Ext(file.Name()) == ext { + has = true + } + } + + if has { + result = append(result, root) + } + + return result +} diff --git a/examples/ripple/wasm_exec.js b/examples/ripple/wasm_exec.js new file mode 100644 index 0000000..a54bb9a --- /dev/null +++ b/examples/ripple/wasm_exec.js @@ -0,0 +1,533 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +(() => { + // Map multiple JavaScript environments to a single common API, + // preferring web standards over Node.js API. + // + // Environments considered: + // - Browsers + // - Node.js + // - Electron + // - Parcel + + if (typeof global !== "undefined") { + // global already exists + } else if (typeof window !== "undefined") { + window.global = window; + } else if (typeof self !== "undefined") { + self.global = self; + } else { + throw new Error("cannot export Go (neither global, window nor self is defined)"); + } + + if (!global.require && typeof require !== "undefined") { + global.require = require; + } + + if (!global.fs && global.require) { + global.fs = require("fs"); + } + + if (!global.fs) { + let outputBuf = ""; + global.fs = { + constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused + writeSync(fd, buf) { + outputBuf += decoder.decode(buf); + const nl = outputBuf.lastIndexOf("\n"); + if (nl != -1) { + console.log(outputBuf.substr(0, nl)); + outputBuf = outputBuf.substr(nl + 1); + } + return buf.length; + }, + write(fd, buf, offset, length, position, callback) { + if (offset !== 0 || length !== buf.length || position !== null) { + throw new Error("not implemented"); + } + const n = this.writeSync(fd, buf); + callback(null, n); + }, + open(path, flags, mode, callback) { + const err = new Error("not implemented"); + err.code = "ENOSYS"; + callback(err); + }, + read(fd, buffer, offset, length, position, callback) { + const err = new Error("not implemented"); + err.code = "ENOSYS"; + callback(err); + }, + fsync(fd, callback) { + callback(null); + }, + }; + } + + if (!global.crypto) { + const nodeCrypto = require("crypto"); + global.crypto = { + getRandomValues(b) { + nodeCrypto.randomFillSync(b); + }, + }; + } + + if (!global.performance) { + global.performance = { + now() { + const [sec, nsec] = process.hrtime(); + return sec * 1000 + nsec / 1000000; + }, + }; + } + + if (!global.TextEncoder) { + global.TextEncoder = require("util").TextEncoder; + } + + if (!global.TextDecoder) { + global.TextDecoder = require("util").TextDecoder; + } + + // End of polyfills for common API. + + const encoder = new TextEncoder("utf-8"); + const decoder = new TextDecoder("utf-8"); + + global.Go = class { + constructor() { + this.argv = ["js"]; + this.env = {}; + this.exit = (code) => { + if (code !== 0) { + console.warn("exit code:", code); + } + }; + this._exitPromise = new Promise((resolve) => { + this._resolveExitPromise = resolve; + }); + this._pendingEvent = null; + this._scheduledTimeouts = new Map(); + this._nextCallbackTimeoutID = 1; + + const mem = () => { + // The buffer may change when requesting more memory. + return new DataView(this._inst.exports.mem.buffer); + } + + const setInt64 = (addr, v) => { + mem().setUint32(addr + 0, v, true); + mem().setUint32(addr + 4, Math.floor(v / 4294967296), true); + } + + const getInt64 = (addr) => { + const low = mem().getUint32(addr + 0, true); + const high = mem().getInt32(addr + 4, true); + return low + high * 4294967296; + } + + const loadValue = (addr) => { + const f = mem().getFloat64(addr, true); + if (f === 0) { + return undefined; + } + if (!isNaN(f)) { + return f; + } + + const id = mem().getUint32(addr, true); + return this._values[id]; + } + + const storeValue = (addr, v) => { + const nanHead = 0x7FF80000; + + if (typeof v === "number") { + if (isNaN(v)) { + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 0, true); + return; + } + if (v === 0) { + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 1, true); + return; + } + mem().setFloat64(addr, v, true); + return; + } + + switch (v) { + case undefined: + mem().setFloat64(addr, 0, true); + return; + case null: + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 2, true); + return; + case true: + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 3, true); + return; + case false: + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 4, true); + return; + } + + let ref = this._refs.get(v); + if (ref === undefined) { + ref = this._values.length; + this._values.push(v); + this._refs.set(v, ref); + } + let typeFlag = 0; + switch (typeof v) { + case "string": + typeFlag = 1; + break; + case "symbol": + typeFlag = 2; + break; + case "function": + typeFlag = 3; + break; + } + mem().setUint32(addr + 4, nanHead | typeFlag, true); + mem().setUint32(addr, ref, true); + } + + const loadSlice = (addr) => { + const array = getInt64(addr + 0); + const len = getInt64(addr + 8); + return new Uint8Array(this._inst.exports.mem.buffer, array, len); + } + + const loadSliceOfValues = (addr) => { + const array = getInt64(addr + 0); + const len = getInt64(addr + 8); + const a = new Array(len); + for (let i = 0; i < len; i++) { + a[i] = loadValue(array + i * 8); + } + return a; + } + + const loadString = (addr) => { + const saddr = getInt64(addr + 0); + const len = getInt64(addr + 8); + return decoder.decode(new DataView(this._inst.exports.mem.buffer, saddr, len)); + } + + const timeOrigin = Date.now() - performance.now(); + this.importObject = { + go: { + // Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters) + // may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported + // function. A goroutine can switch to a new stack if the current stack is too small (see morestack function). + // This changes the SP, thus we have to update the SP used by the imported function. + + // func wasmExit(code int32) + "runtime.wasmExit": (sp) => { + const code = mem().getInt32(sp + 8, true); + this.exited = true; + delete this._inst; + delete this._values; + delete this._refs; + this.exit(code); + }, + + // func wasmWrite(fd uintptr, p unsafe.Pointer, n int32) + "runtime.wasmWrite": (sp) => { + const fd = getInt64(sp + 8); + const p = getInt64(sp + 16); + const n = mem().getInt32(sp + 24, true); + fs.writeSync(fd, new Uint8Array(this._inst.exports.mem.buffer, p, n)); + }, + + // func nanotime() int64 + "runtime.nanotime": (sp) => { + setInt64(sp + 8, (timeOrigin + performance.now()) * 1000000); + }, + + // func walltime() (sec int64, nsec int32) + "runtime.walltime": (sp) => { + const msec = (new Date).getTime(); + setInt64(sp + 8, msec / 1000); + mem().setInt32(sp + 16, (msec % 1000) * 1000000, true); + }, + + // func scheduleTimeoutEvent(delay int64) int32 + "runtime.scheduleTimeoutEvent": (sp) => { + const id = this._nextCallbackTimeoutID; + this._nextCallbackTimeoutID++; + this._scheduledTimeouts.set(id, setTimeout( + () => { + this._resume(); + while (this._scheduledTimeouts.has(id)) { + // for some reason Go failed to register the timeout event, log and try again + // (temporary workaround for https://github.com/golang/go/issues/28975) + console.warn("scheduleTimeoutEvent: missed timeout event"); + this._resume(); + } + }, + getInt64(sp + 8) + 1, // setTimeout has been seen to fire up to 1 millisecond early + )); + mem().setInt32(sp + 16, id, true); + }, + + // func clearTimeoutEvent(id int32) + "runtime.clearTimeoutEvent": (sp) => { + const id = mem().getInt32(sp + 8, true); + clearTimeout(this._scheduledTimeouts.get(id)); + this._scheduledTimeouts.delete(id); + }, + + // func getRandomData(r []byte) + "runtime.getRandomData": (sp) => { + crypto.getRandomValues(loadSlice(sp + 8)); + }, + + // func stringVal(value string) ref + "syscall/js.stringVal": (sp) => { + storeValue(sp + 24, loadString(sp + 8)); + }, + + // func valueGet(v ref, p string) ref + "syscall/js.valueGet": (sp) => { + const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16)); + sp = this._inst.exports.getsp(); // see comment above + storeValue(sp + 32, result); + }, + + // func valueSet(v ref, p string, x ref) + "syscall/js.valueSet": (sp) => { + Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32)); + }, + + // func valueIndex(v ref, i int) ref + "syscall/js.valueIndex": (sp) => { + storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16))); + }, + + // valueSetIndex(v ref, i int, x ref) + "syscall/js.valueSetIndex": (sp) => { + Reflect.set(loadValue(sp + 8), getInt64(sp + 16), loadValue(sp + 24)); + }, + + // func valueCall(v ref, m string, args []ref) (ref, bool) + "syscall/js.valueCall": (sp) => { + try { + const v = loadValue(sp + 8); + const m = Reflect.get(v, loadString(sp + 16)); + const args = loadSliceOfValues(sp + 32); + const result = Reflect.apply(m, v, args); + sp = this._inst.exports.getsp(); // see comment above + storeValue(sp + 56, result); + mem().setUint8(sp + 64, 1); + } catch (err) { + storeValue(sp + 56, err); + mem().setUint8(sp + 64, 0); + } + }, + + // func valueInvoke(v ref, args []ref) (ref, bool) + "syscall/js.valueInvoke": (sp) => { + try { + const v = loadValue(sp + 8); + const args = loadSliceOfValues(sp + 16); + const result = Reflect.apply(v, undefined, args); + sp = this._inst.exports.getsp(); // see comment above + storeValue(sp + 40, result); + mem().setUint8(sp + 48, 1); + } catch (err) { + storeValue(sp + 40, err); + mem().setUint8(sp + 48, 0); + } + }, + + // func valueNew(v ref, args []ref) (ref, bool) + "syscall/js.valueNew": (sp) => { + try { + const v = loadValue(sp + 8); + const args = loadSliceOfValues(sp + 16); + const result = Reflect.construct(v, args); + sp = this._inst.exports.getsp(); // see comment above + storeValue(sp + 40, result); + mem().setUint8(sp + 48, 1); + } catch (err) { + storeValue(sp + 40, err); + mem().setUint8(sp + 48, 0); + } + }, + + // func valueLength(v ref) int + "syscall/js.valueLength": (sp) => { + setInt64(sp + 16, parseInt(loadValue(sp + 8).length)); + }, + + // valuePrepareString(v ref) (ref, int) + "syscall/js.valuePrepareString": (sp) => { + const str = encoder.encode(String(loadValue(sp + 8))); + storeValue(sp + 16, str); + setInt64(sp + 24, str.length); + }, + + // valueLoadString(v ref, b []byte) + "syscall/js.valueLoadString": (sp) => { + const str = loadValue(sp + 8); + loadSlice(sp + 16).set(str); + }, + + // func valueInstanceOf(v ref, t ref) bool + "syscall/js.valueInstanceOf": (sp) => { + mem().setUint8(sp + 24, loadValue(sp + 8) instanceof loadValue(sp + 16)); + }, + + // func copyBytesToGo(dst []byte, src ref) (int, bool) + "syscall/js.copyBytesToGo": (sp) => { + const dst = loadSlice(sp + 8); + const src = loadValue(sp + 32); + if (!(src instanceof Uint8Array)) { + mem().setUint8(sp + 48, 0); + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(sp + 40, toCopy.length); + mem().setUint8(sp + 48, 1); + }, + + // func copyBytesToJS(dst ref, src []byte) (int, bool) + "syscall/js.copyBytesToJS": (sp) => { + const dst = loadValue(sp + 8); + const src = loadSlice(sp + 16); + if (!(dst instanceof Uint8Array)) { + mem().setUint8(sp + 48, 0); + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(sp + 40, toCopy.length); + mem().setUint8(sp + 48, 1); + }, + + "debug": (value) => { + console.log(value); + }, + } + }; + } + + async run(instance) { + this._inst = instance; + this._values = [ // TODO: garbage collection + NaN, + 0, + null, + true, + false, + global, + this, + ]; + this._refs = new Map(); + this.exited = false; + + const mem = new DataView(this._inst.exports.mem.buffer) + + // Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory. + let offset = 4096; + + const strPtr = (str) => { + const ptr = offset; + const bytes = encoder.encode(str + "\0"); + new Uint8Array(mem.buffer, offset, bytes.length).set(bytes); + offset += bytes.length; + if (offset % 8 !== 0) { + offset += 8 - (offset % 8); + } + return ptr; + }; + + const argc = this.argv.length; + + const argvPtrs = []; + this.argv.forEach((arg) => { + argvPtrs.push(strPtr(arg)); + }); + + const keys = Object.keys(this.env).sort(); + argvPtrs.push(keys.length); + keys.forEach((key) => { + argvPtrs.push(strPtr(`${key}=${this.env[key]}`)); + }); + + const argv = offset; + argvPtrs.forEach((ptr) => { + mem.setUint32(offset, ptr, true); + mem.setUint32(offset + 4, 0, true); + offset += 8; + }); + + this._inst.exports.run(argc, argv); + if (this.exited) { + this._resolveExitPromise(); + } + await this._exitPromise; + } + + _resume() { + if (this.exited) { + throw new Error("Go program has already exited"); + } + this._inst.exports.resume(); + if (this.exited) { + this._resolveExitPromise(); + } + } + + _makeFuncWrapper(id) { + const go = this; + return function () { + const event = { id: id, this: this, args: arguments }; + go._pendingEvent = event; + go._resume(); + return event.result; + }; + } + } + + if ( + global.require && + global.require.main === module && + global.process && + global.process.versions && + !global.process.versions.electron + ) { + if (process.argv.length < 3) { + console.error("usage: go_js_wasm_exec [wasm binary] [arguments]"); + process.exit(1); + } + + const go = new Go(); + go.argv = process.argv.slice(2); + go.env = Object.assign({ TMPDIR: require("os").tmpdir() }, process.env); + go.exit = process.exit; + WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject).then((result) => { + process.on("exit", (code) => { // Node.js exits if no event handler is pending + if (code === 0 && !go.exited) { + // deadlock, make Go print error and stack traces + go._pendingEvent = { id: 0 }; + go._resume(); + } + }); + return go.run(result.instance); + }).catch((err) => { + console.error(err); + process.exit(1); + }); + } +})(); diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..993baa2 --- /dev/null +++ b/go.mod @@ -0,0 +1,14 @@ +module git.kirsle.net/go/applets + +go 1.13 + +replace git.kirsle.net/go/ui => /home/kirsle/go/src/git.kirsle.net/go/ui + +replace git.kirsle.net/go/render => /home/kirsle/go/src/git.kirsle.net/go/render + +require ( + git.kirsle.net/go/render v0.0.0-20200102014411-4d008b5c468d + git.kirsle.net/go/ui v0.0.0-20191229080003-4ba563d48d6f + github.com/fsnotify/fsnotify v1.4.7 // indirect + golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c84248f --- /dev/null +++ b/go.sum @@ -0,0 +1,13 @@ +git.kirsle.net/go/render v0.0.0-20200102014411-4d008b5c468d h1:vErak6oVRT2dosyQzcwkjXyWQ2NRIVL8q9R8NOUTtsg= +git.kirsle.net/go/render v0.0.0-20200102014411-4d008b5c468d/go.mod h1:ywZtC+zE2SpeObfkw0OvG01pWHQadsVQ4WDKOYzaejc= +git.kirsle.net/go/ui v0.0.0-20191229080003-4ba563d48d6f h1:upiac1ipv6cx0Um9uPSHTtwqVpmY1nctJi6mMxFdHTM= +git.kirsle.net/go/ui v0.0.0-20191229080003-4ba563d48d6f/go.mod h1:MWMEQKnc2LOKK9yXO49FxkAdt9uiTvVQPZH7N5tIXhY= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/veandco/go-sdl2 v0.4.1 h1:HmSBvVmKWI8LAOeCfTTM8R33rMyPcs6U3o8n325c9Qg= +github.com/veandco/go-sdl2 v0.4.1/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=