提交 37830f7a 编写于 作者: chai2010's avatar chai2010

增加 os.Environ 函数

上级 11ec6901
......@@ -53,6 +53,17 @@ func RunWasm(cfg *config.Config, filename string, wasmArgs ...string) (stdoutStd
WithSysWalltime().
WithArgs(append([]string{wasmExe}, wasmArgs...)...)
for _, s := range os.Environ() {
var key, value string
if kv := strings.Split(s, "="); len(kv) >= 2 {
key = kv[0]
value = kv[1]
} else if len(kv) >= 1 {
key = kv[0]
}
conf = conf.WithEnv(key, value)
}
ctx := context.Background()
r := wazero.NewRuntime(ctx)
defer r.Close(ctx)
......
......@@ -2,12 +2,22 @@
var Args []string
var environs []string
#wa:linkname runtime.os_get_args
func os_get_args() => []string
#wa:linkname runtime.os_get_environs
func os_get_environs() => []string
#wa:linkname $runtime.procExit
func Exit(code: i32)
func init {
Args = os_get_args()
environs = os_get_environs()
}
func Environ() []string {
return environs
}
// 版权 @2023 凹语言 作者。保留所有权利。
func os_get_environs() => []string {
var environc: i32
var environv_buf_size: i32
environSizesGet(refToPtr_i32(&environc), refToPtr_i32(&environv_buf_size))
if environc == 0 {
return nil
}
var environvBytes = make([]byte, environc*4)
var environvU32 = make([]u32, environc)
var environv_buf = make([]byte, environv_buf_size)
var environv_buf_ptr: i32 = refToPtr_byteSlice(environv_buf)
environGet(refToPtr_byteSlice(environvBytes), environv_buf_ptr)
for i := 0; i < len(environvBytes); i += 4 {
a0 := u32(environvBytes[i+0]);
a1 := u32(environvBytes[i+1]);
a2 := u32(environvBytes[i+2]);
a3 := u32(environvBytes[i+3]);
environvU32[i/4] = a0 + a1*256 + a2*256*256 + a3*256*256*256
}
var environs = make([]string, environc)
for i := 0; i < int(environc); i++ {
var off = i32(environvU32[i]) - environv_buf_ptr
environs[i] = getCStr(environv_buf, off)
}
return environs
}
......@@ -14,6 +14,17 @@ func argsGet(result_argv: i32, result_argv_buf: i32) => (errno: i32) {
return
}
#wa:linkname $runtime.environSizesGet
func environSizesGet(result_environc: i32, result_environv_len: i32) => (errno: i32) {
return
}
#wa:linkname $runtime.environGet
func environGet(result_environv: i32, result_environv_buf: i32) => (errno: i32) {
return
}
#wa:linkname $runtime.fdWrite
func fdWrite(fd: i32, io: i32, iovs_len: i32, nwritten: i32) => (written: i32) {
return
......
......@@ -12,6 +12,16 @@ func argsGet(result_argv: i32, result_argv_buf: i32) => (errno: i32) {
return
}
#wa:linkname $runtime.environSizesGet
func environSizesGet(result_environc: i32, result_environv_len: i32) => (errno: i32) {
return
}
#wa:linkname $runtime.environGet
func environGet(result_environv: i32, result_environv_buf: i32) => (errno: i32) {
return
}
#wa:linkname $runtime.fdWrite
func fdWrite(fd: i32, io: i32, iovs_len: i32, nwritten: i32) => (written: i32) {
return
......
......@@ -10,6 +10,14 @@ func argsSizesGet(result_argc: i32, result_argv_len: i32) => (errno: i32)
#wa:linkname $runtime.argsGet
func argsGet(result_argv: i32, result_argv_buf: i32) => (errno: i32)
#wa:import wasi_snapshot_preview1 environ_sizes_get
#wa:linkname $runtime.environSizesGet
func environSizesGet(result_environc: i32, result_environv_len: i32) => (errno: i32)
#wa:import wasi_snapshot_preview1 environ_get
#wa:linkname $runtime.environGet
func environGet(result_environv: i32, result_environv_buf: i32) => (errno: i32)
#wa:import wasi_snapshot_preview1 fd_write
#wa:linkname $runtime.fdWrite
func fdWrite(fd: i32, io: i32, iovs_len: i32, nwritten: i32) => (errno: i32)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册