From 84e6ab90d29e3ab293c5d491f23de97c2b726115 Mon Sep 17 00:00:00 2001 From: Mitchell Metcalfe Date: Mon, 18 Apr 2016 18:13:58 +1000 Subject: [PATCH 1/2] Retain the arrays returned from Features's accessors --- src/array.rs | 12 ++++++++++++ src/vision/mod.rs | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/array.rs b/src/array.rs index c83a1cea1..caef1ef2a 100644 --- a/src/array.rs +++ b/src/array.rs @@ -164,6 +164,18 @@ impl Array { } } + /// Used to create a weak copy of an Array object from a native resource id + pub fn from_retained(t: i64) -> Array { + unsafe { + let mut temp: i64 = 0; + let ret_val = af_retain_array(&mut temp as MutAfArray, t); + match ret_val { + 0 => Array {handle: temp}, + _ => panic!("Weak copy of Array failed with error code: {}", ret_val), + } + } + } + /// Returns the backend of the Array /// /// # Return Values diff --git a/src/vision/mod.rs b/src/vision/mod.rs index c61c7da6f..f827688ff 100644 --- a/src/vision/mod.rs +++ b/src/vision/mod.rs @@ -79,7 +79,7 @@ macro_rules! feat_func_def { let mut temp: i64 = 0; let err_val = $ffi_name(&mut temp as MutAfArray, self.feat as Feat); match err_val { - 0 => Ok(Array::from(temp)), + 0 => Ok(Array::from_retained(temp)), _ => Err(AfError::from(err_val)), } } From 07cffcef4763dacea4863fffb2feb44e87b908de Mon Sep 17 00:00:00 2001 From: Mitchell Metcalfe Date: Sat, 23 Apr 2016 10:01:14 +1000 Subject: [PATCH 2/2] Change method of retaining arrays in feat_func_def --- src/array.rs | 12 ------------ src/vision/mod.rs | 8 +++++++- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/array.rs b/src/array.rs index caef1ef2a..c83a1cea1 100644 --- a/src/array.rs +++ b/src/array.rs @@ -164,18 +164,6 @@ impl Array { } } - /// Used to create a weak copy of an Array object from a native resource id - pub fn from_retained(t: i64) -> Array { - unsafe { - let mut temp: i64 = 0; - let ret_val = af_retain_array(&mut temp as MutAfArray, t); - match ret_val { - 0 => Array {handle: temp}, - _ => panic!("Weak copy of Array failed with error code: {}", ret_val), - } - } - } - /// Returns the backend of the Array /// /// # Return Values diff --git a/src/vision/mod.rs b/src/vision/mod.rs index f827688ff..30148d4d8 100644 --- a/src/vision/mod.rs +++ b/src/vision/mod.rs @@ -1,5 +1,6 @@ extern crate libc; +use std::mem; use array::Array; use defines::{AfError, HomographyType, MatchType}; use util::HasAfEnum; @@ -78,8 +79,13 @@ macro_rules! feat_func_def { unsafe { let mut temp: i64 = 0; let err_val = $ffi_name(&mut temp as MutAfArray, self.feat as Feat); + + let temp_array = Array::from(temp); + let retained = temp_array.clone(); + unsafe { mem::forget(temp_array); } + match err_val { - 0 => Ok(Array::from_retained(temp)), + 0 => Ok(retained), _ => Err(AfError::from(err_val)), } }