[librsvg] path_parser: When reading a number, don't call powf() if there's no exponent



commit c8529f9975095ae1902efd311476a20979ab056a
Author: Federico Mena Quintero <federico gnome org>
Date:   Thu Jan 25 18:10:25 2018 -0600

    path_parser: When reading a number, don't call powf() if there's no exponent
    
    powf() was showing up in the profile.  We'll switch to Rust's own
    number reader later, but for that we have to change the parsing
    machinery to be able to slice the original string.

 rust/src/path_parser.rs | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)
---
diff --git a/rust/src/path_parser.rs b/rust/src/path_parser.rs
index 39fced2..cdf66ef 100644
--- a/rust/src/path_parser.rs
+++ b/rust/src/path_parser.rs
@@ -198,11 +198,11 @@ impl<'b> PathParser<'b> {
 
         let mut value: f64;
         let mut exponent_sign: f64;
-        let mut exponent: f64;
+        let mut exponent: Option<f64>;
 
         value = 0.0;
         exponent_sign = 1.0;
-        exponent = 0.0;
+        exponent = None;
 
         let mut c: char = ' ';
 
@@ -244,11 +244,15 @@ impl<'b> PathParser<'b> {
                 let mut c: char = ' ';
 
                 if self.lookahead_is_digit (&mut c) {
+                    let mut exp = 0.0;
+
                     while self.lookahead_is_digit (&mut c) {
-                        exponent = exponent * 10.0 + f64::from(char_to_digit (c));
+                        exp = exp * 10.0 + f64::from(char_to_digit (c));
 
                         assert! (self.match_char (c));
                     }
+
+                    exponent = Some(exp);
                 } else if self.lookahead.is_some() {
                     return Err(self.error(ErrorKind::UnexpectedToken));
                 } else {
@@ -256,7 +260,11 @@ impl<'b> PathParser<'b> {
                 }
             }
 
-            Ok (sign * value * 10.0f64.powf (exponent * exponent_sign))
+            if let Some(exp) = exponent {
+                Ok (sign * value * 10.0f64.powf (exp * exponent_sign))
+            } else {
+                Ok (sign * value)
+            }
         } else if self.lookahead.is_some() {
             Err(self.error(ErrorKind::UnexpectedToken))
         } else {


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