From e83d9491ae5d165ea70f6888fe72f4a46b479861 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Sun, 18 May 2014 15:49:38 +0400 Subject: [PATCH] Using Option in Renderer to avoid problems with destructor --- .gitignore | 1 + src/sdl2/render.rs | 28 ++++++++++++++++++---------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 393829d9..a78fd338 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ src/generated /rustpkg_db.json *.swp .project +src/demo/main diff --git a/src/sdl2/render.rs b/src/sdl2/render.rs index a855d379..1c5a31d7 100644 --- a/src/sdl2/render.rs +++ b/src/sdl2/render.rs @@ -203,10 +203,11 @@ impl RendererInfo { #[deriving(Eq)] #[allow(raw_pointer_deriving)] pub struct Renderer { raw: *ll::SDL_Renderer, - parent: S, + parent: Option, owned: bool } +#[unsafe_destructor] impl Drop for Renderer { fn drop(&mut self) { if self.owned { @@ -217,7 +218,7 @@ impl Drop for Renderer { } } -impl Renderer { +impl Renderer { pub fn from_window(window: Window, index: RenderDriverIndex, renderer_flags: RendererFlags) -> Result, ~str> { let index = match index { DriverAuto => -1, @@ -231,7 +232,7 @@ impl Renderer { if raw == ptr::null() { Err(get_error()) } else { - Ok(Renderer{ raw: raw, parent: window, owned: true,}) + Ok(Renderer{ raw: raw, parent: Some(window), owned: true,}) } } @@ -246,32 +247,39 @@ impl Renderer { }; Ok(Renderer { raw: raw_renderer, - parent: Window(window), + parent: Some(window), owned: true }) } else { Err(get_error()) } } +} - pub fn from_surface(surface: &surface::Surface) -> Result { +impl Renderer { + pub fn from_surface(surface: surface::Surface) -> Result, ~str> { let result = unsafe { ll::SDL_CreateSoftwareRenderer(surface.raw) }; if result == ptr::null() { Ok(Renderer { raw: result, - parent: Surface(surface), + parent: Some(surface), owned: true }) } else { Err(get_error()) } } +} + +impl Renderer { + #[inline] + pub fn get_parent<'a>(&'a self) -> &'a S { self.parent.get_ref() } #[inline] - pub fn get_parent(&'a self) -> &'a S { &self.parent } - - #[inline] - pub fn unwrap_parent(self) -> S { self.parent } + pub fn unwrap_parent(mut self) -> S { + use std::mem; + mem::replace(&mut self.parent, None).unwrap() + } pub fn set_draw_color(&self, color: pixels::Color) -> Result<(), ~str> { let ret = match color {