From 43a70a9c17cf5aa2ca35dd63b7d3b19c0375076c Mon Sep 17 00:00:00 2001 From: Tinco Andringa Date: Mon, 10 Apr 2017 18:05:25 +0200 Subject: [PATCH] Introduce rb_proc_new and test it --- src/rproc.rs | 2 ++ src/vm.rs | 1 + tests/rproc_test.rs | 25 +++++++++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 tests/rproc_test.rs diff --git a/src/rproc.rs b/src/rproc.rs index df779476..3da0fcea 100644 --- a/src/rproc.rs +++ b/src/rproc.rs @@ -6,4 +6,6 @@ extern "C" { argv: *const Value, pass_procval: Value) -> Value; + + pub fn rb_proc_new(func: extern fn(Value) -> Value, binding: Value) -> Value; } diff --git a/src/vm.rs b/src/vm.rs index 69f22be0..99433aaf 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -2,6 +2,7 @@ use types::{CallbackPtr, c_char, c_int, c_void, Value}; extern "C" { pub fn ruby_init(); + pub fn ruby_cleanup(code: c_int) -> c_int; pub fn rb_block_proc() -> Value; pub fn rb_block_given_p() -> c_int; pub fn rb_raise(exception: Value, message: *const c_char); diff --git a/tests/rproc_test.rs b/tests/rproc_test.rs new file mode 100644 index 00000000..52a88b48 --- /dev/null +++ b/tests/rproc_test.rs @@ -0,0 +1,25 @@ +extern crate ruby_sys; +use ruby_sys::{vm,rproc, value, fixnum}; + +#[test] +fn rb_proc_new_works_with_one_argument() { + unsafe { vm::ruby_init() }; + + let nil = value::Value { value: value::RubySpecialConsts::Nil as usize }; + + extern fn test_fn(v: value::Value) -> value::Value { + return v; + } + + unsafe { + let val = fixnum::rb_int2inum(3); + let rproc = rproc::rb_proc_new(test_fn, nil); + let result = rproc::rb_proc_call_with_block(rproc, 1, vec![val].as_ptr(), nil); + + assert!(!result.is_nil()); + let val_result = fixnum::rb_num2int(result); + assert!(3 == val_result); + } + + unsafe { vm::ruby_cleanup(0) }; +}