Greetings,
I have a executable binary and a shared object (implemented in rust) with a
C ABI.
I'm passing a capnp message from the binary through the C ABI.
This is what the schema looks like:
@0xc98fff04bdc3a38a;
struct Input {
gas @0 :Int32;
code @1 :List(Data);
data @2 :List(Data);
}
struct Output {
gas @0 :Int32;
code @1 :List(Data);
}
struct InputOutput {
input @0 :Input;
output @1 :Output;
}
this is the executable binary
fn evaluate(msg: vm_capnp::input_output::Reader) ->
libloading::Result<vm_capnp::input_output::Reader>
{ let lib = libloading::Library::new("libsputnikvm.so").expect("cannot load"
);
unsafe {
let func: libloading::Symbol<unsafe extern fn(vm_capnp::input_output::Reader)
-> vm_capnp::input_output::Reader> = try!(lib.get(b"evaluate"));
Ok(func(msg))
}
}
this is what the C ABI shared object receiving code looks like:
use vm_capnp::input_output::Reader;
#[no_mangle]
pub extern fn evaluate(ptr: *mut Reader) {
let msg = unsafe {
assert!(!ptr.is_null());
&mut *ptr
};
let io_reader = serialize::read_message(&mut msg,
message::ReaderOptions::new()).expect("read message failed."); let io =
io_reader.get_root::<Reader>().expect("Failed to get VM IO.");
println!("{}", io.get_input().expect("FAILED").get_gas());
}
The error message is this:
error[E0277]: the trait bound `vm_capnp::input_output::Reader<'_>:
std::io::Read` is not satisfied
--> src/lib.rs:31:21
|
31 | let io_reader = serialize::read_message(&mut msg,
message::ReaderOptions::new()).expect("read message failed.");
| ^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::io::Read`
is not implemented for `vm_capnp::input_output::Reader<'_>`
|
= note: required because of the requirements on the impl of
`std::io::Read` for `&mut vm_capnp::input_output::Reader<'_>`
= note: required by `capnp::serialize::read_message`
I would really like to deserialize correctly, I'm doing something very
wrong. I know it's something small I'm missing.
You can reproduce by doing this:
git clone github.com/sjmackenzie/sputnikvm
cd sputnikvm
capnp eval --binary tests/mod.capnp all > tests.bin && RUST_BACKTRACE=full
cargo run --bin gaslighter -- -t tests.bin -k -r //
The relevant lines of code for the binary
(https://github.com/sjmackenzie/sputnikvm/blob/dev/src/bin/gaslighter/mod.rs#L88)
for the receiving shared object library
(https://github.com/sjmackenzie/sputnikvm/blob/dev/src/lib.rs#L25)
Thanks in advance
kr/sjm
--
You received this message because you are subscribed to the Google Groups
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
Visit this group at https://groups.google.com/group/capnproto.