mirror of
https://github.com/odin-lang/Odin.git
synced 2026-05-02 02:54:41 +00:00
wasi: make the demo run on wasi and run it in CI
This commit is contained in:
@@ -22,6 +22,11 @@ when !ODIN_TEST && !ODIN_NO_ENTRY_POINT {
|
||||
@(link_name="_start", linkage="strong", require, export)
|
||||
_start :: proc "c" () {
|
||||
context = default_context()
|
||||
|
||||
when ODIN_OS == .WASI {
|
||||
_wasi_setup_args()
|
||||
}
|
||||
|
||||
#force_no_inline _startup_runtime()
|
||||
intrinsics.__entry_point()
|
||||
}
|
||||
|
||||
@@ -2,10 +2,54 @@
|
||||
//+private
|
||||
package runtime
|
||||
|
||||
import "core:sys/wasm/wasi"
|
||||
foreign import wasi "wasi_snapshot_preview1"
|
||||
|
||||
@(default_calling_convention="contextless")
|
||||
foreign wasi {
|
||||
fd_write :: proc(
|
||||
fd: i32,
|
||||
iovs: [][]byte,
|
||||
n: ^uint,
|
||||
) -> u16 ---
|
||||
|
||||
@(private="file")
|
||||
args_sizes_get :: proc(
|
||||
num_of_args: ^uint,
|
||||
size_of_args: ^uint,
|
||||
) -> u16 ---
|
||||
|
||||
@(private="file")
|
||||
args_get :: proc(
|
||||
argv: [^]cstring,
|
||||
argv_buf: [^]byte,
|
||||
) -> u16 ---
|
||||
}
|
||||
|
||||
_stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) {
|
||||
data_iovec := (wasi.ciovec_t)(data)
|
||||
n, err := wasi.fd_write(1, {data_iovec})
|
||||
n: uint
|
||||
err := fd_write(1, {data}, &n)
|
||||
return int(n), _OS_Errno(err)
|
||||
}
|
||||
|
||||
_wasi_setup_args :: proc() {
|
||||
num_of_args, size_of_args: uint
|
||||
if errno := args_sizes_get(&num_of_args, &size_of_args); errno != 0 {
|
||||
return
|
||||
}
|
||||
|
||||
err: Allocator_Error
|
||||
if args__, err = make([]cstring, num_of_args); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
args_buf: []byte
|
||||
if args_buf, err = make([]byte, size_of_args); err != nil {
|
||||
delete(args__)
|
||||
return
|
||||
}
|
||||
|
||||
if errno := args_get(raw_data(args__), raw_data(args_buf)); errno != 0 {
|
||||
delete(args__)
|
||||
delete(args_buf)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -760,7 +760,7 @@ free :: proc(a: ^WASM_Allocator, ptr: rawptr, loc := #caller_location) {
|
||||
defer unlock(a)
|
||||
|
||||
size := region.size
|
||||
assert(region_is_in_use(region), "double free", loc=loc)
|
||||
assert(region_is_in_use(region), "double free or corrupt region", loc=loc)
|
||||
|
||||
prev_region_size_field := ([^]uint)(region)[-1]
|
||||
prev_region_size := prev_region_size_field & ~uint(FREE_REGION_FLAG)
|
||||
|
||||
Reference in New Issue
Block a user