mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-06 20:58:28 +00:00
Merge branch 'master' into feat-c-api-cross-compilation-2
This commit is contained in:
@@ -13,6 +13,7 @@ use super::{
|
||||
// required due to really weird Rust resolution rules for macros
|
||||
// https://github.com/rust-lang/rust/issues/57966
|
||||
use crate::error::{update_last_error, CApiError};
|
||||
use std::cmp::min;
|
||||
use std::convert::TryFrom;
|
||||
use std::ffi::CStr;
|
||||
use std::os::raw::c_char;
|
||||
@@ -275,12 +276,16 @@ pub unsafe extern "C" fn wasi_env_read_stderr(
|
||||
|
||||
fn read_inner(wasi_file: &mut Box<dyn WasiFile>, inner_buffer: &mut [u8]) -> isize {
|
||||
if let Some(oc) = wasi_file.downcast_mut::<capture_files::OutputCapturer>() {
|
||||
let mut num_bytes_written = 0;
|
||||
for (address, value) in inner_buffer.iter_mut().zip(oc.buffer.drain(..)) {
|
||||
let total_to_read = min(inner_buffer.len(), oc.buffer.len());
|
||||
|
||||
for (address, value) in inner_buffer
|
||||
.iter_mut()
|
||||
.zip(oc.buffer.drain(..total_to_read))
|
||||
{
|
||||
*address = value;
|
||||
num_bytes_written += 1;
|
||||
}
|
||||
num_bytes_written
|
||||
|
||||
total_to_read as isize
|
||||
} else {
|
||||
-1
|
||||
}
|
||||
|
||||
@@ -58,6 +58,7 @@ int main(int argc, const char* argv[]) {
|
||||
const char* js_string = "function greet(name) { return JSON.stringify('Hello, ' + name); }; print(greet('World'));";
|
||||
wasi_config_arg(config, "--eval");
|
||||
wasi_config_arg(config, js_string);
|
||||
wasi_config_capture_stdout(config);
|
||||
|
||||
wasi_env_t* wasi_env = wasi_env_new(config);
|
||||
if (!wasi_env) {
|
||||
@@ -125,16 +126,35 @@ int main(int argc, const char* argv[]) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
char buffer[BUF_SIZE] = { 0 };
|
||||
size_t result = BUF_SIZE;
|
||||
for (size_t i = 0;
|
||||
// TODO: this code is too clever, make the control flow more obvious here
|
||||
result == BUF_SIZE &&
|
||||
(result = wasi_env_read_stdout(wasi_env, buffer, BUF_SIZE));
|
||||
++i) {
|
||||
printf("%.*s", BUF_SIZE, buffer);
|
||||
{
|
||||
FILE *memory_stream;
|
||||
char* stdout;
|
||||
size_t stdout_size = 0;
|
||||
|
||||
memory_stream = open_memstream(&stdout, &stdout_size);
|
||||
|
||||
if (NULL == memory_stream) {
|
||||
printf("> Error creating a memory stream.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
char buffer[BUF_SIZE] = { 0 };
|
||||
size_t data_read_size = BUF_SIZE;
|
||||
|
||||
do {
|
||||
data_read_size = wasi_env_read_stdout(wasi_env, buffer, BUF_SIZE);
|
||||
|
||||
if (data_read_size > 0) {
|
||||
stdout_size += data_read_size;
|
||||
fwrite(buffer, sizeof(char), data_read_size, memory_stream);
|
||||
}
|
||||
} while (BUF_SIZE == data_read_size);
|
||||
|
||||
fclose(memory_stream);
|
||||
|
||||
printf("WASI Stdout: `%.*s`\n", (int) stdout_size, stdout);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
|
||||
wasm_extern_vec_delete(&exports);
|
||||
wasm_extern_vec_delete(&imports);
|
||||
|
||||
Reference in New Issue
Block a user