added arguments to __spawn_process
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 1 Dec 2021 21:23:09 +0000 (15:23 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 1 Dec 2021 21:23:09 +0000 (15:23 -0600)
core/runtime/onyx_run.onyx
src/wasm_runtime.c

index ca1af5a14b96234b015f13cb8327c95cf4b9d4c2..4b2fd6d4dd4ac90cd7926bd868d07e77bc2c42a7 100644 (file)
@@ -17,4 +17,4 @@ use package wasi
     #export "_thread_exit"  _thread_exit
 }
 
-__spawn_process :: (path: str) -> i32 #foreign "env" "spawn_process" ---
\ No newline at end of file
+__spawn_process :: (path: str, args: [] str) -> i32 #foreign "env" "spawn_process" ---
\ No newline at end of file
index e8ff234d0ab1ce86c986d5b34066bd53b4b8d65b..3a0a8d5802a1443120aeaa858e9906ce088dc710 100644 (file)
@@ -175,15 +175,32 @@ static wasm_trap_t* onyx_kill_thread_impl(const wasm_val_vec_t* params, wasm_val
 static wasm_trap_t* onyx_spawn_process_impl(const wasm_val_vec_t* params, wasm_val_vec_t* results) {
     char* process_str = (char *) wasm_memory_data(wasm_memory) + params->data[0].of.i32;
     i32   process_len = params->data[1].of.i32;
+    i32   args_ptr    = params->data[2].of.i32;
+    i32   args_len    = params->data[3].of.i32;
 
     char process_path[1024];
     process_len = bh_min(1023, process_len);
     memcpy(process_path, process_str, process_len);
     process_path[process_len] = '\0';
 
+    char **process_args = bh_alloc_array(global_scratch_allocator, char *, args_len + 2);
+    byte_t* data = wasm_memory_data(wasm_memory);
+    byte_t* array_loc = data + args_ptr;
+    fori (i, 1, args_len + 1) {
+        char *arg_str = data + *(i32 *) (array_loc + (i - 1) * 8);
+        i32   arg_len = *(i32 *) (array_loc + (i - 1) * 8 + 4);
+
+        char *arg = bh_alloc_array(global_scratch_allocator, char, arg_len + 1);
+        memcpy(arg, arg_str, arg_len);
+        arg[arg_len] = '\0';
+        process_args[i] = arg;
+    }
+    process_args[0] = process_path;
+    process_args[args_len + 1] = NULL;
+
     #ifdef _BH_LINUX
         if (fork() == 0) {
-            execv(process_path, NULL);
+            execv(process_path, process_args);
         }
 
         i32 status;
@@ -295,7 +312,9 @@ void onyx_run_wasm(bh_buffer wasm_bytes) {
             }
 
             if (wasm_name_equals_string(import_name, "spawn_process")) {
-                wasm_functype_t* func_type = wasm_functype_new_2_1(wasm_valtype_new_i32(), wasm_valtype_new_i32(), wasm_valtype_new_i32());
+                wasm_functype_t* func_type = wasm_functype_new_4_1(
+                    wasm_valtype_new_i32(), wasm_valtype_new_i32(), wasm_valtype_new_i32(), wasm_valtype_new_i32(),
+                    wasm_valtype_new_i32());
 
                 wasm_func_t* wasm_func = wasm_func_new(wasm_store, func_type, onyx_spawn_process_impl);
                 import = wasm_func_as_extern(wasm_func);