From ca00cfcc9a15ae8e96aea315cd198bb92c9549ce Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Wed, 25 Nov 2020 12:23:34 +0100 Subject: [PATCH] nicer test for bless Signed-off-by: Wolfgang Bumiller --- perlmod-test/src/bless.rs | 45 ++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/perlmod-test/src/bless.rs b/perlmod-test/src/bless.rs index 3e2d099..e79ed37 100644 --- a/perlmod-test/src/bless.rs +++ b/perlmod-test/src/bless.rs @@ -1,25 +1,54 @@ #[perlmod::package(name = "RSPM::Bless", lib = "perlmod_test")] mod export { - use anyhow::Error; + use anyhow::{format_err, Error}; use perlmod::Value; + struct Bless { + content: String, + } + #[export(raw_return)] - fn new() -> Result { - let hash = Value::from(perlmod::hash::Hash::new()); - let hash = Value::new_ref(&hash); - let hash = hash.bless("RSPM::Bless")?; - Ok(hash) - //Ok(this.bless("RSPM::Bless")?) + fn new(#[raw] class: Value, content: String) -> Result { + let mut ptr = Box::new(Bless { content }); + + let value = Value::new_pointer::(&mut *ptr); + let value = Value::new_ref(&value); + let this = value.bless_sv(&class)?; + let _perl = Box::leak(ptr); + + Ok(this) } #[export] fn something(#[raw] value: Value) { + let _ = value; // ignore for now println!("Called something!"); } #[export] fn DESTROY(#[raw] this: Value) { - println!("Value dropped!"); + match this + .dereference() + .ok_or_else(|| format_err!("not a reference")) + .and_then(|this| Ok(this.pv_raw()?)) + { + Ok(ptr) => { + let value = unsafe { Box::::from_raw(ptr) }; + println!("Dropping value {:?}", value.content); + } + Err(err) => { + println!("DESTROY called with invalid pointer: {}", err); + } + } } } + +// Example: +// use RSPM::Bless; +// my $foo = RSPM::Bless::new("Some Content"); +// $foo->something(); // works +// +// output: +// Called something! +// Dropping value "Some Content"