Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion examples/rutie_ruby_example/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#[macro_use]
extern crate rutie;

use rutie::{Class, Object, RString, VM};
use rutie::{Class, Object, RString, VM, Marshal, AnyObject, NilClass};

class!(RutieExample);

Expand All @@ -13,12 +13,22 @@ methods!(

RString::new_utf8(&ruby_string.to_string().chars().rev().collect::<String>())
}

fn pub_dump(input: AnyObject) -> RString {
Marshal::dump(input.unwrap(), NilClass::new().into())
}

fn pub_load(input: RString) -> AnyObject {
Marshal::load(input.unwrap())
}
);

#[allow(non_snake_case)]
#[no_mangle]
pub extern "C" fn Init_rutie_ruby_example() {
Class::new("RutieExample", None).define(|klass| {
klass.def_self("reverse", pub_reverse);
klass.def_self("dump", pub_dump);
klass.def_self("load", pub_load);
});
}
9 changes: 9 additions & 0 deletions src/binding/marshal.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
use crate::{rubysys::marshal, types::Value, RString};

pub fn marshal_dump(val: Value, port: Value) -> Value {
unsafe { marshal::rb_marshal_dump(val, port) }
}

pub fn marshal_load(port: RString) -> Value {
unsafe { marshal::rb_marshal_load(port) }
}
1 change: 1 addition & 0 deletions src/binding/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ pub mod float;
pub mod gc;
pub mod global;
pub mod hash;
pub mod marshal;
pub mod module;
pub mod rproc;
pub mod string;
Expand Down
38 changes: 38 additions & 0 deletions src/class/marshal.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
use crate::{binding::marshal, types::Value, AnyObject, NilClass, RString};

/// `Marshal`
#[derive(Debug)]
#[repr(C)]
pub struct Marshal {
value: Value,
}

impl Marshal {
/// Dump a Ruby object and load back
///
/// # Examples
///
/// ```
/// use rutie::{Boolean, VM, NilClass, Marshal};
/// # VM::init();
///
/// let dumped = Marshal::dump(Boolean::new(true).into(), NilClass::new().into());
///
/// assert_eq!(Marshal::load(dumped), Boolean::new(true).into());
/// ```
///
/// Ruby:
///
/// ```ruby
/// dumped = Marshal::dump(true)
///
/// Marshal::load(dumped) == true
/// ```
pub fn load(port: RString) -> AnyObject {
marshal::marshal_load(port).into()
}

pub fn dump(val: AnyObject, port: AnyObject) -> RString {
marshal::marshal_dump(val.into(), port.into()).into()
}
}
1 change: 1 addition & 0 deletions src/class/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ pub mod float;
pub mod gc;
pub mod hash;
pub mod integer;
pub mod marshal;
pub mod module;
pub mod nil_class;
pub mod rproc;
Expand Down
4 changes: 2 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ pub mod util;
pub use crate::class::{
any_exception::AnyException, any_object::AnyObject, array::Array, binding::Binding,
boolean::Boolean, class::Class, encoding::Encoding, enumerator::Enumerator, fixnum::Fixnum,
float::Float, gc::GC, hash::Hash, integer::Integer, module::Module, nil_class::NilClass,
rproc::Proc, string::RString, symbol::Symbol, thread::Thread, vm::VM,
float::Float, gc::GC, hash::Hash, integer::Integer, marshal::Marshal, module::Module,
nil_class::NilClass, rproc::Proc, string::RString, symbol::Symbol, thread::Thread, vm::VM,
};

pub use crate::class::traits::{
Expand Down
10 changes: 10 additions & 0 deletions src/rubysys/marshal.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
use crate::{rubysys::types::Value, RString};

extern "C" {
// VALUE
// rb_marshal_dump(VALUE obj, VALUE port)
pub fn rb_marshal_dump(val: Value, port: Value) -> Value;
// VALUE
// rb_marshal_load(VALUE port)
pub fn rb_marshal_load(port: RString) -> Value;
}
1 change: 1 addition & 0 deletions src/rubysys/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ pub mod fixnum;
pub mod float;
pub mod gc;
pub mod hash;
pub mod marshal;
pub mod rproc;
pub mod string;
pub mod symbol;
Expand Down