完善 waroot 目录
This commit is contained in:
parent
d8f793798e
commit
0d4097dff6
|
|
@ -23,7 +23,7 @@ jobs:
|
|||
go-version: 1.17
|
||||
|
||||
- run: make -C internal/app/wawasm
|
||||
- run: make -C _examples/snake publish
|
||||
- run: make -C waroot/examples/snake publish
|
||||
|
||||
- name: Deploy
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
|
|
|
|||
|
|
@ -30,10 +30,10 @@ jobs:
|
|||
- run: go install
|
||||
|
||||
- run: wa -h
|
||||
- run: wa hello.wa
|
||||
- run: wa run _examples/prime
|
||||
- run: wa run hello.wa
|
||||
- run: wa run -target=chrome hello.wa
|
||||
- run: cd waroot && wa hello.wa
|
||||
- run: cd waroot && wa run examples/prime
|
||||
- run: cd waroot && wa run hello.wa
|
||||
- run: cd waroot && wa run -target=chrome hello.wa
|
||||
|
||||
- uses: shogo82148/actions-goveralls@v1
|
||||
with:
|
||||
|
|
@ -60,10 +60,10 @@ jobs:
|
|||
- run: go install
|
||||
|
||||
- run: wa -h
|
||||
- run: wa hello.wa
|
||||
- run: wa run _examples/prime
|
||||
- run: wa run hello.wa
|
||||
- run: wa run -target=chrome hello.wa
|
||||
- run: cd waroot && wa hello.wa
|
||||
- run: cd waroot && wa run examples/prime
|
||||
- run: cd waroot && wa run hello.wa
|
||||
- run: cd waroot && wa run -target=chrome hello.wa
|
||||
|
||||
build-and-test-macos:
|
||||
runs-on: macos-12
|
||||
|
|
@ -86,7 +86,7 @@ jobs:
|
|||
- run: go install
|
||||
|
||||
- run: wa -h
|
||||
- run: wa hello.wa
|
||||
- run: wa run _examples/prime
|
||||
- run: wa run hello.wa
|
||||
- run: wa run -target=chrome hello.wa
|
||||
- run: cd waroot && wa hello.wa
|
||||
- run: cd waroot && wa run examples/prime
|
||||
- run: cd waroot && wa run hello.wa
|
||||
- run: cd waroot && wa run -target=chrome hello.wa
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@ stages:
|
|||
chmod +X output/wa-lang-linux64/wa
|
||||
./output/wa-lang-linux64/wa
|
||||
./output/wa-lang-linux64/wa -h
|
||||
./output/wa-lang-linux64/wa hello.wa
|
||||
./output/wa-lang-linux64/wa run _examples/prime
|
||||
./output/wa-lang-linux64/wa run hello.wa
|
||||
#./output/wa-lang-linux64/wa waroot/hello.wa
|
||||
#./output/wa-lang-linux64/wa run waroot/examples/prime
|
||||
#./output/wa-lang-linux64/wa run waroot/hello.wa
|
||||
|
||||
# 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除
|
||||
artifacts:
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@ stages:
|
|||
chmod +X output/wa-lang-linux64/wa
|
||||
./output/wa-lang-linux64/wa
|
||||
./output/wa-lang-linux64/wa -h
|
||||
./output/wa-lang-linux64/wa hello.wa
|
||||
./output/wa-lang-linux64/wa run _examples/prime
|
||||
./output/wa-lang-linux64/wa run hello.wa
|
||||
#./output/wa-lang-linux64/wa waroot/hello.wa
|
||||
#./output/wa-lang-linux64/wa run waroot/examples/prime
|
||||
#./output/wa-lang-linux64/wa run waroot/hello.wa
|
||||
|
||||
# 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,24小时后自动清除
|
||||
artifacts:
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@ stages:
|
|||
chmod +X output/wa-lang-linux64/wa
|
||||
./output/wa-lang-linux64/wa
|
||||
./output/wa-lang-linux64/wa -h
|
||||
./output/wa-lang-linux64/wa hello.wa
|
||||
./output/wa-lang-linux64/wa run _examples/prime
|
||||
./output/wa-lang-linux64/wa run hello.wa
|
||||
#./output/wa-lang-linux64/wa waroot/hello.wa
|
||||
#./output/wa-lang-linux64/wa run waroot/examples/prime
|
||||
#./output/wa-lang-linux64/wa run waroot/hello.wa
|
||||
|
||||
# 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除
|
||||
artifacts:
|
||||
|
|
|
|||
10
Makefile
10
Makefile
|
|
@ -1,10 +1,11 @@
|
|||
# 版权 @2019 凹语言 作者。保留所有权利。
|
||||
|
||||
hello:
|
||||
go run main.go run hello.wa
|
||||
go install
|
||||
cd waroot && go run ../main.go run hello.wa
|
||||
|
||||
prime:
|
||||
go run main.go run _examples/prime
|
||||
cd waroot && go run ../main.go run examples/prime
|
||||
|
||||
build-wasm:
|
||||
GOARCH=wasm GOOS=js go build -o wa.out.wasm ./main_wasm.go
|
||||
|
|
@ -21,6 +22,7 @@ arduino-build:
|
|||
xxd -i a.out.wasm > app.wasm.h
|
||||
|
||||
ci-test-all:
|
||||
go install
|
||||
go test ./...
|
||||
|
||||
@echo "== std test begin =="
|
||||
|
|
@ -39,8 +41,8 @@ ci-test-all:
|
|||
go run main.go test unicode/utf8
|
||||
@echo "== std ok =="
|
||||
|
||||
go run main.go hello.wa
|
||||
cd waroot && go run ../main.go hello.wa
|
||||
|
||||
make -C ./_examples ci-test-all
|
||||
make -C ./waroot/examples ci-test-all
|
||||
|
||||
clean:
|
||||
|
|
|
|||
|
|
@ -43,8 +43,9 @@
|
|||
通过 Go 语言安装需要执行以下命令 (Go >= 1.17):
|
||||
|
||||
1. `go install wa-lang.org/wa@latest`
|
||||
2. `wa init -name=_examples/hi`
|
||||
3. `wa run _examples/hi`
|
||||
2. `cd waroot`
|
||||
3. `wa init -name=examples/hi`
|
||||
4. `wa run examples/hi`
|
||||
|
||||
## 例子: 凹语言
|
||||
|
||||
|
|
@ -99,7 +100,7 @@ func main {
|
|||
运行并输出结果:
|
||||
|
||||
```
|
||||
$ go run main.go run _examples/prime
|
||||
$ cd waroot && go run ../main.go run examples/prime
|
||||
2
|
||||
3
|
||||
5
|
||||
|
|
@ -136,7 +137,7 @@ $ go run main.go run _examples/prime
|
|||
|
||||
运行的结果和英文语法的示例相同。
|
||||
|
||||
更多例子 [_examples](_examples)
|
||||
更多例子 [waroot/examples](waroot/examples)
|
||||
|
||||
## 贡献者名单
|
||||
|
||||
|
|
|
|||
11
README.md
11
README.md
|
|
@ -36,7 +36,7 @@ Instead of requiring complex toolchains to set up, you can simply go install it
|
|||
## Snake Game
|
||||
|
||||
- Play: [https://wa-lang.org/wa/snake/](https://wa-lang.org/wa/snake/)
|
||||
- Code: [_examples/snake/README-en.md](_examples/snake/README-en.md)
|
||||
- Code: [waroot/examples/snake/README-en.md](waroot/examples/snake/README-en.md)
|
||||
|
||||

|
||||
|
||||
|
|
@ -47,8 +47,9 @@ Install from binary: download `wa` command from https://github.com/wa-lang/wa/re
|
|||
Or install form Go (Go >= 1.17):
|
||||
|
||||
1. `go install wa-lang.org/wa@latest`
|
||||
2. `wa init -name=_examples/hi`
|
||||
3. `wa run _examples/hi`
|
||||
2. `cd waroot`
|
||||
2. `wa init -name=examples/hi`
|
||||
3. `wa run examples/hi`
|
||||
|
||||
> The Wa project is still in very early stage. If you want to submit PR, please read the [Contribution Guide(Chinese)](https://wa-lang.org/community/contribute.html). We do not accept PR only about 3rdparty changes.
|
||||
|
||||
|
|
@ -105,7 +106,7 @@ func main {
|
|||
Execute the program:
|
||||
|
||||
```
|
||||
$ go run main.go run _examples/prime
|
||||
$ cd waroot && go run ../main.go run examples/prime
|
||||
2
|
||||
3
|
||||
5
|
||||
|
|
@ -144,7 +145,7 @@ Print prime numbers up to 30:
|
|||
|
||||
Output is the same as the previous example.
|
||||
|
||||
More examples [_examples](_examples)
|
||||
More examples [waroot/examples](waroot/examples)
|
||||
|
||||
## Contributors
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +0,0 @@
|
|||
# 版权 @2023 凹语言 作者。保留所有权利。
|
||||
|
||||
dev:
|
||||
go run . -dbg=a1.out.dbg -wat=a1.out.wat
|
||||
|
||||
-rm wa.wasm
|
||||
GOOS=js GOARCH=wasm go build -o wa.wasm
|
||||
node run-go-wasm.js wa.wasm -dbg=a2.out.dbg -wat=a2.out.wat
|
||||
|
||||
clean:
|
||||
-rm *.out.* *.wasm
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
// 版权 @2022 凹语言 作者。保留所有权利。
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"wa-lang.org/wa/api"
|
||||
"wa-lang.org/wa/internal/backends/compiler_wat"
|
||||
"wa-lang.org/wa/internal/config"
|
||||
"wa-lang.org/wa/internal/loader"
|
||||
"wa-lang.org/wa/internal/logger"
|
||||
)
|
||||
|
||||
var waError error
|
||||
|
||||
func waGetError() error {
|
||||
return waError
|
||||
}
|
||||
func waGetErrorText() string {
|
||||
if waError != nil {
|
||||
return waError.Error()
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
func waSetError(err error) {
|
||||
waError = err
|
||||
}
|
||||
func waClearError() {
|
||||
waError = nil
|
||||
}
|
||||
|
||||
func waDebugString(filename, code string) string {
|
||||
cfg := api.DefaultConfig()
|
||||
cfg.WaArch = api.WaArch_wasm
|
||||
cfg.WaOS = api.WaOS_chrome
|
||||
|
||||
prog, err := loader.LoadProgramFile(cfg, filename, code)
|
||||
if err != nil || prog == nil {
|
||||
return err.Error()
|
||||
}
|
||||
|
||||
return prog.DebugString()
|
||||
}
|
||||
|
||||
func waGenerateWat(filename, code string) string {
|
||||
cfg := api.DefaultConfig()
|
||||
cfg.WaArch = api.WaArch_wasm
|
||||
cfg.WaOS = api.WaOS_chrome
|
||||
|
||||
wat, err := waBuildFile(cfg, filename, code)
|
||||
if err != nil {
|
||||
if waGetError() == nil {
|
||||
waSetError(err)
|
||||
}
|
||||
return ""
|
||||
}
|
||||
return string(wat)
|
||||
}
|
||||
|
||||
func waFormatCode(filename, code string) string {
|
||||
newCode, err := api.FormatCode(filename, code)
|
||||
if err != nil {
|
||||
if waGetError() == nil {
|
||||
waSetError(err)
|
||||
}
|
||||
return code
|
||||
}
|
||||
return newCode
|
||||
}
|
||||
|
||||
// 构建 wat 目标
|
||||
func waBuildFile(cfg *config.Config, filename string, src interface{}) (wat []byte, err error) {
|
||||
prog, err := loader.LoadProgramFile(cfg, filename, src)
|
||||
if err != nil || prog == nil {
|
||||
logger.Tracef(&config.EnableTrace_api, "LoadProgramVFS failed, err = %v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
watOut, err := compiler_wat.New().Compile(prog, "main")
|
||||
return []byte(watOut), err
|
||||
}
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
// 版权 @2022 凹语言 作者。保留所有权利。
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
var (
|
||||
flagDbgOut = flag.String("dbg", "a.out.dbg", "debug output file")
|
||||
flagWatOut = flag.String("wat", "a.out.wat", "wat output file")
|
||||
)
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
os.Remove(*flagDbgOut)
|
||||
os.Remove(*flagWatOut)
|
||||
|
||||
fmt.Println("=== WARN: only for build wa.wasm === ")
|
||||
|
||||
waClearError()
|
||||
|
||||
outDbg := waDebugString(waName, waCode)
|
||||
outWat := waGenerateWat(waName, waCode)
|
||||
|
||||
if serr := waGetErrorText(); serr != "" {
|
||||
fmt.Println("ERR:", serr)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
os.WriteFile(*flagDbgOut, []byte(outDbg), 0666)
|
||||
os.WriteFile(*flagWatOut, []byte(outWat), 0666)
|
||||
|
||||
fmt.Println("Done")
|
||||
}
|
||||
|
||||
const waName = "hello.wa"
|
||||
const waCode = `// 版权 @2019 凹语言 作者。保留所有权利。
|
||||
|
||||
import "fmt"
|
||||
import "runtime"
|
||||
|
||||
func main {
|
||||
println("你好,凹语言!", runtime.WAOS)
|
||||
println(add(40, 2))
|
||||
|
||||
fmt.Println(1+1)
|
||||
}
|
||||
|
||||
func add(a: i32, b: i32) => i32 {
|
||||
return a+b
|
||||
}
|
||||
`
|
||||
|
|
@ -1,638 +0,0 @@
|
|||
// 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.
|
||||
|
||||
// Go1.17.13
|
||||
|
||||
(() => {
|
||||
// Map multiple JavaScript environments to a single common API,
|
||||
// preferring web standards over Node.js API.
|
||||
//
|
||||
// Environments considered:
|
||||
// - Browsers
|
||||
// - Node.js
|
||||
// - Electron
|
||||
// - Parcel
|
||||
// - Webpack
|
||||
|
||||
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) {
|
||||
const fs = require("fs");
|
||||
if (typeof fs === "object" && fs !== null && Object.keys(fs).length !== 0) {
|
||||
global.fs = fs;
|
||||
}
|
||||
}
|
||||
|
||||
const enosys = () => {
|
||||
const err = new Error("not implemented");
|
||||
err.code = "ENOSYS";
|
||||
return err;
|
||||
};
|
||||
|
||||
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) {
|
||||
callback(enosys());
|
||||
return;
|
||||
}
|
||||
const n = this.writeSync(fd, buf);
|
||||
callback(null, n);
|
||||
},
|
||||
chmod(path, mode, callback) { callback(enosys()); },
|
||||
chown(path, uid, gid, callback) { callback(enosys()); },
|
||||
close(fd, callback) { callback(enosys()); },
|
||||
fchmod(fd, mode, callback) { callback(enosys()); },
|
||||
fchown(fd, uid, gid, callback) { callback(enosys()); },
|
||||
fstat(fd, callback) { callback(enosys()); },
|
||||
fsync(fd, callback) { callback(null); },
|
||||
ftruncate(fd, length, callback) { callback(enosys()); },
|
||||
lchown(path, uid, gid, callback) { callback(enosys()); },
|
||||
link(path, link, callback) { callback(enosys()); },
|
||||
lstat(path, callback) { callback(enosys()); },
|
||||
mkdir(path, perm, callback) { callback(enosys()); },
|
||||
open(path, flags, mode, callback) { callback(enosys()); },
|
||||
read(fd, buffer, offset, length, position, callback) { callback(enosys()); },
|
||||
readdir(path, callback) { callback(enosys()); },
|
||||
readlink(path, callback) { callback(enosys()); },
|
||||
rename(from, to, callback) { callback(enosys()); },
|
||||
rmdir(path, callback) { callback(enosys()); },
|
||||
stat(path, callback) { callback(enosys()); },
|
||||
symlink(path, link, callback) { callback(enosys()); },
|
||||
truncate(path, length, callback) { callback(enosys()); },
|
||||
unlink(path, callback) { callback(enosys()); },
|
||||
utimes(path, atime, mtime, callback) { callback(enosys()); },
|
||||
};
|
||||
}
|
||||
|
||||
if (!global.process) {
|
||||
global.process = {
|
||||
getuid() { return -1; },
|
||||
getgid() { return -1; },
|
||||
geteuid() { return -1; },
|
||||
getegid() { return -1; },
|
||||
getgroups() { throw enosys(); },
|
||||
pid: -1,
|
||||
ppid: -1,
|
||||
umask() { throw enosys(); },
|
||||
cwd() { throw enosys(); },
|
||||
chdir() { throw enosys(); },
|
||||
}
|
||||
}
|
||||
|
||||
if (!global.crypto && global.require) {
|
||||
const nodeCrypto = require("crypto");
|
||||
global.crypto = {
|
||||
getRandomValues(b) {
|
||||
nodeCrypto.randomFillSync(b);
|
||||
},
|
||||
};
|
||||
}
|
||||
if (!global.crypto) {
|
||||
throw new Error("global.crypto is not available, polyfill required (getRandomValues only)");
|
||||
}
|
||||
|
||||
if (!global.performance) {
|
||||
global.performance = {
|
||||
now() {
|
||||
const [sec, nsec] = process.hrtime();
|
||||
return sec * 1000 + nsec / 1000000;
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
if (!global.TextEncoder && global.require) {
|
||||
global.TextEncoder = require("util").TextEncoder;
|
||||
}
|
||||
if (!global.TextEncoder) {
|
||||
throw new Error("global.TextEncoder is not available, polyfill required");
|
||||
}
|
||||
|
||||
if (!global.TextDecoder && global.require) {
|
||||
global.TextDecoder = require("util").TextDecoder;
|
||||
}
|
||||
if (!global.TextDecoder) {
|
||||
throw new Error("global.TextDecoder is not available, polyfill required");
|
||||
}
|
||||
|
||||
// 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 setInt64 = (addr, v) => {
|
||||
this.mem.setUint32(addr + 0, v, true);
|
||||
this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true);
|
||||
}
|
||||
|
||||
const getInt64 = (addr) => {
|
||||
const low = this.mem.getUint32(addr + 0, true);
|
||||
const high = this.mem.getInt32(addr + 4, true);
|
||||
return low + high * 4294967296;
|
||||
}
|
||||
|
||||
const loadValue = (addr) => {
|
||||
const f = this.mem.getFloat64(addr, true);
|
||||
if (f === 0) {
|
||||
return undefined;
|
||||
}
|
||||
if (!isNaN(f)) {
|
||||
return f;
|
||||
}
|
||||
|
||||
const id = this.mem.getUint32(addr, true);
|
||||
return this._values[id];
|
||||
}
|
||||
|
||||
const storeValue = (addr, v) => {
|
||||
const nanHead = 0x7FF80000;
|
||||
|
||||
if (typeof v === "number" && v !== 0) {
|
||||
if (isNaN(v)) {
|
||||
this.mem.setUint32(addr + 4, nanHead, true);
|
||||
this.mem.setUint32(addr, 0, true);
|
||||
return;
|
||||
}
|
||||
this.mem.setFloat64(addr, v, true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (v === undefined) {
|
||||
this.mem.setFloat64(addr, 0, true);
|
||||
return;
|
||||
}
|
||||
|
||||
let id = this._ids.get(v);
|
||||
if (id === undefined) {
|
||||
id = this._idPool.pop();
|
||||
if (id === undefined) {
|
||||
id = this._values.length;
|
||||
}
|
||||
this._values[id] = v;
|
||||
this._goRefCounts[id] = 0;
|
||||
this._ids.set(v, id);
|
||||
}
|
||||
this._goRefCounts[id]++;
|
||||
let typeFlag = 0;
|
||||
switch (typeof v) {
|
||||
case "object":
|
||||
if (v !== null) {
|
||||
typeFlag = 1;
|
||||
}
|
||||
break;
|
||||
case "string":
|
||||
typeFlag = 2;
|
||||
break;
|
||||
case "symbol":
|
||||
typeFlag = 3;
|
||||
break;
|
||||
case "function":
|
||||
typeFlag = 4;
|
||||
break;
|
||||
}
|
||||
this.mem.setUint32(addr + 4, nanHead | typeFlag, true);
|
||||
this.mem.setUint32(addr, id, 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) => {
|
||||
sp >>>= 0;
|
||||
const code = this.mem.getInt32(sp + 8, true);
|
||||
this.exited = true;
|
||||
delete this._inst;
|
||||
delete this._values;
|
||||
delete this._goRefCounts;
|
||||
delete this._ids;
|
||||
delete this._idPool;
|
||||
this.exit(code);
|
||||
},
|
||||
|
||||
// func wasmWrite(fd uintptr, p unsafe.Pointer, n int32)
|
||||
"runtime.wasmWrite": (sp) => {
|
||||
sp >>>= 0;
|
||||
const fd = getInt64(sp + 8);
|
||||
const p = getInt64(sp + 16);
|
||||
const n = this.mem.getInt32(sp + 24, true);
|
||||
fs.writeSync(fd, new Uint8Array(this._inst.exports.mem.buffer, p, n));
|
||||
},
|
||||
|
||||
// func resetMemoryDataView()
|
||||
"runtime.resetMemoryDataView": (sp) => {
|
||||
sp >>>= 0;
|
||||
this.mem = new DataView(this._inst.exports.mem.buffer);
|
||||
},
|
||||
|
||||
// func nanotime1() int64
|
||||
"runtime.nanotime1": (sp) => {
|
||||
sp >>>= 0;
|
||||
setInt64(sp + 8, (timeOrigin + performance.now()) * 1000000);
|
||||
},
|
||||
|
||||
// func walltime() (sec int64, nsec int32)
|
||||
"runtime.walltime": (sp) => {
|
||||
sp >>>= 0;
|
||||
const msec = (new Date).getTime();
|
||||
setInt64(sp + 8, msec / 1000);
|
||||
this.mem.setInt32(sp + 16, (msec % 1000) * 1000000, true);
|
||||
},
|
||||
|
||||
// func scheduleTimeoutEvent(delay int64) int32
|
||||
"runtime.scheduleTimeoutEvent": (sp) => {
|
||||
sp >>>= 0;
|
||||
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
|
||||
));
|
||||
this.mem.setInt32(sp + 16, id, true);
|
||||
},
|
||||
|
||||
// func clearTimeoutEvent(id int32)
|
||||
"runtime.clearTimeoutEvent": (sp) => {
|
||||
sp >>>= 0;
|
||||
const id = this.mem.getInt32(sp + 8, true);
|
||||
clearTimeout(this._scheduledTimeouts.get(id));
|
||||
this._scheduledTimeouts.delete(id);
|
||||
},
|
||||
|
||||
// func getRandomData(r []byte)
|
||||
"runtime.getRandomData": (sp) => {
|
||||
sp >>>= 0;
|
||||
crypto.getRandomValues(loadSlice(sp + 8));
|
||||
},
|
||||
|
||||
// func finalizeRef(v ref)
|
||||
"syscall/js.finalizeRef": (sp) => {
|
||||
sp >>>= 0;
|
||||
const id = this.mem.getUint32(sp + 8, true);
|
||||
this._goRefCounts[id]--;
|
||||
if (this._goRefCounts[id] === 0) {
|
||||
const v = this._values[id];
|
||||
this._values[id] = null;
|
||||
this._ids.delete(v);
|
||||
this._idPool.push(id);
|
||||
}
|
||||
},
|
||||
|
||||
// func stringVal(value string) ref
|
||||
"syscall/js.stringVal": (sp) => {
|
||||
sp >>>= 0;
|
||||
storeValue(sp + 24, loadString(sp + 8));
|
||||
},
|
||||
|
||||
// func valueGet(v ref, p string) ref
|
||||
"syscall/js.valueGet": (sp) => {
|
||||
sp >>>= 0;
|
||||
const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16));
|
||||
sp = this._inst.exports.getsp() >>> 0; // see comment above
|
||||
storeValue(sp + 32, result);
|
||||
},
|
||||
|
||||
// func valueSet(v ref, p string, x ref)
|
||||
"syscall/js.valueSet": (sp) => {
|
||||
sp >>>= 0;
|
||||
Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32));
|
||||
},
|
||||
|
||||
// func valueDelete(v ref, p string)
|
||||
"syscall/js.valueDelete": (sp) => {
|
||||
sp >>>= 0;
|
||||
Reflect.deleteProperty(loadValue(sp + 8), loadString(sp + 16));
|
||||
},
|
||||
|
||||
// func valueIndex(v ref, i int) ref
|
||||
"syscall/js.valueIndex": (sp) => {
|
||||
sp >>>= 0;
|
||||
storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16)));
|
||||
},
|
||||
|
||||
// valueSetIndex(v ref, i int, x ref)
|
||||
"syscall/js.valueSetIndex": (sp) => {
|
||||
sp >>>= 0;
|
||||
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) => {
|
||||
sp >>>= 0;
|
||||
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() >>> 0; // see comment above
|
||||
storeValue(sp + 56, result);
|
||||
this.mem.setUint8(sp + 64, 1);
|
||||
} catch (err) {
|
||||
sp = this._inst.exports.getsp() >>> 0; // see comment above
|
||||
storeValue(sp + 56, err);
|
||||
this.mem.setUint8(sp + 64, 0);
|
||||
}
|
||||
},
|
||||
|
||||
// func valueInvoke(v ref, args []ref) (ref, bool)
|
||||
"syscall/js.valueInvoke": (sp) => {
|
||||
sp >>>= 0;
|
||||
try {
|
||||
const v = loadValue(sp + 8);
|
||||
const args = loadSliceOfValues(sp + 16);
|
||||
const result = Reflect.apply(v, undefined, args);
|
||||
sp = this._inst.exports.getsp() >>> 0; // see comment above
|
||||
storeValue(sp + 40, result);
|
||||
this.mem.setUint8(sp + 48, 1);
|
||||
} catch (err) {
|
||||
sp = this._inst.exports.getsp() >>> 0; // see comment above
|
||||
storeValue(sp + 40, err);
|
||||
this.mem.setUint8(sp + 48, 0);
|
||||
}
|
||||
},
|
||||
|
||||
// func valueNew(v ref, args []ref) (ref, bool)
|
||||
"syscall/js.valueNew": (sp) => {
|
||||
sp >>>= 0;
|
||||
try {
|
||||
const v = loadValue(sp + 8);
|
||||
const args = loadSliceOfValues(sp + 16);
|
||||
const result = Reflect.construct(v, args);
|
||||
sp = this._inst.exports.getsp() >>> 0; // see comment above
|
||||
storeValue(sp + 40, result);
|
||||
this.mem.setUint8(sp + 48, 1);
|
||||
} catch (err) {
|
||||
sp = this._inst.exports.getsp() >>> 0; // see comment above
|
||||
storeValue(sp + 40, err);
|
||||
this.mem.setUint8(sp + 48, 0);
|
||||
}
|
||||
},
|
||||
|
||||
// func valueLength(v ref) int
|
||||
"syscall/js.valueLength": (sp) => {
|
||||
sp >>>= 0;
|
||||
setInt64(sp + 16, parseInt(loadValue(sp + 8).length));
|
||||
},
|
||||
|
||||
// valuePrepareString(v ref) (ref, int)
|
||||
"syscall/js.valuePrepareString": (sp) => {
|
||||
sp >>>= 0;
|
||||
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) => {
|
||||
sp >>>= 0;
|
||||
const str = loadValue(sp + 8);
|
||||
loadSlice(sp + 16).set(str);
|
||||
},
|
||||
|
||||
// func valueInstanceOf(v ref, t ref) bool
|
||||
"syscall/js.valueInstanceOf": (sp) => {
|
||||
sp >>>= 0;
|
||||
this.mem.setUint8(sp + 24, (loadValue(sp + 8) instanceof loadValue(sp + 16)) ? 1 : 0);
|
||||
},
|
||||
|
||||
// func copyBytesToGo(dst []byte, src ref) (int, bool)
|
||||
"syscall/js.copyBytesToGo": (sp) => {
|
||||
sp >>>= 0;
|
||||
const dst = loadSlice(sp + 8);
|
||||
const src = loadValue(sp + 32);
|
||||
if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) {
|
||||
this.mem.setUint8(sp + 48, 0);
|
||||
return;
|
||||
}
|
||||
const toCopy = src.subarray(0, dst.length);
|
||||
dst.set(toCopy);
|
||||
setInt64(sp + 40, toCopy.length);
|
||||
this.mem.setUint8(sp + 48, 1);
|
||||
},
|
||||
|
||||
// func copyBytesToJS(dst ref, src []byte) (int, bool)
|
||||
"syscall/js.copyBytesToJS": (sp) => {
|
||||
sp >>>= 0;
|
||||
const dst = loadValue(sp + 8);
|
||||
const src = loadSlice(sp + 16);
|
||||
if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) {
|
||||
this.mem.setUint8(sp + 48, 0);
|
||||
return;
|
||||
}
|
||||
const toCopy = src.subarray(0, dst.length);
|
||||
dst.set(toCopy);
|
||||
setInt64(sp + 40, toCopy.length);
|
||||
this.mem.setUint8(sp + 48, 1);
|
||||
},
|
||||
|
||||
"debug": (value) => {
|
||||
console.log(value);
|
||||
},
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
async run(instance) {
|
||||
if (!(instance instanceof WebAssembly.Instance)) {
|
||||
throw new Error("Go.run: WebAssembly.Instance expected");
|
||||
}
|
||||
this._inst = instance;
|
||||
this.mem = new DataView(this._inst.exports.mem.buffer);
|
||||
this._values = [ // JS values that Go currently has references to, indexed by reference id
|
||||
NaN,
|
||||
0,
|
||||
null,
|
||||
true,
|
||||
false,
|
||||
global,
|
||||
this,
|
||||
];
|
||||
this._goRefCounts = new Array(this._values.length).fill(Infinity); // number of references that Go has to a JS value, indexed by reference id
|
||||
this._ids = new Map([ // mapping from JS values to reference ids
|
||||
[0, 1],
|
||||
[null, 2],
|
||||
[true, 3],
|
||||
[false, 4],
|
||||
[global, 5],
|
||||
[this, 6],
|
||||
]);
|
||||
this._idPool = []; // unused ids that have been garbage collected
|
||||
this.exited = false; // whether the Go program has exited
|
||||
|
||||
// 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(this.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));
|
||||
});
|
||||
argvPtrs.push(0);
|
||||
|
||||
const keys = Object.keys(this.env).sort();
|
||||
keys.forEach((key) => {
|
||||
argvPtrs.push(strPtr(`${key}=${this.env[key]}`));
|
||||
});
|
||||
argvPtrs.push(0);
|
||||
|
||||
const argv = offset;
|
||||
argvPtrs.forEach((ptr) => {
|
||||
this.mem.setUint32(offset, ptr, true);
|
||||
this.mem.setUint32(offset + 4, 0, true);
|
||||
offset += 8;
|
||||
});
|
||||
|
||||
// The linker guarantees global data starts from at least wasmMinDataAddr.
|
||||
// Keep in sync with cmd/link/internal/ld/data.go:wasmMinDataAddr.
|
||||
const wasmMinDataAddr = 4096 + 8192;
|
||||
if (offset >= wasmMinDataAddr) {
|
||||
throw new Error("total length of command line and environment variables exceeds limit");
|
||||
}
|
||||
|
||||
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 (
|
||||
typeof module !== "undefined" &&
|
||||
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);
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
|
@ -1,132 +0,0 @@
|
|||
unsigned char app_wasm[] = {
|
||||
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x2a, 0x08, 0x60,
|
||||
0x01, 0x7f, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x00, 0x60, 0x00, 0x01, 0x7f,
|
||||
0x60, 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f, 0x01,
|
||||
0x7f, 0x60, 0x01, 0x7f, 0x02, 0x7f, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x03,
|
||||
0x7f, 0x7f, 0x7f, 0x00, 0x02, 0x6f, 0x06, 0x07, 0x61, 0x72, 0x64, 0x75,
|
||||
0x69, 0x6e, 0x6f, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x00, 0x00, 0x07,
|
||||
0x61, 0x72, 0x64, 0x75, 0x69, 0x6e, 0x6f, 0x07, 0x70, 0x69, 0x6e, 0x4d,
|
||||
0x6f, 0x64, 0x65, 0x00, 0x01, 0x07, 0x61, 0x72, 0x64, 0x75, 0x69, 0x6e,
|
||||
0x6f, 0x0c, 0x64, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x57, 0x72, 0x69,
|
||||
0x74, 0x65, 0x00, 0x01, 0x07, 0x61, 0x72, 0x64, 0x75, 0x69, 0x6e, 0x6f,
|
||||
0x06, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x00, 0x02, 0x07, 0x61, 0x72,
|
||||
0x64, 0x75, 0x69, 0x6e, 0x6f, 0x09, 0x67, 0x65, 0x74, 0x50, 0x69, 0x6e,
|
||||
0x4c, 0x45, 0x44, 0x00, 0x02, 0x07, 0x61, 0x72, 0x64, 0x75, 0x69, 0x6e,
|
||||
0x6f, 0x05, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x00, 0x01, 0x03, 0x13, 0x12,
|
||||
0x03, 0x00, 0x04, 0x05, 0x03, 0x00, 0x06, 0x06, 0x00, 0x00, 0x01, 0x06,
|
||||
0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x04, 0x04, 0x01, 0x70, 0x00, 0x01,
|
||||
0x05, 0x03, 0x01, 0x00, 0x01, 0x06, 0x43, 0x0d, 0x7f, 0x01, 0x41, 0x80,
|
||||
0x10, 0x0b, 0x7f, 0x01, 0x41, 0x00, 0x0b, 0x7f, 0x01, 0x41, 0x00, 0x0b,
|
||||
0x7f, 0x01, 0x41, 0x00, 0x0b, 0x7f, 0x01, 0x41, 0x00, 0x0b, 0x7f, 0x01,
|
||||
0x41, 0x00, 0x0b, 0x7f, 0x01, 0x41, 0x00, 0x0b, 0x7f, 0x01, 0x41, 0x00,
|
||||
0x0b, 0x7f, 0x01, 0x41, 0x00, 0x0b, 0x7f, 0x01, 0x41, 0x00, 0x0b, 0x7f,
|
||||
0x01, 0x41, 0x00, 0x0b, 0x7f, 0x01, 0x41, 0x00, 0x0b, 0x7f, 0x01, 0x41,
|
||||
0x00, 0x0b, 0x07, 0xdc, 0x01, 0x0c, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72,
|
||||
0x79, 0x02, 0x00, 0x0c, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e,
|
||||
0x69, 0x6e, 0x69, 0x74, 0x00, 0x0d, 0x13, 0x24, 0x72, 0x75, 0x6e, 0x74,
|
||||
0x69, 0x6d, 0x65, 0x2e, 0x77, 0x61, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x49,
|
||||
0x33, 0x32, 0x00, 0x0e, 0x14, 0x24, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d,
|
||||
0x65, 0x2e, 0x77, 0x61, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x52, 0x75, 0x6e,
|
||||
0x65, 0x00, 0x0f, 0x0f, 0x24, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65,
|
||||
0x2e, 0x77, 0x61, 0x50, 0x75, 0x74, 0x73, 0x00, 0x10, 0x0f, 0x5f, 0x5f,
|
||||
0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x5f, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x23,
|
||||
0x31, 0x00, 0x11, 0x0d, 0x5f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x5f,
|
||||
0x2e, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x12, 0x0d, 0x5f, 0x5f, 0x6d, 0x61,
|
||||
0x69, 0x6e, 0x5f, 0x5f, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x00, 0x13, 0x14,
|
||||
0x73, 0x79, 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x24, 0x61, 0x72, 0x64, 0x75,
|
||||
0x69, 0x6e, 0x6f, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x00, 0x14, 0x17, 0x73,
|
||||
0x79, 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x24, 0x61, 0x72, 0x64, 0x75, 0x69,
|
||||
0x6e, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x6c, 0x6e, 0x00, 0x15,
|
||||
0x15, 0x73, 0x79, 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x24, 0x61, 0x72, 0x64,
|
||||
0x75, 0x69, 0x6e, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x00, 0x16,
|
||||
0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x17, 0x0a, 0xcb, 0x07,
|
||||
0x12, 0x0b, 0x00, 0x23, 0x00, 0x23, 0x00, 0x20, 0x00, 0x6a, 0x24, 0x00,
|
||||
0x0b, 0x02, 0x00, 0x0b, 0x25, 0x00, 0x20, 0x00, 0x20, 0x00, 0x04, 0x40,
|
||||
0x20, 0x00, 0x41, 0x01, 0x36, 0x00, 0x00, 0x20, 0x00, 0x20, 0x01, 0x36,
|
||||
0x00, 0x04, 0x20, 0x00, 0x20, 0x02, 0x36, 0x00, 0x08, 0x20, 0x00, 0x20,
|
||||
0x03, 0x36, 0x00, 0x0c, 0x0b, 0x0b, 0x06, 0x00, 0x20, 0x00, 0x20, 0x00,
|
||||
0x0b, 0x16, 0x00, 0x20, 0x00, 0x20, 0x00, 0x04, 0x40, 0x20, 0x00, 0x20,
|
||||
0x00, 0x28, 0x00, 0x00, 0x41, 0x01, 0x6a, 0x36, 0x00, 0x00, 0x0b, 0x0b,
|
||||
0x6d, 0x01, 0x05, 0x7f, 0x20, 0x00, 0x41, 0x00, 0x46, 0x04, 0x40, 0x0f,
|
||||
0x0b, 0x20, 0x00, 0x28, 0x00, 0x00, 0x41, 0x01, 0x6b, 0x21, 0x01, 0x20,
|
||||
0x01, 0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x36, 0x00, 0x00, 0x05, 0x20,
|
||||
0x00, 0x28, 0x00, 0x08, 0x21, 0x03, 0x20, 0x03, 0x04, 0x40, 0x20, 0x00,
|
||||
0x28, 0x00, 0x04, 0x21, 0x02, 0x20, 0x02, 0x04, 0x40, 0x20, 0x00, 0x28,
|
||||
0x00, 0x0c, 0x21, 0x04, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x03,
|
||||
0x40, 0x20, 0x05, 0x20, 0x03, 0x11, 0x00, 0x00, 0x20, 0x02, 0x41, 0x01,
|
||||
0x6b, 0x21, 0x02, 0x20, 0x02, 0x04, 0x40, 0x20, 0x05, 0x20, 0x04, 0x6a,
|
||||
0x21, 0x05, 0x0c, 0x01, 0x0b, 0x0b, 0x0b, 0x0b, 0x20, 0x00, 0x10, 0x07,
|
||||
0x0b, 0x0b, 0x2c, 0x00, 0x41, 0x04, 0x10, 0x06, 0x24, 0x03, 0x41, 0x04,
|
||||
0x10, 0x06, 0x24, 0x04, 0x41, 0x04, 0x10, 0x06, 0x24, 0x05, 0x41, 0x04,
|
||||
0x10, 0x06, 0x24, 0x07, 0x41, 0x04, 0x10, 0x06, 0x24, 0x08, 0x41, 0x0c,
|
||||
0x10, 0x06, 0x24, 0x09, 0x41, 0x04, 0x10, 0x06, 0x24, 0x0b, 0x0b, 0x6c,
|
||||
0x01, 0x03, 0x7f, 0x41, 0x00, 0x21, 0x00, 0x41, 0x00, 0x21, 0x01, 0x41,
|
||||
0x00, 0x21, 0x02, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02,
|
||||
0x40, 0x02, 0x40, 0x20, 0x00, 0x0e, 0x03, 0x00, 0x01, 0x02, 0x00, 0x0b,
|
||||
0x41, 0x00, 0x21, 0x01, 0x23, 0x0a, 0x21, 0x02, 0x20, 0x02, 0x04, 0x40,
|
||||
0x0c, 0x02, 0x05, 0x0c, 0x01, 0x0b, 0x0b, 0x41, 0x01, 0x21, 0x01, 0x41,
|
||||
0x01, 0x24, 0x0a, 0x10, 0x14, 0x23, 0x09, 0x41, 0x00, 0x10, 0x0a, 0x23,
|
||||
0x09, 0x28, 0x00, 0x00, 0x10, 0x0b, 0x36, 0x00, 0x00, 0x23, 0x09, 0x41,
|
||||
0x08, 0x36, 0x00, 0x04, 0x23, 0x09, 0x41, 0x07, 0x36, 0x00, 0x08, 0x0c,
|
||||
0x00, 0x0b, 0x41, 0x02, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x0b, 0x0b, 0x0b,
|
||||
0x24, 0x01, 0x02, 0x7f, 0x41, 0x00, 0x21, 0x01, 0x41, 0x00, 0x21, 0x02,
|
||||
0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x0e, 0x01,
|
||||
0x00, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x02, 0x0c, 0x02, 0x0b, 0x0b, 0x0b,
|
||||
0x0b, 0x24, 0x01, 0x02, 0x7f, 0x41, 0x00, 0x21, 0x01, 0x41, 0x00, 0x21,
|
||||
0x02, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x0e,
|
||||
0x01, 0x00, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x02, 0x0c, 0x02, 0x0b, 0x0b,
|
||||
0x0b, 0x0b, 0x2a, 0x01, 0x02, 0x7f, 0x41, 0x00, 0x21, 0x02, 0x41, 0x00,
|
||||
0x21, 0x03, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02,
|
||||
0x0e, 0x01, 0x00, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x03, 0x20, 0x00, 0x20,
|
||||
0x01, 0x10, 0x05, 0x0c, 0x02, 0x0b, 0x0b, 0x0b, 0x0b, 0x49, 0x01, 0x03,
|
||||
0x7f, 0x41, 0x00, 0x21, 0x00, 0x41, 0x00, 0x21, 0x01, 0x41, 0x00, 0x21,
|
||||
0x02, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x0e,
|
||||
0x01, 0x00, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x01, 0x23, 0x0b, 0x28, 0x00,
|
||||
0x00, 0x21, 0x02, 0x20, 0x02, 0x41, 0x01, 0x10, 0x01, 0x41, 0x00, 0x10,
|
||||
0x0a, 0x41, 0x0f, 0x41, 0x25, 0x10, 0x16, 0x41, 0x00, 0x10, 0x0a, 0x41,
|
||||
0x34, 0x41, 0x14, 0x10, 0x16, 0x0c, 0x02, 0x0b, 0x0b, 0x0b, 0x0b, 0x74,
|
||||
0x01, 0x06, 0x7f, 0x41, 0x00, 0x21, 0x00, 0x41, 0x00, 0x21, 0x01, 0x41,
|
||||
0x00, 0x21, 0x02, 0x41, 0x00, 0x21, 0x03, 0x41, 0x00, 0x21, 0x04, 0x41,
|
||||
0x00, 0x21, 0x05, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02,
|
||||
0x40, 0x20, 0x00, 0x0e, 0x02, 0x00, 0x01, 0x00, 0x0b, 0x41, 0x00, 0x21,
|
||||
0x01, 0x0c, 0x00, 0x0b, 0x41, 0x01, 0x21, 0x01, 0x23, 0x0b, 0x28, 0x00,
|
||||
0x00, 0x21, 0x02, 0x23, 0x05, 0x28, 0x00, 0x00, 0x21, 0x03, 0x20, 0x02,
|
||||
0x20, 0x03, 0x10, 0x02, 0x41, 0xe4, 0x00, 0x10, 0x00, 0x23, 0x0b, 0x28,
|
||||
0x00, 0x00, 0x21, 0x04, 0x23, 0x03, 0x28, 0x00, 0x00, 0x21, 0x05, 0x20,
|
||||
0x04, 0x20, 0x05, 0x10, 0x02, 0x41, 0x84, 0x07, 0x10, 0x00, 0x41, 0x01,
|
||||
0x21, 0x00, 0x0c, 0x01, 0x0b, 0x0b, 0x0b, 0x0b, 0x5f, 0x01, 0x04, 0x7f,
|
||||
0x41, 0x00, 0x21, 0x00, 0x41, 0x00, 0x21, 0x01, 0x41, 0x00, 0x21, 0x02,
|
||||
0x41, 0x00, 0x21, 0x03, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40,
|
||||
0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x0e, 0x03, 0x00, 0x01, 0x02, 0x00,
|
||||
0x0b, 0x41, 0x00, 0x21, 0x01, 0x23, 0x0c, 0x21, 0x02, 0x20, 0x02, 0x04,
|
||||
0x40, 0x0c, 0x02, 0x05, 0x0c, 0x01, 0x0b, 0x0b, 0x41, 0x01, 0x21, 0x01,
|
||||
0x41, 0x01, 0x24, 0x0c, 0x10, 0x14, 0x10, 0x04, 0x21, 0x03, 0x23, 0x0b,
|
||||
0x20, 0x03, 0x36, 0x00, 0x00, 0x10, 0x11, 0x0c, 0x00, 0x0b, 0x41, 0x02,
|
||||
0x21, 0x01, 0x0c, 0x02, 0x0b, 0x0b, 0x0b, 0x0b, 0x6f, 0x01, 0x03, 0x7f,
|
||||
0x41, 0x00, 0x21, 0x00, 0x41, 0x00, 0x21, 0x01, 0x41, 0x00, 0x21, 0x02,
|
||||
0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40,
|
||||
0x20, 0x00, 0x0e, 0x03, 0x00, 0x01, 0x02, 0x00, 0x0b, 0x41, 0x00, 0x21,
|
||||
0x01, 0x23, 0x06, 0x21, 0x02, 0x20, 0x02, 0x04, 0x40, 0x0c, 0x02, 0x05,
|
||||
0x0c, 0x01, 0x0b, 0x0b, 0x41, 0x01, 0x21, 0x01, 0x41, 0x01, 0x24, 0x06,
|
||||
0x23, 0x03, 0x41, 0x00, 0x36, 0x00, 0x00, 0x23, 0x05, 0x41, 0x01, 0x36,
|
||||
0x00, 0x00, 0x23, 0x04, 0x41, 0x00, 0x36, 0x00, 0x00, 0x23, 0x08, 0x41,
|
||||
0x01, 0x36, 0x00, 0x00, 0x23, 0x07, 0x41, 0x02, 0x36, 0x00, 0x00, 0x0c,
|
||||
0x00, 0x0b, 0x41, 0x02, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x0b, 0x0b, 0x0b,
|
||||
0x32, 0x01, 0x02, 0x7f, 0x41, 0x00, 0x21, 0x03, 0x41, 0x00, 0x21, 0x04,
|
||||
0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x0e, 0x01,
|
||||
0x00, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x20, 0x01, 0x20, 0x02, 0x10,
|
||||
0x10, 0x41, 0x0a, 0x10, 0x0f, 0x0c, 0x02, 0x0b, 0x0b, 0x0b, 0x20, 0x00,
|
||||
0x10, 0x0b, 0x0b, 0x2e, 0x01, 0x02, 0x7f, 0x41, 0x00, 0x21, 0x03, 0x41,
|
||||
0x00, 0x21, 0x04, 0x02, 0x40, 0x03, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20,
|
||||
0x03, 0x0e, 0x01, 0x00, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x04, 0x20, 0x01,
|
||||
0x20, 0x02, 0x10, 0x10, 0x0c, 0x02, 0x0b, 0x0b, 0x0b, 0x20, 0x00, 0x10,
|
||||
0x0b, 0x0b, 0x08, 0x00, 0x10, 0x0c, 0x10, 0x13, 0x10, 0x12, 0x0b, 0x0b,
|
||||
0x4e, 0x01, 0x00, 0x41, 0x00, 0x0b, 0x48, 0x24, 0x24, 0x77, 0x61, 0x64,
|
||||
0x73, 0x24, 0x24, 0x61, 0x72, 0x64, 0x75, 0x69, 0x6e, 0x6f, 0xe5, 0x87,
|
||||
0xb9, 0xe8, 0xaf, 0xad, 0xe8, 0xa8, 0x80, 0x28, 0x57, 0x61, 0x29, 0x2f,
|
||||
0x41, 0x72, 0x64, 0x75, 0x69, 0x6e, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x72,
|
||||
0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x68,
|
||||
0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x61, 0x2d, 0x6c, 0x61,
|
||||
0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x0a
|
||||
};
|
||||
unsigned int app_wasm_len = 1543;
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
# 版权 @2023 凹语言 作者。保留所有权利。
|
||||
|
||||
default:
|
||||
go run ../../main.go yacc -l -p=expr -c="copyright.txt" -o="y.wa" expr.y
|
||||
go run ../../main.go y.wa
|
||||
|
||||
clean:
|
||||
-rm y.* a.out*
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
:: 版权 @2023 凹语言 作者。保留所有权利。
|
||||
|
||||
setlocal
|
||||
|
||||
cd %~dp0
|
||||
|
||||
go run ../../main.go yacc -l -p=expr -c="copyright.txt" -o="y.wa" expr.y
|
||||
go run ../../main.go "y.wa"
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
build:
|
||||
-@rm ./web/*.wasm
|
||||
#go run ../../main.go fmt ./src/main.wa
|
||||
#go run ../../main.go fmt ./src/canvas/canvas.wa
|
||||
|
||||
go run ../../main.go build -o ./web/snake.wasm .
|
||||
|
||||
run:
|
||||
make build
|
||||
cd web && python3 -m http.server
|
||||
|
||||
publish:
|
||||
make build
|
||||
-rm -rf ../../docs/snake/
|
||||
mkdir -p ../../docs/snake
|
||||
cp ./web/* ../../docs/snake/
|
||||
|
||||
clean:
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
wa build _examples/snake
|
||||
wat2wasm a.out.wat
|
||||
copy a.out.wasm _examples/snake/web/snake.wasm
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
default:
|
||||
go run ../../main.go surface.wa
|
||||
|
||||
clean:
|
||||
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
我们计划在完成凹中文前端的重构(即完全脱离现有的Go前端)之时,得到一套稳定的中文语法。
|
||||
|
||||
现在可运行的示例,请参考凹语言工程中的[可执行示例](https://gitee.com/wa-lang/wa/tree/frontend_wz/_examples/wz/)。
|
||||
现在可运行的示例,请参考凹语言工程中的[可执行示例](https://gitee.com/wa-lang/wa/tree/frontend_wz/waroot/examples/wz/)。
|
||||
|
||||
## 简单示例
|
||||
|
||||
|
|
|
|||
15
hello.wa
15
hello.wa
|
|
@ -1,15 +0,0 @@
|
|||
// 版权 @2019 凹语言 作者。保留所有权利。
|
||||
|
||||
import "fmt"
|
||||
import "runtime"
|
||||
|
||||
func main {
|
||||
println("你好,凹语言!", runtime.WAOS)
|
||||
println(add(40, 2))
|
||||
|
||||
fmt.Println("1+1 =", 1+1)
|
||||
}
|
||||
|
||||
func add(a: i32, b: i32) => i32 {
|
||||
return a+b
|
||||
}
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
default:
|
||||
|
||||
ci-test-all:
|
||||
@echo "== _examples test begin =="
|
||||
@echo "== examples test begin =="
|
||||
|
||||
# loop forever
|
||||
# cd ./arduino && make
|
||||
|
|
@ -19,14 +19,14 @@ ci-test-all:
|
|||
# snake
|
||||
cd ./snake && make publish
|
||||
|
||||
go run ../main.go copy.wa
|
||||
go run ../main.go eq.wa
|
||||
go run ../main.go interface_named.wa
|
||||
go run ../main.go short-var.wa
|
||||
go run ../main.go strbytes.wa
|
||||
go run ../main.go struct.wa
|
||||
go run ../../main.go copy.wa
|
||||
go run ../../main.go eq.wa
|
||||
go run ../../main.go interface_named.wa
|
||||
go run ../../main.go short-var.wa
|
||||
go run ../../main.go strbytes.wa
|
||||
go run ../../main.go struct.wa
|
||||
|
||||
@echo "== _examples ok =="
|
||||
@echo "== examples ok =="
|
||||
|
||||
clean:
|
||||
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
# 版权 @2022 凹语言 作者。保留所有权利。
|
||||
|
||||
default:
|
||||
go run ../../main.go -target=arduino hello.wat
|
||||
go run ../../../main.go -target=arduino hello.wat
|
||||
|
||||
clean:
|
||||
-rm *.wasm
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
default:
|
||||
go run ../../main.go -target=arduino app.wa
|
||||
go run ../../../main.go -target=arduino app.wa
|
||||
|
||||
build:
|
||||
go run ../../main.go build -target=arduino app.wa
|
||||
go run ../../../main.go build -target=arduino app.wa
|
||||
wat2wasm a.out.wat -o app.wasm
|
||||
xxd -i app.wasm > app.wasm.h
|
||||
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
// 版权 @2022 凹语言 作者。保留所有权利。
|
||||
|
||||
// Wa/Arduino 源代码位置
|
||||
// https://gitee.com/wa-lang/wa/tree/master/_examples/arduino
|
||||
// https://gitee.com/wa-lang/wa/tree/master/waroot/examples/arduino
|
||||
|
||||
// 导入 Wasm3 头文件
|
||||
//
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
# 版权 @2022 凹语言 作者。保留所有权利。
|
||||
|
||||
default:
|
||||
go run ../../main.go
|
||||
go run ../../../main.go
|
||||
|
||||
clean:
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
# go install wa-lang.org/wa@dev-wasi
|
||||
# WA:=wa
|
||||
|
||||
WA:=go run ../../main.go
|
||||
WA:=go run ../../../main.go
|
||||
|
||||
run:
|
||||
$(WA) run hello.wa
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
# 版权 @2023 凹语言 作者。保留所有权利。
|
||||
|
||||
default:
|
||||
go run ../../../main.go yacc -l -p=expr -c="copyright.txt" -o="y.wa" expr.y
|
||||
go run ../../../main.go y.wa
|
||||
|
||||
clean:
|
||||
-rm y.* a.out*
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
:: 版权 @2023 凹语言 作者。保留所有权利。
|
||||
|
||||
setlocal
|
||||
|
||||
cd %~dp0
|
||||
|
||||
go run ../../../main.go yacc -l -p=expr -c="copyright.txt" -o="y.wa" expr.y
|
||||
go run ../../../main.go "y.wa"
|
||||
|
|
@ -1,10 +1,10 @@
|
|||
# 版权 @2023 凹语言 作者。保留所有权利。
|
||||
|
||||
default:
|
||||
go run ../../main.go run .
|
||||
go run ../../../main.go run .
|
||||
|
||||
test:
|
||||
go run ../../main.go test .
|
||||
go run ../../../main.go test .
|
||||
|
||||
clean:
|
||||
-rm a.out*
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue