Skip to content

Commit 17f7b7e

Browse files
committed
[feat] mutex + fiber + thread + io
1 parent cc852bf commit 17f7b7e

File tree

10 files changed

+1766
-54
lines changed

10 files changed

+1766
-54
lines changed

src/block.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,7 @@ impl TryConvert for Proc {
301301
///
302302
/// This effectivly makes the closure's lifetime managed by Ruby. It will be
303303
/// dropped when the returned `Value` is garbage collected.
304-
fn wrap_closure<F, R>(func: F) -> (*mut F, Value)
305-
where
306-
F: FnMut(&[Value], Option<Proc>) -> R,
307-
R: BlockReturn,
308-
{
304+
pub(crate) fn wrap_closure<F>(func: F) -> (*mut F, Value) {
309305
struct Closure();
310306
impl DataTypeFunctions for Closure {}
311307
let data_type = memoize!(DataType: {

src/lib.rs

Lines changed: 7 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -679,54 +679,27 @@
679679
//!
680680
// * `rb_fatal`:
681681
// * `rb_fdopen`:
682-
// * `rb_fd_clr`:
683682
// * `rb_fd_copy`:
684-
// * `rb_fd_dup`:
685683
// * `rb_fd_fix_cloexec`:
686-
// * `rb_fd_init`:
687-
// * `rb_fd_isset`:
688684
// * `rb_fd_max`:
689685
// * `rb_fd_ptr`:
690686
// * `rb_fd_resize`:
691687
// * `rb_fd_select`:
692-
// * `rb_fd_set`:
693-
// * `rb_fd_term`:
694-
// * `rb_fd_zero`:
695688
// * `rb_feature_provided`:
696-
// * `rb_fiber_alive_p`:
697-
// * `rb_fiber_current`:
698-
// * `rb_fiber_new`:
699-
// * `rb_fiber_raise`:
700-
// * `rb_fiber_resume`:
701689
// * `rb_fiber_resume_kw`:
702-
// * `rb_fiber_scheduler_address_resolve`:
703-
// * `rb_fiber_scheduler_block`:
704-
// * `rb_fiber_scheduler_close`:
690+
// * `rb_fiber_transfer_kw`:
691+
// * `rb_fiber_yield_kw`:
705692
// * `rb_fiber_scheduler_current`:
706-
// * `rb_fiber_scheduler_current_for_thread`:
707-
// * `rb_fiber_scheduler_get`:
708693
// * `rb_fiber_scheduler_io_close`:
709694
// * `rb_fiber_scheduler_io_pread`:
710695
// * `rb_fiber_scheduler_io_pwrite`:
711696
// * `rb_fiber_scheduler_io_read`:
712697
// * `rb_fiber_scheduler_io_read_memory`:
713698
// * `rb_fiber_scheduler_io_result`:
714699
// * `rb_fiber_scheduler_io_result_apply`:
715-
// * `rb_fiber_scheduler_io_wait`:
716-
// * `rb_fiber_scheduler_io_wait_readable`:
717-
// * `rb_fiber_scheduler_io_wait_writable`:
718700
// * `rb_fiber_scheduler_io_write`:
719701
// * `rb_fiber_scheduler_io_write_memory`:
720-
// * `rb_fiber_scheduler_kernel_sleep`:
721702
// * `rb_fiber_scheduler_kernel_sleepv`:
722-
// * `rb_fiber_scheduler_make_timeout`:
723-
// * `rb_fiber_scheduler_process_wait`:
724-
// * `rb_fiber_scheduler_set`:
725-
// * `rb_fiber_scheduler_unblock`:
726-
// * `rb_fiber_transfer`:
727-
// * `rb_fiber_transfer_kw`:
728-
// * `rb_fiber_yield`:
729-
// * `rb_fiber_yield_kw`:
730703
//! * `rb_filesystem_encindex`: [`encoding::Index::filesystem`].
731704
//! * `rb_filesystem_encoding`:
732705
//! [`RbEncoding::filesystem`](encoding::RbEncoding::filesystem).
@@ -796,7 +769,6 @@
796769
// * `rb_funcall_passing_block`:
797770
// * `rb_funcall_passing_block_kw`:
798771
//! * `rb_funcall_with_block`: [`Value::funcall_with_block`].
799-
// * `rb_funcall_with_block_kw`:
800772
// * `rb_f_abort`:
801773
// * `rb_f_exec`:
802774
// * `rb_f_exit`:
@@ -855,7 +827,6 @@
855827
//! # `rb_h`
856828
//!
857829
// * `rb_Hash`:
858-
// * `rb_hash`:
859830
//! * `rb_hash_aref`: [`RHash::aref`].
860831
//! * `rb_hash_aset`: [`RHash::aset`].
861832
// * `rb_hash_bulk_insert`:
@@ -917,7 +888,6 @@
917888
//! ## `rb_io`
918889
//!
919890
// * `rb_io_addstr`:
920-
// * `rb_io_ascii8bit_binmode`:
921891
// * `rb_io_binmode`:
922892
// * `rb_io_bufwrite`:
923893
// * `rb_io_check_byte_readable`:
@@ -927,13 +897,9 @@
927897
// * `rb_io_check_io`:
928898
// * `rb_io_check_readable`:
929899
// * `rb_io_check_writable`:
930-
// * `rb_io_close`:
931-
// * `rb_io_descriptor`:
932-
// * `rb_io_eof`:
933900
// * `rb_io_extract_encoding_option`:
934901
// * `rb_io_extract_modeenc`:
935902
// * `rb_io_fdopen`:
936-
// * `rb_io_flush`:
937903
// * `rb_io_fptr_finalize`:
938904
// * `rb_io_getbyte`:
939905
// * `rb_io_gets`:
@@ -1087,13 +1053,8 @@
10871053
// * `rb_mod_sys_fail`:
10881054
// * `rb_mod_sys_fail_str`:
10891055
// * `rb_must_asciicompat`:
1090-
// * `rb_mutex_lock`:
1091-
// * `rb_mutex_locked_p`:
1092-
// * `rb_mutex_new`:
10931056
// * `rb_mutex_sleep`:
10941057
// * `rb_mutex_synchronize`:
1095-
// * `rb_mutex_trylock`:
1096-
// * `rb_mutex_unlock`:
10971058
//!
10981059
//! ## `rb_n`
10991060
//!
@@ -1183,9 +1144,7 @@
11831144
// * `rb_obj_instance_eval`:
11841145
// * `rb_obj_instance_exec`:
11851146
// * `rb_obj_instance_variables`:
1186-
// * `rb_obj_is_fiber`:
11871147
// * `rb_obj_is_instance_of`:
1188-
//! * `rb_obj_is_kind_of`: [`Value::is_kind_of`].
11891148
// * `rb_obj_is_method`:
11901149
//! * `rb_obj_is_proc`: [`Proc::from_value`](block::Proc::from_value).
11911150
// * `rb_obj_method`:
@@ -1211,7 +1170,6 @@
12111170
// * `rb_path2class`:
12121171
// * `rb_path_check`:
12131172
// * `rb_path_to_class`:
1214-
// * `rb_pipe`:
12151173
// * `RB_POSFIXABLE`:
12161174
// * `rb_postponed_job_register`:
12171175
// * `rb_postponed_job_register_one`:
@@ -1530,7 +1488,6 @@
15301488
// * `rb_thread_current`:
15311489
// * `rb_thread_fd_close`:
15321490
// * `rb_thread_fd_select`:
1533-
// * `rb_thread_fd_writable`:
15341491
// * `rb_thread_interrupted`:
15351492
// * `rb_thread_kill`:
15361493
// * `rb_thread_local_aref`:
@@ -1544,7 +1501,6 @@
15441501
// * `rb_thread_sleep_deadly`:
15451502
// * `rb_thread_sleep_forever`:
15461503
// * `rb_thread_stop`:
1547-
// * `rb_thread_wait_fd`:
15481504
// * `rb_thread_wait_for`:
15491505
// * `rb_thread_wakeup`:
15501506
// * `rb_thread_wakeup_alive`:
@@ -1821,15 +1777,20 @@ mod object;
18211777
mod r_array;
18221778
mod r_bignum;
18231779
mod r_complex;
1780+
#[cfg(ruby_gt_3_0)]
1781+
pub mod r_fiber;
18241782
mod r_file;
18251783
mod r_float;
18261784
pub mod r_hash;
1785+
pub mod r_io;
18271786
mod r_match;
1787+
pub mod r_mutex;
18281788
mod r_object;
18291789
mod r_rational;
18301790
mod r_regexp;
18311791
pub mod r_string;
18321792
pub mod r_struct;
1793+
pub mod r_thread;
18331794
pub mod r_typed_data;
18341795
mod range;
18351796
#[cfg(feature = "rb-sys-interop")]

src/object.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use std::{ffi::CString, mem::transmute, ops::Deref};
22

33
use crate::ruby_sys::{
4-
rb_define_singleton_method, rb_extend_object, rb_ivar_get, rb_ivar_set, rb_singleton_class,
4+
rb_define_singleton_method, rb_extend_object, rb_hash, rb_ivar_get, rb_ivar_set,
5+
rb_singleton_class,
56
};
67

78
use crate::{
@@ -16,6 +17,13 @@ use crate::{
1617

1718
/// Functions available all non-immediate values.
1819
pub trait Object: Deref<Target = Value> + Copy {
20+
/// Call `obj.hash`
21+
fn hash(self) -> Result<i64, Error> {
22+
debug_assert_value!(self);
23+
let hash = protect(|| Value::new(unsafe { rb_hash(self.as_rb_value()) }))?;
24+
hash.try_convert()
25+
}
26+
1927
/// Define a singleton method in `self`'s scope.
2028
///
2129
/// Singleton methods defined on a class are Ruby's method for implementing

0 commit comments

Comments
 (0)