[librsvg: 1/9] node: panic in get_impl directly



commit 22521f83a459c0a4f2994a9a26b1878189f71710
Author: Paolo Borelli <pborelli gnome org>
Date:   Sat May 25 18:23:37 2019 +0200

    node: panic in get_impl directly
    
    We are anyway calling unwrap() in every caller

 rsvg_internals/src/filters/component_transfer.rs | 4 ++--
 rsvg_internals/src/filters/context.rs            | 4 ++--
 rsvg_internals/src/filters/light/lighting.rs     | 2 +-
 rsvg_internals/src/gradient.rs                   | 2 +-
 rsvg_internals/src/node.rs                       | 8 ++++++--
 rsvg_internals/src/pattern.rs                    | 4 +---
 6 files changed, 13 insertions(+), 11 deletions(-)
---
diff --git a/rsvg_internals/src/filters/component_transfer.rs 
b/rsvg_internals/src/filters/component_transfer.rs
index bd4c6281..2b3ac234 100644
--- a/rsvg_internals/src/filters/component_transfer.rs
+++ b/rsvg_internals/src/filters/component_transfer.rs
@@ -293,7 +293,7 @@ impl Filter for ComponentTransfer {
         let get_node = |channel| {
             functions
                 .clone()
-                .find(|c| c.get_impl::<FuncX>().unwrap().channel == channel)
+                .find(|c| c.get_impl::<FuncX>().channel == channel)
         };
         let func_r = get_node(Channel::R);
         let func_g = get_node(Channel::G);
@@ -318,7 +318,7 @@ impl Filter for ComponentTransfer {
         #[inline]
         fn func_or_default<'a>(func: &'a Option<RsvgNode>, default: &'a FuncX) -> &'a FuncX {
             func.as_ref()
-                .map(|c| c.get_impl::<FuncX>().unwrap())
+                .map(|c| c.get_impl::<FuncX>())
                 .unwrap_or(default)
         }
 
diff --git a/rsvg_internals/src/filters/context.rs b/rsvg_internals/src/filters/context.rs
index f2c28468..f6544e84 100644
--- a/rsvg_internals/src/filters/context.rs
+++ b/rsvg_internals/src/filters/context.rs
@@ -114,7 +114,7 @@ impl FilterContext {
             height: 0.0,
         });
 
-        let filter = filter_node.get_impl::<NodeFilter>().unwrap();
+        let filter = filter_node.get_impl::<NodeFilter>();
 
         let affine = match filter.filterunits.get() {
             CoordUnits::UserSpaceOnUse => cr_affine,
@@ -305,7 +305,7 @@ impl FilterContext {
 
     /// Pushes the viewport size based on the value of `primitiveUnits`.
     pub fn get_view_params(&self, draw_ctx: &mut DrawingCtx) -> ViewParams {
-        let filter = self.node.get_impl::<NodeFilter>().unwrap();
+        let filter = self.node.get_impl::<NodeFilter>();
 
         // See comments in compute_effects_region() for how this works.
         if filter.primitiveunits.get() == CoordUnits::ObjectBoundingBox {
diff --git a/rsvg_internals/src/filters/light/lighting.rs b/rsvg_internals/src/filters/light/lighting.rs
index 69e7c447..cd2f7b98 100644
--- a/rsvg_internals/src/filters/light/lighting.rs
+++ b/rsvg_internals/src/filters/light/lighting.rs
@@ -233,7 +233,7 @@ impl Filter for Lighting {
             return Err(FilterError::ChildNodeInError);
         }
 
-        let light_source = light_source.get_impl::<LightSource>().unwrap();
+        let light_source = light_source.get_impl::<LightSource>();
         let light_source = light_source.transform(ctx);
 
         let mut input_surface = input.surface().clone();
diff --git a/rsvg_internals/src/gradient.rs b/rsvg_internals/src/gradient.rs
index 043e865d..da60352c 100644
--- a/rsvg_internals/src/gradient.rs
+++ b/rsvg_internals/src/gradient.rs
@@ -535,7 +535,7 @@ impl PaintSource for NodeGradient {
         draw_ctx: &mut DrawingCtx,
         bbox: &BoundingBox,
     ) -> Result<Option<Self::Source>, RenderingError> {
-        let node_gradient = node.get_impl::<NodeGradient>().unwrap();
+        let node_gradient = node.get_impl::<NodeGradient>();
         let gradient = node_gradient.get_gradient_with_color_stops_from_node(node);
         let mut result = gradient.clone();
         let mut stack = NodeStack::new();
diff --git a/rsvg_internals/src/node.rs b/rsvg_internals/src/node.rs
index 7a37a04a..b3e55ff8 100644
--- a/rsvg_internals/src/node.rs
+++ b/rsvg_internals/src/node.rs
@@ -500,8 +500,12 @@ impl RsvgNode {
         }
     }
 
-    pub fn get_impl<T: NodeTrait>(&self) -> Option<&T> {
-        self.borrow().get_impl()
+    pub fn get_impl<T: NodeTrait>(&self) -> &T {
+        if let Some(t) = (&self.borrow().node_impl).downcast_ref::<T>() {
+            t
+        } else {
+            panic!("could not downcast");
+        }
     }
 
     pub fn draw_children(
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index cc55519e..bc07ece6 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -228,9 +228,7 @@ impl PaintSource for NodePattern {
         draw_ctx: &mut DrawingCtx,
         _bbox: &BoundingBox,
     ) -> Result<Option<Self::Source>, RenderingError> {
-        let node_pattern = node.get_impl::<NodePattern>().unwrap();
-        let pattern = &*node_pattern.pattern.borrow();
-        let mut result = pattern.clone();
+        let mut result = node.get_impl::<NodePattern>().pattern.borrow().clone();
         let mut stack = NodeStack::new();
 
         while !result.is_resolved() {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]