Merge "Upgrade rust/crates/serde_json to 1.0.68"
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 53f9a19..76c8954 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,5 @@
 {
   "git": {
-    "sha1": "6346bb30037f31ea69b9a4eb029875e23521681c"
+    "sha1": "9420d3a0a4ebf17ef1deeecee07851f58ff6148f"
   }
-}
+}
\ No newline at end of file
diff --git a/Android.bp b/Android.bp
index 33f4c5a..ba9e37d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -42,6 +42,8 @@
     name: "libserde_json",
     host_supported: true,
     crate_name: "serde_json",
+    cargo_env_compat: true,
+    cargo_pkg_version: "1.0.68",
     srcs: ["src/lib.rs"],
     edition: "2018",
     features: [
@@ -59,13 +61,3 @@
         "com.android.virt",
     ],
 }
-
-// dependent_library ["feature_list"]
-//   itoa-0.4.7
-//   proc-macro2-1.0.28 "default,proc-macro"
-//   quote-1.0.9 "default,proc-macro"
-//   ryu-1.0.5
-//   serde-1.0.127 "default,derive,serde_derive,std"
-//   serde_derive-1.0.127 "default"
-//   syn-1.0.74 "clone-impls,default,derive,parsing,printing,proc-macro,quote"
-//   unicode-xid-0.2.2 "default"
diff --git a/Cargo.toml b/Cargo.toml
index a6e056b..bf7879d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,7 +12,7 @@
 [package]
 edition = "2018"
 name = "serde_json"
-version = "1.0.66"
+version = "1.0.68"
 authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
 include = ["build.rs", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]
 description = "A JSON serialization file format"
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index a664e75..5c647a1 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "serde_json"
-version = "1.0.66" # remember to update html_root_url
+version = "1.0.68" # remember to update html_root_url
 authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>", "David Tolnay <dtolnay@gmail.com>"]
 license = "MIT OR Apache-2.0"
 description = "A JSON serialization file format"
diff --git a/METADATA b/METADATA
index dfec5e7..f82a5b2 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@
   }
   url {
     type: ARCHIVE
-    value: "https://static.crates.io/crates/serde_json/serde_json-1.0.66.crate"
+    value: "https://static.crates.io/crates/serde_json/serde_json-1.0.68.crate"
   }
-  version: "1.0.66"
+  version: "1.0.68"
   license_type: NOTICE
   last_upgrade_date {
     year: 2021
-    month: 8
-    day: 9
+    month: 9
+    day: 22
   }
 }
diff --git a/src/de.rs b/src/de.rs
index 7cc9f9b..a2f34b9 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -434,8 +434,8 @@
                 } else {
                     let neg = (significand as i64).wrapping_neg();
 
-                    // Convert into a float if we underflow.
-                    if neg > 0 {
+                    // Convert into a float if we underflow, or on `-0`.
+                    if neg >= 0 {
                         ParserNumber::F64(-(significand as f64))
                     } else {
                         ParserNumber::I64(neg)
diff --git a/src/lib.rs b/src/lib.rs
index a7b781b..319ce71 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -300,7 +300,7 @@
 //! [macro]: https://docs.serde.rs/serde_json/macro.json.html
 //! [`serde-json-core`]: https://github.com/rust-embedded-community/serde-json-core
 
-#![doc(html_root_url = "https://docs.rs/serde_json/1.0.66")]
+#![doc(html_root_url = "https://docs.rs/serde_json/1.0.68")]
 #![deny(clippy::all, clippy::pedantic)]
 // Ignored clippy lints
 #![allow(
diff --git a/src/map.rs b/src/map.rs
index c8fb503..716f128 100644
--- a/src/map.rs
+++ b/src/map.rs
@@ -251,6 +251,7 @@
     }
 }
 
+#[allow(clippy::derivable_impls)] // clippy bug: https://github.com/rust-lang/rust-clippy/issues/7655
 impl Default for Map<String, Value> {
     #[inline]
     fn default() -> Self {
diff --git a/src/value/de.rs b/src/value/de.rs
index a66d692..24ca826 100644
--- a/src/value/de.rs
+++ b/src/value/de.rs
@@ -512,7 +512,11 @@
     {
         match self.value {
             Some(Value::Array(v)) => {
-                serde::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor)
+                if v.is_empty() {
+                    visitor.visit_unit()
+                } else {
+                    visit_array(v, visitor)
+                }
             }
             Some(other) => Err(serde::de::Error::invalid_type(
                 other.unexpected(),
@@ -534,9 +538,7 @@
         V: Visitor<'de>,
     {
         match self.value {
-            Some(Value::Object(v)) => {
-                serde::Deserializer::deserialize_any(MapDeserializer::new(v), visitor)
-            }
+            Some(Value::Object(v)) => visit_object(v, visitor),
             Some(other) => Err(serde::de::Error::invalid_type(
                 other.unexpected(),
                 &"struct variant",
@@ -561,38 +563,6 @@
     }
 }
 
-impl<'de> serde::Deserializer<'de> for SeqDeserializer {
-    type Error = Error;
-
-    #[inline]
-    fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Error>
-    where
-        V: Visitor<'de>,
-    {
-        let len = self.iter.len();
-        if len == 0 {
-            visitor.visit_unit()
-        } else {
-            let ret = tri!(visitor.visit_seq(&mut self));
-            let remaining = self.iter.len();
-            if remaining == 0 {
-                Ok(ret)
-            } else {
-                Err(serde::de::Error::invalid_length(
-                    len,
-                    &"fewer elements in array",
-                ))
-            }
-        }
-    }
-
-    forward_to_deserialize_any! {
-        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
-        bytes byte_buf option unit unit_struct newtype_struct seq tuple
-        tuple_struct map struct enum identifier ignored_any
-    }
-}
-
 impl<'de> SeqAccess<'de> for SeqDeserializer {
     type Error = Error;
 
@@ -665,24 +635,6 @@
     }
 }
 
-impl<'de> serde::Deserializer<'de> for MapDeserializer {
-    type Error = Error;
-
-    #[inline]
-    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
-    where
-        V: Visitor<'de>,
-    {
-        visitor.visit_map(self)
-    }
-
-    forward_to_deserialize_any! {
-        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
-        bytes byte_buf option unit unit_struct newtype_struct seq tuple
-        tuple_struct map struct enum identifier ignored_any
-    }
-}
-
 macro_rules! deserialize_value_ref_number {
     ($method:ident) => {
         #[cfg(not(feature = "arbitrary_precision"))]
@@ -1043,7 +995,11 @@
     {
         match self.value {
             Some(&Value::Array(ref v)) => {
-                serde::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor)
+                if v.is_empty() {
+                    visitor.visit_unit()
+                } else {
+                    visit_array_ref(v, visitor)
+                }
             }
             Some(other) => Err(serde::de::Error::invalid_type(
                 other.unexpected(),
@@ -1065,9 +1021,7 @@
         V: Visitor<'de>,
     {
         match self.value {
-            Some(&Value::Object(ref v)) => {
-                serde::Deserializer::deserialize_any(MapRefDeserializer::new(v), visitor)
-            }
+            Some(&Value::Object(ref v)) => visit_object_ref(v, visitor),
             Some(other) => Err(serde::de::Error::invalid_type(
                 other.unexpected(),
                 &"struct variant",
@@ -1090,38 +1044,6 @@
     }
 }
 
-impl<'de> serde::Deserializer<'de> for SeqRefDeserializer<'de> {
-    type Error = Error;
-
-    #[inline]
-    fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Error>
-    where
-        V: Visitor<'de>,
-    {
-        let len = self.iter.len();
-        if len == 0 {
-            visitor.visit_unit()
-        } else {
-            let ret = tri!(visitor.visit_seq(&mut self));
-            let remaining = self.iter.len();
-            if remaining == 0 {
-                Ok(ret)
-            } else {
-                Err(serde::de::Error::invalid_length(
-                    len,
-                    &"fewer elements in array",
-                ))
-            }
-        }
-    }
-
-    forward_to_deserialize_any! {
-        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
-        bytes byte_buf option unit unit_struct newtype_struct seq tuple
-        tuple_struct map struct enum identifier ignored_any
-    }
-}
-
 impl<'de> SeqAccess<'de> for SeqRefDeserializer<'de> {
     type Error = Error;
 
@@ -1194,24 +1116,6 @@
     }
 }
 
-impl<'de> serde::Deserializer<'de> for MapRefDeserializer<'de> {
-    type Error = Error;
-
-    #[inline]
-    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
-    where
-        V: Visitor<'de>,
-    {
-        visitor.visit_map(self)
-    }
-
-    forward_to_deserialize_any! {
-        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
-        bytes byte_buf option unit unit_struct newtype_struct seq tuple
-        tuple_struct map struct enum identifier ignored_any
-    }
-}
-
 struct MapKeyDeserializer<'de> {
     key: Cow<'de, str>,
 }