Skip to content

Commit ed5f4fc

Browse files
[WASM] Implement parsing command line arguments
1 parent f968bba commit ed5f4fc

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

stdlib/public/stubs/CommandLine.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,42 @@ char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
206206

207207
return outBuf;
208208
}
209+
#elif defined(__wasi__)
210+
#include <wasi/api.h>
211+
#include <wasi/libc.h>
212+
#include <stdlib.h>
213+
214+
SWIFT_RUNTIME_STDLIB_API
215+
char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
216+
assert(outArgLen != nullptr);
217+
218+
if (_swift_stdlib_ProcessOverrideUnsafeArgv) {
219+
*outArgLen = _swift_stdlib_ProcessOverrideUnsafeArgc;
220+
return _swift_stdlib_ProcessOverrideUnsafeArgv;
221+
}
222+
223+
__wasi_errno_t err;
224+
225+
size_t argv_buf_size;
226+
size_t argc;
227+
err = __wasi_args_sizes_get(&argc, &argv_buf_size);
228+
if (err != __WASI_ERRNO_SUCCESS) return nullptr;
229+
230+
size_t num_ptrs = argc + 1;
231+
char *argv_buf = (char *)malloc(argv_buf_size);
232+
char **argv = (char **)calloc(num_ptrs, sizeof(char *));
233+
234+
err = __wasi_args_get((uint8_t **)argv, (uint8_t *)argv_buf);
235+
if (err != __WASI_ERRNO_SUCCESS) {
236+
free(argv_buf);
237+
free(argv);
238+
return nullptr;
239+
}
240+
241+
*outArgLen = static_cast<int>(argc);
242+
243+
return argv;
244+
}
209245
#else // Add your favorite OS's command line arg grabber here.
210246
SWIFT_RUNTIME_STDLIB_API
211247
char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {

0 commit comments

Comments
 (0)