diff --git a/src/macros.rs b/src/macros.rs index ac98e29..8c1df77 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -135,40 +135,43 @@ macro_rules! mrfn { // init ( @init ) => (); - ( @init $name:ident, bool ) => (let $name = uninitialized::();); - ( @init $name:ident, i32 ) => (let $name = uninitialized::();); - ( @init $name:ident, f64 ) => (let $name = uninitialized::();); - ( @init $name:ident, (&str) ) => (let $name = uninitialized::<*const c_char>();); - ( @init $name:ident, (Vec) ) => (let $name = uninitialized::();); - ( @init $name:ident, Class ) => (let $name = uninitialized::();); - ( @init $name:ident, (&$_t:ty) ) => (let $name = uninitialized::();); - ( @init $name:ident : $t:tt ) => (mrfn!(@init $name, $t)); + ( @init $name:ident, bool ) => (let $name = uninitialized::();); + ( @init $name:ident, i32 ) => (let $name = uninitialized::();); + ( @init $name:ident, f64 ) => (let $name = uninitialized::();); + ( @init $name:ident, (&str) ) => (let $name = uninitialized::<*const c_char>();); + ( @init $name:ident, (Vec) ) => (let $name = uninitialized::();); + ( @init $name:ident, Class ) => (let $name = uninitialized::();); + ( @init $name:ident, (&mut $_t:ty) ) => (let $name = uninitialized::();); + ( @init $name:ident, (&$_t:ty) ) => (let $name = uninitialized::();); + ( @init $name:ident : $t:tt ) => (mrfn!(@init $name, $t)); ( @init $name:ident : $t:tt, $($names:ident : $ts:tt),+ ) => { mrfn!(@init $name, $t); mrfn!(@init $( $names : $ts ),*); }; // sig - ( @sig ) => (""); - ( @sig bool ) => ("b"); - ( @sig i32 ) => ("i"); - ( @sig f64 ) => ("f"); - ( @sig (&str) ) => ("z"); - ( @sig (Vec) ) => ("A"); - ( @sig Class ) => ("C"); - ( @sig (&$_t:ty) ) => ("o"); + ( @sig ) => (""); + ( @sig bool ) => ("b"); + ( @sig i32 ) => ("i"); + ( @sig f64 ) => ("f"); + ( @sig (&str) ) => ("z"); + ( @sig (Vec) ) => ("A"); + ( @sig Class ) => ("C"); + ( @sig (&mut $_t:ty) ) => ("o"); + ( @sig (&$_t:ty) ) => ("o"); ( @sig $t:tt, $( $ts:tt ),+ ) => (concat!(mrfn!(@sig $t), mrfn!(@sig $( $ts ),*))); // args - ( @args ) => (); - ( @args $name:ident, bool ) => (&$name as *const bool); - ( @args $name:ident, i32 ) => (&$name as *const i32); - ( @args $name:ident, f64 ) => (&$name as *const f64); - ( @args $name:ident, (&str) ) => (&$name as *const *const c_char); - ( @args $name:ident, (Vec) ) => (&$name as *const MrValue); - ( @args $name:ident, Class ) => (&$name as *const MrValue); - ( @args $name:ident, (&$_t:ty) ) => (&$name as *const MrValue); - ( @args $name:ident : $t:tt ) => (mrfn!(@args $name, $t)); + ( @args ) => (); + ( @args $name:ident, bool ) => (&$name as *const bool); + ( @args $name:ident, i32 ) => (&$name as *const i32); + ( @args $name:ident, f64 ) => (&$name as *const f64); + ( @args $name:ident, (&str) ) => (&$name as *const *const c_char); + ( @args $name:ident, (Vec) ) => (&$name as *const MrValue); + ( @args $name:ident, Class ) => (&$name as *const MrValue); + ( @args $name:ident, (&mut $_t:ty) ) => (&$name as *const MrValue); + ( @args $name:ident, (&$_t:ty) ) => (&$name as *const MrValue); + ( @args $name:ident : $t:tt ) => (mrfn!(@args $name, $t)); ( @args $mrb:expr, $sig:expr, $name:ident : $t:tt) => { mrb_get_args($mrb, $sig, mrfn!(@args $name, $t)); }; @@ -223,6 +226,9 @@ macro_rules! mrfn { ( @conv $mruby:expr, $name:ident, Value ) => { let $name = Value::new($mruby.clone(), $name); }; + ( @conv $mruby:expr, $name:ident, (&mut $t:ty) ) => { + let $name = Value::new($mruby.clone(), $name).to_obj::<$t>().unwrap(); + }; ( @conv $mruby:expr, $name:ident, (&$t:ty) ) => { let $name = Value::new($mruby.clone(), $name).to_obj::<$t>().unwrap(); }; @@ -240,12 +246,14 @@ macro_rules! mrfn { ( @slf $slf:ident, (Vec) ) => (let $slf = $slf.to_vec().unwrap();); ( @slf $slf:ident, Class ) => (let $slf = $slf.to_class().unwrap();); ( @slf $slf:ident, Value ) => (); + ( @slf $slf:ident, (&mut $t:ty) ) => (let $slf = $slf.to_obj::<$t>().unwrap();); ( @slf $slf:ident, (&$t:ty) ) => (let $slf = $slf.to_obj::<$t>().unwrap();); // borrow - ( @borrow $name:ident, (&str) ) => (); - ( @borrow $name:ident, (&$t:ty) ) => (let $name = $name.borrow()); - ( @borrow $name:ident, $_t:tt ) => (); + ( @borrow $name:ident, (&str) ) => (); + ( @borrow $name:ident, (&mut $t:ty) ) => (let mut $name = $name.borrow_mut()); + ( @borrow $name:ident, (&$t:ty) ) => (let $name = $name.borrow()); + ( @borrow $name:ident, $_t:tt ) => (); ( @borrow $name:ident : $t:tt ) => (mrfn!(@borrow $name, $t)); ( @borrow $name:ident : $t:tt, $($names:ident : $ts:tt),+ ) => { mrfn!(@borrow $name, $t); diff --git a/tests/api/scalar.rs b/tests/api/scalar.rs index 6969cf2..c7d62bf 100644 --- a/tests/api/scalar.rs +++ b/tests/api/scalar.rs @@ -20,6 +20,10 @@ impl Scalar { value: value } } + + pub fn set_value(&mut self, value: f32) { + self.value = value; + } } mrusty_class!(Scalar, { @@ -31,6 +35,12 @@ mrusty_class!(Scalar, { mruby.float(slf.value as f64) }); + def!("value=", |mruby, slf: (&mut Scalar), v: f64| { + slf.set_value(v as f32); + + mruby.nil() + }); + def!("*", |mruby, slf: (&Scalar), vector: (&Vector)| { mruby.obj((*slf).clone() * (*vector).clone()) });