Skip to content

Commit

Permalink
js 目标增加文件读写内部函数(调试用)
Browse files Browse the repository at this point in the history
  • Loading branch information
chai2010 committed Nov 29, 2023
1 parent 15a0ed5 commit 2b09c30
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 4 deletions.
7 changes: 6 additions & 1 deletion internal/app/apprun/apprun.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ var CmdRun = &cli.Command{
Usage: "set http address",
Value: ":8000",
},
&cli.BoolFlag{
Name: "console",
Usage: "set console mode",
Value: false,
},
},
Action: CmdRunAction,
}
Expand All @@ -49,7 +54,7 @@ func CmdRunAction(c *cli.Context) error {
}

// Web 模式启动服务器
if opt.TargetOS == config.WaOS_js && appbase.IsNativeDir(input) {
if !c.Bool("console") && opt.TargetOS == config.WaOS_js && appbase.IsNativeDir(input) {
var addr = c.String("http")
if strings.HasPrefix(addr, ":") {
addr = "localhost" + addr
Expand Down
39 changes: 39 additions & 0 deletions internal/wazero/js.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package wazero
import (
"context"
"fmt"
"os"

"wa-lang.org/wazero"
"wa-lang.org/wazero/api"
Expand Down Expand Up @@ -108,6 +109,44 @@ func JsInstantiate(ctx context.Context, rt wazero.Runtime) (api.Closer, error) {
WithParameterNames("ptr", "len").
Export("print_str").

// 非标准, 仅用于辅助测试
// func read_file_len(name_ptr, name_len) => i32
NewFunctionBuilder().
WithFunc(func(ctx context.Context, m api.Module, name_ptr, name_len uint32) uint32 {
name_bytes, _ := m.Memory().Read(ctx, name_ptr, name_len)
if fi, err := os.Lstat(string(name_bytes)); err == nil {
return uint32(fi.Size())
}
return 0
}).
WithParameterNames("name_ptr", "name_len").
Export("read_file_len").

// 非标准, 仅用于辅助测试
// func read_file_data(name_ptr, name_len, data_ptr)
NewFunctionBuilder().
WithFunc(func(ctx context.Context, m api.Module, name_ptr, name_len, data_ptr, data_len uint32) {
name_bytes, _ := m.Memory().Read(ctx, name_ptr, name_len)
data, _ := os.ReadFile(string(name_bytes))
if len(data) > int(data_len) {
data = data[:data_len]
}
m.Memory().Write(ctx, data_ptr, data)
}).
WithParameterNames("name_ptr", "name_len", "data_ptr", "data_len").
Export("read_file_data").

// 非标准, 仅用于辅助测试
// func write_file(name_ptr, name_len, data_ptr, data_len: i32)
NewFunctionBuilder().
WithFunc(func(ctx context.Context, m api.Module, name_ptr, name_len, data_ptr, data_len uint32) {
name_bytes, _ := m.Memory().Read(ctx, name_ptr, name_len)
data_bytes, _ := m.Memory().Read(ctx, data_ptr, data_len)
os.WriteFile(string(name_bytes), data_bytes, 0666)
}).
WithParameterNames("name_ptr", "name_len", "data_ptr", "data_len").
Export("write_file").

// func proc_exit(code: i32)
NewFunctionBuilder().
WithFunc(func(ctx context.Context, m api.Module, exitCode uint32) {
Expand Down
11 changes: 11 additions & 0 deletions waroot/src/debug/debug.wa
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// 版权 @2023 凹语言 作者。保留所有权利。

#wa:build !js

func ReadFile(name: string) => []byte {
panic("unsupport")
}

func WriteFile(name: string, data: []byte) {
panic("unsupport")
}
32 changes: 32 additions & 0 deletions waroot/src/debug/debug_js.wa
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// 版权 @2023 凹语言 作者。保留所有权利。

#wa:linkname $wa.runtime.slice_to_ptr
func slice_to_ptr(t: []byte) => i32

#wa:linkname $wa.runtime.string_to_ptr
func string_to_ptr(s: string) => i32

#wa:import syscall_js read_file_len
func read_file_len(name_ptr, name_len: i32) => i32

#wa:import syscall_js read_file_data
func read_file_data(name_ptr, name_len, data_ptr: i32)

#wa:import syscall_js write_file
func write_file(name_ptr, name_len, data_ptr, data_len: i32)

func ReadFile(name: string) => []byte {
size := read_file_len(string_to_ptr(name), len(name))
data := make([]byte, size)
read_file_data(
string_to_ptr(name), len(name),
slice_to_ptr(data),
)
}

func WriteFile(name: string, data: []byte) {
write_file(
string_to_ptr(name), len(name),
slice_to_ptr(data), len(data),
)
}
2 changes: 0 additions & 2 deletions waroot/src/syscall/js/proc.wa

This file was deleted.

3 changes: 2 additions & 1 deletion waroot/waroot.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ func GetStdPkgList() []string {
func GetStdTestPkgList() []string {
var ss []string
for _, s := range stdPkgs {
if s == "unsafe" {
if s == "unsafe" || s == "debug" {
continue
}
if strings.HasPrefix(s, "syscall") {
Expand All @@ -134,6 +134,7 @@ var stdPkgs = []string{
"encoding/base64", // API 完整
"encoding/binary", // API 部分
"encoding/hex", // API 完整
"debug", // ?
"fmt", // ?
"hash", // API 完整
"hash/crc32", // API 完整
Expand Down

0 comments on commit 2b09c30

Please sign in to comment.