Safe gnu lightning bindings for rust
```rust use lightning_sys::{Jit, Reg, JitPointer};
let jit = Jit::new(); let mut js = jit.new_state();
js.prolog(); let inarg = js.arg(); js.getarg_i(Reg::R(0), &inarg); js.addi(Reg::R(0), Reg::R(0), 1); js.retr(Reg::R(0));
let incr = unsafe { js.emit::
asserteq!(incr(5), 6); asserteq!(incr(6), 7);
```
printf
```rust extern crate libc;
use std::ffi::CString; use lightning_sys::{Jit, JitWord, Reg, JitPointer}; use std::convert::TryInto;
fn main() { let jit = Jit::new(); let mut js = jit.new_state();
// make sure this outlives any calls
let cs = CString::new("generated %d bytes\n").unwrap();
let start = js.note(file!(), line!());
js.prolog();
let inarg = js.arg();
js.getarg_i(Reg::R(1), &inarg);
js.prepare();
js.pushargi(cs.as_ptr() as JitWord);
js.ellipsis();
js.pushargr(Reg::R(1));
js.finishi(libc::printf as JitPointer);
js.ret();
js.epilog();
let end = js.note(file!(), line!());
let my_function = unsafe{ js.emit::<extern fn(i32)>() };
/* call the generated code, passing its size as argument */
my_function((js.address(&end) as u64 - js.address(&start) as u64).try_into().unwrap());
js.clear();
// TODO: dissasembly has not been implemented yet
// js.dissasemble();
}
```
cargo test -- --test-threads=1