Merge branch 'master' into feat-c-api-cross-compilation-2

This commit is contained in:
Ivan Enderlin
2021-01-29 11:55:14 +01:00
11 changed files with 120 additions and 87 deletions

View File

@@ -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
}

View File

@@ -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);