From 8f67e9c0487a68b2310956c1417e5af6681d35f9 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Mon, 8 Jun 2015 07:07:09 -0700 Subject: [PATCH] Switch exponent bounds checking back to using powi --- serde/src/json/de.rs | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/serde/src/json/de.rs b/serde/src/json/de.rs index a5ec279b..d4e9f47e 100644 --- a/serde/src/json/de.rs +++ b/serde/src/json/de.rs @@ -1,4 +1,5 @@ use std::char; +use std::i32; use std::io; use std::str; @@ -13,6 +14,15 @@ pub struct Deserializer>> { str_buf: Vec, } +macro_rules! try_or_invalid { + ($self_:expr, $e:expr) => { + match $e { + Some(v) => v, + None => { return Err($self_.error(ErrorCode::InvalidNumber)); } + } + } +} + impl Deserializer where Iter: Iterator>, { @@ -198,16 +208,8 @@ impl Deserializer while !self.eof() { match self.ch_or_null() { c @ b'0' ... b'9' => { - macro_rules! try_or_invalid { - ($e: expr) => { - match $e { - Some(v) => v, - None => { return Err(self.error(ErrorCode::InvalidNumber)); } - } - } - } - accum = try_or_invalid!(accum.checked_mul(10)); - accum = try_or_invalid!(accum.checked_add((c as u64) - ('0' as u64))); + accum = try_or_invalid!(self, accum.checked_mul(10)); + accum = try_or_invalid!(self, accum.checked_add((c as u64) - ('0' as u64))); try!(self.bump()); } @@ -267,16 +269,8 @@ impl Deserializer while !self.eof() { match self.ch_or_null() { c @ b'0' ... b'9' => { - macro_rules! try_or_invalid { - ($e: expr) => { - match $e { - Some(v) => v, - None => { return Err(self.error(ErrorCode::InvalidNumber)); } - } - } - } - exp = try_or_invalid!(exp.checked_mul(10)); - exp = try_or_invalid!(exp.checked_add((c as u64) - (b'0' as u64))); + exp = try_or_invalid!(self, exp.checked_mul(10)); + exp = try_or_invalid!(self, exp.checked_add((c as u64) - (b'0' as u64))); try!(self.bump()); } @@ -284,7 +278,12 @@ impl Deserializer } } - let exp: f64 = 10_f64.powf(exp as f64); + let exp = if exp <= i32::MAX as u64 { + 10_f64.powi(exp as i32) + } else { + return Err(self.error(ErrorCode::InvalidNumber)); + }; + if neg_exp { res /= exp; } else {