Skip to Content.
Sympa Menu

sm-commit - [SM-Commit] GIT changes to master grimoire by Pavel Vinogradov (0ddeb970de90f07daf1887de6a485f9f15ba372a)

sm-commit AT lists.ibiblio.org

Subject: Source Mage code commit list

List archive

Chronological Thread  
  • From: Pavel Vinogradov <scm AT sourcemage.org>
  • To: sm-commit AT lists.ibiblio.org
  • Subject: [SM-Commit] GIT changes to master grimoire by Pavel Vinogradov (0ddeb970de90f07daf1887de6a485f9f15ba372a)
  • Date: Fri, 6 Jan 2023 00:25:22 +0000

GIT changes to master grimoire by Pavel Vinogradov <public AT sourcemage.org>:

http/firefox/DETAILS
| 2
http/firefox/HISTORY
| 4

http/firefox/patches/0035-bmo-1805371-avoid-building-and-running-FaultyServer-tests-with-system-NSS.patch
| 25

http/firefox/patches/0036-bmo-1805809-update-uniffi-for-more-determinism-across-platforms.patch
| 2236 ++++++++++
4 files changed, 2266 insertions(+), 1 deletion(-)

New commits:
commit 0ddeb970de90f07daf1887de6a485f9f15ba372a
Author: Pavel Vinogradov <public AT sourcemage.org>
Commit: Pavel Vinogradov <public AT sourcemage.org>

http/firefox: version 108.0.2

diff --git a/http/firefox/DETAILS b/http/firefox/DETAILS
index 847f070..300b866 100755
--- a/http/firefox/DETAILS
+++ b/http/firefox/DETAILS
@@ -1,5 +1,5 @@
SPELL=firefox
- VERSION=108.0.1
+ VERSION=108.0.2
SECURITY_PATCH=171
SOURCE="${SPELL}-${VERSION}.source.tar.xz"

SOURCE_URL[0]="http://releases.mozilla.org/pub/${SPELL}/releases/${VERSION}/source/${SOURCE}";
diff --git a/http/firefox/HISTORY b/http/firefox/HISTORY
index c879757..15311a0 100644
--- a/http/firefox/HISTORY
+++ b/http/firefox/HISTORY
@@ -1,3 +1,7 @@
+2023-01-05 Pavel Vinpgradov <public AT sourcemage.org>
+ * DETAILS: version 108.0.2
+ * patches/*: updated
+
2022-12-16 Pavel Vinogradov <public AT sourcemage.org>
* DETAILS: version 108.0.1

diff --git
a/http/firefox/patches/0035-bmo-1805371-avoid-building-and-running-FaultyServer-tests-with-system-NSS.patch

b/http/firefox/patches/0035-bmo-1805371-avoid-building-and-running-FaultyServer-tests-with-system-NSS.patch
new file mode 100644
index 0000000..8d593cf
--- /dev/null
+++
b/http/firefox/patches/0035-bmo-1805371-avoid-building-and-running-FaultyServer-tests-with-system-NSS.patch
@@ -0,0 +1,25 @@
+diff --git a/security/moz.build b/security/moz.build
+--- a/security/moz.build
++++ b/security/moz.build
+@@ -58,14 +58,16 @@
+ "ssl3",
+ ]
+ gyp_vars["nspr_libs"] = "nspr"
+ else:
+ gyp_vars["nspr_libs"] = "nspr"
+- if not CONFIG["ENABLE_TESTS"]:
+- # If we're not building tests, then we don't need a static copy
+- # of NSS. Build mozpkix only.
+- gyp_vars["mozpkix_only"] = 1
++ # Bug 1805371: We need a static copy of NSS for the tlsserver test
++ # binaries even when building with system NSS. But there's no good
++ # way to build NSS that does not pollute dist/bin with shared
++ # object files. For now, we have to build mozpkix only and disable
++ # the affected tests.
++ gyp_vars["mozpkix_only"] = 1
+
+ # This disables building some NSS tools.
+ gyp_vars["mozilla_client"] = 1
+
+ # This builds NSS tools in COMM applications that Firefox doesn't build.
+
diff --git
a/http/firefox/patches/0036-bmo-1805809-update-uniffi-for-more-determinism-across-platforms.patch

b/http/firefox/patches/0036-bmo-1805809-update-uniffi-for-more-determinism-across-platforms.patch
new file mode 100644
index 0000000..4c15344
--- /dev/null
+++
b/http/firefox/patches/0036-bmo-1805809-update-uniffi-for-more-determinism-across-platforms.patch
@@ -0,0 +1,2236 @@
+
+# HG changeset patch
+# User Mike Hommey <mh+mozilla AT glandium.org>
+# Date 1671490349 0
+# Node ID b1388c0d00728d2e8be8464ca2e9e3d38acb7da3
+# Parent c3ca1d6a55196592a3328444546b6fd49eb5ff46
+Bug 1805809 - Update uniffi to 0.21.1 for more determinism across platforms.
r=janerik,supply-chain-reviewers a=dsmith
+
+Differential Revision: https://phabricator.services.mozilla.com/D164896
+
+diff --git a/Cargo.lock b/Cargo.lock
+--- a/Cargo.lock
++++ b/Cargo.lock
+@@ -5678,19 +5678,19 @@ checksum = "3ed742d4ea2bd1176e236172c842
+ [[package]]
+ name = "unicode-xid"
+ version = "0.2.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
+
+ [[package]]
+ name = "uniffi"
+-version = "0.21.0"
+-source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"f54af5ada67d1173457a99a7bb44a7917f63e7466764cb4714865c7a6678b830"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index";
++checksum =
"b983553c0d1ad73547c65fa0c399aa800bee4a70ad330198e1c7a523212da5ee"
+ dependencies = [
+ "anyhow",
+ "bytes 1.2.1",
+ "camino",
+ "cargo_metadata",
+ "log",
+ "once_cell",
+ "paste",
+@@ -5788,19 +5788,17 @@ dependencies = [
+ "uniffi",
+ "uniffi-example-geometry",
+ "uniffi_build",
+ "uniffi_macros",
+ ]
+
+ [[package]]
+ name = "uniffi_bindgen"
+-version = "0.21.0"
+-source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"12cc4af3c0180c7e86c4a3acf2b6587af04ba2567b1e948993df10f421796621"
++version = "0.21.1"
+ dependencies = [
+ "anyhow",
+ "askama",
+ "bincode",
+ "camino",
+ "clap",
+ "fs-err",
+ "goblin 0.5.4",
+@@ -5811,51 +5809,63 @@ dependencies = [
+ "serde_json",
+ "toml",
+ "uniffi_meta",
+ "weedle2",
+ ]
+
+ [[package]]
+ name = "uniffi_build"
+-version = "0.21.0"
+-source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"510287c368a9386eb731ebe824a6fc6c82a105e20d020af1aa20519c1c1561db"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index";
++checksum =
"d035e50433ee3d52ab0dcdcf3b9b26f2cc2ec39294b3c07d95865a518709455f"
+ dependencies = [
+ "anyhow",
+ "camino",
+ "uniffi_bindgen",
+ ]
+
+ [[package]]
++name = "uniffi_checksum_derive"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index";
++checksum =
"78b6e16d46caf942016997af8bbdf4b163bf8ae3deb0b667d9643de7b7ffd4c9"
++dependencies = [
++ "quote",
++ "syn",
++]
++
++[[package]]
+ name = "uniffi_macros"
+-version = "0.21.0"
+-source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"5c8604503caa2cbcf271578dc51ca236d40e3b22e1514ffa2e638e2c39f6ad10"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index";
++checksum =
"c96a574677566f83ea8458dac1dd7792fd63e7c3f9dbcd865f0e8d6f8057b127"
+ dependencies = [
+ "bincode",
+ "camino",
+ "fs-err",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "syn",
+ "toml",
+ "uniffi_build",
+ "uniffi_meta",
+ ]
+
+ [[package]]
+ name = "uniffi_meta"
+-version = "0.21.0"
+-source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"cd9417cc653937681436b93838d8c5f97a5b8c58697813982ee8810bd1dc3b57"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index";
++checksum =
"729835442da829c9b6f7c111c76cf87b2498e129101203bec94f0c39a3296a38"
+ dependencies = [
+ "serde",
++ "siphasher",
++ "uniffi_checksum_derive",
+ ]
+
+ [[package]]
+ name = "unix_path"
+ version = "1.0.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"af8e291873ae77c4c8d9c9b34d0bee68a35b048fb39c263a5155e0e353783eaf"
+ dependencies = [
+diff --git a/Cargo.toml b/Cargo.toml
+--- a/Cargo.toml
++++ b/Cargo.toml
+@@ -172,13 +172,17 @@ path = "third_party/rust/mio-0.6.23"
+
+ # These are used to test UniFFI functionality. We haven't figured out how
we
+ # want to publish these yet, so they are only accessible via git. This
works
+ # okay, but it means that their dependencies on UniFFI crates will normally
+ # also be the git versions. Patch them to use the published versions to
avoid
+ # duplicate crates.
+
+ [patch."https://github.com/mozilla/uniffi-rs.git";]
+-uniffi = "=0.21.0"
+-uniffi_bindgen = "=0.21.0"
+-uniffi_build = "=0.21.0"
+-uniffi_macros = "=0.21.0"
++uniffi = "=0.21.1"
++#uniffi_bindgen = "=0.21.1"
++uniffi_build = "=0.21.1"
++uniffi_macros = "=0.21.1"
+ weedle2 = "=4.0.0"
++
++# Patched to use uniffi_version = 0.21.0 for checksums.
++[patch.crates-io.uniffi_bindgen]
++path = "third_party/rust/uniffi_bindgen"
+diff --git a/supply-chain/audits.toml b/supply-chain/audits.toml
+--- a/supply-chain/audits.toml
++++ b/supply-chain/audits.toml
+@@ -1396,16 +1396,22 @@ criteria = "safe-to-deploy"
+ delta = "0.19.6 -> 0.20.0"
+
+ [[audits.uniffi]]
+ who = "Jan-Erik Rediger <jrediger AT mozilla.com>"
+ criteria = "safe-to-deploy"
+ delta = "0.20.0 -> 0.21.0"
+ notes = "Maintained by the Glean and Application Services team."
+
++[[audits.uniffi]]
++who = "Mike Hommey <mh+mozilla AT glandium.org>"
++criteria = "safe-to-deploy"
++delta = "0.21.0 -> 0.21.1"
++notes = "No changes."
++
+ [[audits.uniffi_bindgen]]
+ who = "Travis Long <tlong AT mozilla.com>"
+ criteria = "safe-to-deploy"
+ version = "0.19.3"
+ notes = "Maintained by the Glean and Application Services teams."
+
+ [[audits.uniffi_bindgen]]
+ who = "Jan-Erik Rediger <jrediger AT mozilla.com>"
+@@ -1419,16 +1425,22 @@ criteria = "safe-to-deploy"
+ delta = "0.19.6 -> 0.20.0"
+
+ [[audits.uniffi_bindgen]]
+ who = "Jan-Erik Rediger <jrediger AT mozilla.com>"
+ criteria = "safe-to-deploy"
+ delta = "0.20.0 -> 0.21.0"
+ notes = "Maintained by the Glean and Application Services team."
+
++[[audits.uniffi_bindgen]]
++who = "Mike Hommey <mh+mozilla AT glandium.org>"
++criteria = "safe-to-deploy"
++delta = "0.21.0 -> 0.21.1"
++notes = "I authored the changes in this version."
++
+ [[audits.uniffi_build]]
+ who = "Travis Long <tlong AT mozilla.com>"
+ criteria = "safe-to-deploy"
+ version = "0.19.3"
+ notes = "Maintained by the Glean and Application Services teams."
+
+ [[audits.uniffi_build]]
+ who = "Jan-Erik Rediger <jrediger AT mozilla.com>"
+@@ -1442,16 +1454,28 @@ criteria = "safe-to-deploy"
+ delta = "0.19.6 -> 0.20.0"
+
+ [[audits.uniffi_build]]
+ who = "Jan-Erik Rediger <jrediger AT mozilla.com>"
+ criteria = "safe-to-deploy"
+ delta = "0.20.0 -> 0.21.0"
+ notes = "Maintained by the Glean and Application Services team."
+
++[[audits.uniffi_build]]
++who = "Mike Hommey <mh+mozilla AT glandium.org>"
++criteria = "safe-to-deploy"
++delta = "0.21.0 -> 0.21.1"
++notes = "No changes."
++
++[[audits.uniffi_checksum_derive]]
++who = "Mike Hommey <mh+mozilla AT glandium.org>"
++criteria = "safe-to-deploy"
++version = "0.21.1"
++notes = "I authored this crate."
++
+ [[audits.uniffi_macros]]
+ who = "Travis Long <tlong AT mozilla.com>"
+ criteria = "safe-to-deploy"
+ version = "0.19.3"
+ notes = "Maintained by the Glean and Application Services teams."
+
+ [[audits.uniffi_macros]]
+ who = "Jan-Erik Rediger <jrediger AT mozilla.com>"
+@@ -1465,16 +1489,22 @@ criteria = "safe-to-deploy"
+ delta = "0.19.6 -> 0.20.0"
+
+ [[audits.uniffi_macros]]
+ who = "Jan-Erik Rediger <jrediger AT mozilla.com>"
+ criteria = "safe-to-deploy"
+ delta = "0.20.0 -> 0.21.0"
+ notes = "Maintained by the Glean and Application Services team."
+
++[[audits.uniffi_macros]]
++who = "Mike Hommey <mh+mozilla AT glandium.org>"
++criteria = "safe-to-deploy"
++delta = "0.21.0 -> 0.21.1"
++notes = "No changes."
++
+ [[audits.uniffi_meta]]
+ who = "Jan-Erik Rediger <jrediger AT mozilla.com>"
+ criteria = "safe-to-deploy"
+ version = "0.19.6"
+ notes = "Maintained by the Glean and Application Services team."
+
+ [[audits.uniffi_meta]]
+ who = "Perry McManis <pmcmanis AT mozilla.com>"
+@@ -1482,16 +1512,22 @@ criteria = "safe-to-deploy"
+ delta = "0.19.6 -> 0.20.0"
+
+ [[audits.uniffi_meta]]
+ who = "Jan-Erik Rediger <jrediger AT mozilla.com>"
+ criteria = "safe-to-deploy"
+ delta = "0.20.0 -> 0.21.0"
+ notes = "Maintained by the Glean and Application Services team."
+
++[[audits.uniffi_meta]]
++who = "Mike Hommey <mh+mozilla AT glandium.org>"
++criteria = "safe-to-deploy"
++delta = "0.21.0 -> 0.21.1"
++notes = "I authored the changes in this version."
++
+ [[audits.void]]
+ who = "Bobby Holley <bobbyholley AT gmail.com>"
+ criteria = "safe-to-deploy"
+ version = "1.0.2"
+ notes = "Very small crate, just hosts the Void type for easier cross-crate
interfacing."
+
+ [[audits.wasm-encoder]]
+ who = "Ryan Hunt <rhunt AT eqrion.net>"
+diff --git a/supply-chain/config.toml b/supply-chain/config.toml
+--- a/supply-chain/config.toml
++++ b/supply-chain/config.toml
+@@ -149,16 +149,20 @@ notes = "We're not shipping this and hav
+ [policy.storage]
+ audit-as-crates-io = false
+ notes = "This is a first-party crate which is entirely unrelated to the
crates.io package of the same name."
+
+ [policy.tabs]
+ audit-as-crates-io = false
+ notes = "This is a first-party crate, maintained by the appservices team,
which is entirely unrelated to the crates.io package of the same name."
+
++[policy.uniffi_bindgen]
++audit-as-crates-io = false
++notes = "This is a first-party crate, normally vendored, but currently
patched in-tree until next update."
++
+ [policy.viaduct]
+ audit-as-crates-io = false
+ notes = "This is a first-party crate, maintained by the appservices team,
which is entirely unrelated to the crates.io package of the same name."
+
+ [policy.webdriver]
+ audit-as-crates-io = false
+ criteria = "safe-to-run"
+ notes = "This is a first-party crate which is also published to crates.io.
We certify audits for this crate as part of the documented release process,
but that step happens after the version bump lands on central so we don't
enforce it here. It's also used only for automation, so its subtree can be
safe-to-run."
+diff --git a/third_party/rust/uniffi/.cargo-checksum.json
b/third_party/rust/uniffi/.cargo-checksum.json
+--- a/third_party/rust/uniffi/.cargo-checksum.json
++++ b/third_party/rust/uniffi/.cargo-checksum.json
+@@ -1,1 +1,1 @@
+-{"files":{"Cargo.toml":"b7bde8b1b6bb7e1420c9c486d7562d1639fbb82a2b6459b8b3b7d15f002377d3","release.toml":"a6602545cd6eb46e44d89ce946d7954957ac00f1c955de54c736fa2cb560b1df","src/ffi/ffidefault.rs":"c7ab752fffed17c3fabb60e818ad1d093482f95dd0bdeae6871287695c583e48","src/ffi/foreignbytes.rs":"37061e2da7135576abccb86fe27b4fefc054586a040f2ca81fe9858d5649e887","src/ffi/foreigncallbacks.rs":"c0974920313ac81dd4bb28a51dd9e9ef50c8ea6d965f0bfdde58c661a4ca719f","src/ffi/mod.rs":"3fb3b74607066e0052fc91168e9473dbf82dbae562f85c33774a7f5f6b350616","src/ffi/rustbuffer.rs":"b773637d9e4651b80cd16f7a02ed75846d02ce0a9e32b718ce644cdba3a83cdd","src/ffi/rustcalls.rs":"4a85a90b0d46974ab9e80e403a1cddaa252337b227e1a672bb6fdbbca5a66259","src/lib.rs":"83614739f8c0c939b217755cfde169a85608a52ea197f63f7850e5765e2c5f97","src/panichook.rs":"9f49c7994a8e5489c1105c488bb3f8c5571bc5f813e7be90441eca15da5c9851","src/testing.rs":"f287d682a8f27465838b2aba91993c635a4dcd281d802dc12c7c75794324123f","tests/ui/proc_macro_arc.rs":"d766dffee3fe6a93522d40f44a7f15592db141fd674034fa5f016e06f510e87b","tests/ui/proc_macro_arc.stderr":"9e7d098abdd47f249ff62fe0a2ee0f8b96282ec5a3be0c48a778baab4624180f","tests/ui/version_mismatch.rs":"16ea359e5853517ee0d0704c015ae8c825533109fbefd715130d0f4a51f15898","tests/ui/version_mismatch.stderr":"aadbd8f3847f5663022d8dd75d6afa3b25dfc8abccd30b386a681f98587d4ceb"},"package":"f54af5ada67d1173457a99a7bb44a7917f63e7466764cb4714865c7a6678b830"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"40a5376941ee93f7d3d013862731eaced1121c852bd4df4affe1cd65bf9b68be","release.toml":"a6602545cd6eb46e44d89ce946d7954957ac00f1c955de54c736fa2cb560b1df","src/ffi/ffidefault.rs":"c7ab752fffed17c3fabb60e818ad1d093482f95dd0bdeae6871287695c583e48","src/ffi/foreignbytes.rs":"37061e2da7135576abccb86fe27b4fefc054586a040f2ca81fe9858d5649e887","src/ffi/foreigncallbacks.rs":"c0974920313ac81dd4bb28a51dd9e9ef50c8ea6d965f0bfdde58c661a4ca719f","src/ffi/mod.rs":"3fb3b74607066e0052fc91168e9473dbf82dbae562f85c33774a7f5f6b350616","src/ffi/rustbuffer.rs":"b773637d9e4651b80cd16f7a02ed75846d02ce0a9e32b718ce644cdba3a83cdd","src/ffi/rustcalls.rs":"4a85a90b0d46974ab9e80e403a1cddaa252337b227e1a672bb6fdbbca5a66259","src/lib.rs":"83614739f8c0c939b217755cfde169a85608a52ea197f63f7850e5765e2c5f97","src/panichook.rs":"9f49c7994a8e5489c1105c488bb3f8c5571bc5f813e7be90441eca15da5c9851","src/testing.rs":"f287d682a8f27465838b2aba91993c635a4dcd281d802dc12c7c75794324123f","tests/ui/proc_macro_arc.rs":"d766dffee3fe6a93522d40f44a7f15592db141fd674034fa5f016e06f510e87b","tests/ui/proc_macro_arc.stderr":"9e7d098abdd47f249ff62fe0a2ee0f8b96282ec5a3be0c48a778baab4624180f","tests/ui/version_mismatch.rs":"16ea359e5853517ee0d0704c015ae8c825533109fbefd715130d0f4a51f15898","tests/ui/version_mismatch.stderr":"aadbd8f3847f5663022d8dd75d6afa3b25dfc8abccd30b386a681f98587d4ceb"},"package":"b983553c0d1ad73547c65fa0c399aa800bee4a70ad330198e1c7a523212da5ee"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi/Cargo.toml
b/third_party/rust/uniffi/Cargo.toml
+--- a/third_party/rust/uniffi/Cargo.toml
++++ b/third_party/rust/uniffi/Cargo.toml
+@@ -7,28 +7,27 @@
+ #
+ # If you are reading this file be aware that the original Cargo.toml
+ # will likely look very different (and much more reasonable).
+ # See Cargo.toml.orig for the original contents.
+
+ [package]
+ edition = "2021"
+ name = "uniffi"
+-version = "0.21.0"
++version = "0.21.1"
+ authors = ["Firefox Sync Team <sync-team AT mozilla.com>"]
+ description = "a multi-language bindings generator for rust (runtime
support code)"
+ homepage = "https://mozilla.github.io/uniffi-rs";
+ documentation = "https://mozilla.github.io/uniffi-rs";
+ keywords = [
+ "ffi",
+ "bindgen",
+ ]
+ license = "MPL-2.0"
+ repository = "https://github.com/mozilla/uniffi-rs";
+-resolver = "2"
+
+ [dependencies.anyhow]
+ version = "1"
+
+ [dependencies.bytes]
+ version = "1.0"
+
+ [dependencies.camino]
+@@ -45,20 +44,20 @@ version = "1.12"
+
+ [dependencies.paste]
+ version = "1.0"
+
+ [dependencies.static_assertions]
+ version = "1.1.0"
+
+ [dependencies.uniffi_bindgen]
+-version = "=0.21.0"
++version = "=0.21.1"
+ optional = true
+
+ [dependencies.uniffi_macros]
+-version = "=0.21.0"
++version = "=0.21.1"
+
+ [dev-dependencies.trybuild]
+ version = "1"
+
+ [features]
+ builtin-bindgen = ["uniffi_bindgen"]
+ default = []
+diff --git a/third_party/rust/uniffi_bindgen/.cargo-checksum.json
b/third_party/rust/uniffi_bindgen/.cargo-checksum.json
+--- a/third_party/rust/uniffi_bindgen/.cargo-checksum.json
++++ b/third_party/rust/uniffi_bindgen/.cargo-checksum.json
+@@ -1,1 +1,1 @@
+-{"files":{"Cargo.lock":"5ed0714fd87076b5b5f11ca60553f12559e69794c2fec7d487a398f31a577a5f","Cargo.toml":"209b8cb7759ec813ee1e27a4b7e1d2bed2604c37d7c55578058bc7089ee9557e","askama.toml":"1a245b7803adca782837e125c49100147d2de0d5a1c949ff95e91af1701f6058","src/backend/config.rs":"4861dbf251dbb10beb1ed7e3eea7d79499a0de1cd9ce9ee8381a0e729c097dea","src/backend/declarations.rs":"12b8d6e651f84634de5cd02a47601965df7438f64f1a73f136bd89b6b5d515cf","src/backend/mod.rs":"899cd3b816d0467e35789b92ac3b8d5910f6dab98156d405db4803da8721fd36","src/backend/oracle.rs":"9e2b8a45af604a6e4952644e81f43f6aec6e0a1d03939c68b582529dd01a51e0","src/backend/types.rs":"7c49a92096a54eefd2336c48d60fe20ded9490142ab3a229a7c1a99fec14df3d","src/bindings/kotlin/gen_kotlin/callback_interface.rs":"b7fe795670830f3aa8a955c787b1127fe68313ee751013948527948fe5526b01","src/bindings/kotlin/gen_kotlin/compounds.rs":"d1e9a4237ff2ff711a3eae7a564c39e26f598c156ebfd34c0f04879e3533dd4f","src/bindings/kotlin/gen_kotlin/custom.rs":"4176f6ed5f66504f8fd981198bbfbae795dab5ef0d0281881d19b697f5560c44","src/bindings/kotlin/gen_kotlin/enum_.rs":"f85ae8dcb55c8f274139bf321af0ba237ae69894165ad6bd693d793f58af8e5e","src/bindings/kotlin/gen_kotlin/error.rs":"867f583aea5da7aabeb9b6d2544d7e52984cdea4aa008ce5f2ec941074735e1a","src/bindings/kotlin/gen_kotlin/external.rs":"1f7e91d7439891fe3c403274e35880ee4fc3a0da555510bdfa23c1ed2bbd8020","src/bindings/kotlin/gen_kotlin/miscellany.rs":"644ee5bb1f3619be5a36b2b3900af554ea38073cd054004f421e69c3cb8d50bc","src/bindings/kotlin/gen_kotlin/mod.rs":"90412e7927c284668a9eb75823c198182e58e5177d5561896c43b79367564b27","src/bindings/kotlin/gen_kotlin/object.rs":"6478a3e9d5e66186521730d0d481abd1ee4f123050ea050ac5a483842f08b003","src/bindings/kotlin/gen_kotlin/primitives.rs":"914d1f8253ed6a2937f67e8bd8f04f46aef4f22455ceb8a6caa84427adc2093e","src/bindings/kotlin/gen_kotlin/record.rs":"7961fcfbec5ebf8fc010b564ea4bd59402c919f6922898d48226d8c995569dd7","src/bindings/kotlin/mod.rs":"e68f2ea29e66ee62a56704e1e4464eea6d28bbdb52ab187bbe7a57ab3f362ea7","src/bindings/kotlin/templates/BooleanHelper.kt":"28e8a5088c8d58c9bfdbc575af8d8725060521fdd7d092684a8044b24ae567c7","src/bindings/kotlin/templates/CallbackInterfaceRuntime.kt":"6ede374b0fcbb3bcc939894e6f4729b3bec7ec7356831a60fba96ca38dc91aa8","src/bindings/kotlin/templates/CallbackInterfaceTemplate.kt":"5a704eb8c044ed22905e4d526ee3fc0b86f42fe82ac1eb4ad3758ad0552ea8c8","src/bindings/kotlin/templates/CustomTypeTemplate.kt":"5d4dacf29e89bcdcc46d155d993e6059d2df704e775dc853469310198253b231","src/bindings/kotlin/templates/DurationHelper.kt":"414a98161538a26f3a9b357353270c1f245ad6ceed99496aca7162cf473a92fd","src/bindings/kotlin/templates/EnumTemplate.kt":"ab3e2063aad3b91188db839dceb59b854a6a8b60fb35e545e270e64fee7c73fa","src/bindings/kotlin/templates/ErrorTemplate.kt":"a5ec2bdfc026838e1096dbf3301f21aa4ea22e8c93458d45bb1c8c7b9ee1fc5b","src/bindings/kotlin/templates/ExternalTypeTemplate.kt":"2097e0b830640ef18c79449ffa376d1dd35a8c4a5230e413c915f3b868aae872","src/bindings/kotlin/templates/FfiConverterTemplate.kt":"aa22962aaa9f641d48ccf44cb56d9f8a7736cbfaa01e1a1656662cfe5dd5c1d7","src/bindings/kotlin/templates/Float32Helper.kt":"662d95af3b629d143fb4d47cb7e9aa26ed28a5f3846de0341e28b0f9fb08bc25","src/bindings/kotlin/templates/Float64Helper.kt":"a77d099fa7d91e8702c1700e7949ffb6aaba9c6e8041ff48bab34b8e1fc9a0aa","src/bindings/kotlin/templates/Helpers.kt":"46c07798a26b53b06405c8bbbf86e3fcf38fadc1484ea04ce9d482defea89288","src/bindings/kotlin/templates/Int16Helper.kt":"7f83c4a48e1f3b2a59a3ca6a2662be8bc9baf3a5a748b31223cb3f51721ef249","src/bindings/kotlin/templates/Int32Helper.kt":"e02e4702175554b09fd2dd6ac3089dcd2c395f08ec60e762159566a9c9889450","src/bindings/kotlin/templates/Int64Helper.kt":"7a6fd6ca486852c89399c699935a9dfa1c32b9356d9a965cfde532581f05d9fa","src/bindings/kotlin/templates/Int8Helper.kt":"0554545494b6b9a76ce94f9c1723f8cf4230a13076feb75d620b1c9ca1ac4668","src/bindings/kotlin/templates/MapTemplate.kt":"399569d6443e8ad01e2deb95d78d8d2d15bf8eccee8be4fbe9ce4b8ebc0a6101","src/bindings/kotlin/templates/NamespaceLibraryTemplate.kt":"1eba4e77381155c2c96a6af2ef30fca881ade4957852f730fd10aa4f3d9cd3c4","src/bindings/kotlin/templates/ObjectRuntime.kt":"c11d233de41405caa55a56bcaa3bb69ce153ffa6fdff2aa218051929f5c4aeec","src/bindings/kotlin/templates/ObjectTemplate.kt":"7e32d92ec6116da9b7d7f278b15333a2fd2a82dde8c21534e3f6fe371d19f333","src/bindings/kotlin/templates/OptionalTemplate.kt":"5f9f2c1baa829ed3c9b61c3edb0f1fccf5ea3cccc052a69cf8966715d8fcf149","src/bindings/kotlin/templates/RecordTemplate.kt":"193ecdad9322fb5483b95bf2a259270a9b22ba054790794e9abb3fd219196bc5","src/bindings/kotlin/templates/RustBufferTemplate.kt":"415637f80a78c12b3d00db063c14a7ab5c61b098bdb1fc81a0be8bae9511776b","src/bindings/kotlin/templates/SequenceTemplate.kt":"786693b20c608a4f059b91df115278f5f12122b4c14a2e7ce18b6fc9b22b1296","src/bindings/kotlin/templates/StringHelper.kt":"060839663580d8199671b7c3bb3dce5e9106aa766ce2c6e0afc2d2bd788a1d83","src/bindings/kotlin/templates/TimestampHelper.kt":"353c2890f06ad6dda238e9aebb4bdff7bb838e17e46abf351ed3ff1fbc4e6580","src/bindings/kotlin/templates/TopLevelFunctionTemplate.kt":"09b8bb5ffea7075518ee657f83017d44ff0cbf584fd85676b082199139c9be09","src/bindings/kotlin/templates/Types.kt":"db7ed7384b4391a4bc1425ec3a89e0c890538ad30f5e115bae4998c059c8a21b","src/bindings/kotlin/templates/UInt16Helper.kt":"e84a1f30a5a899ba2c5db614d3f3c74f25bccf6dd99bf68b8830829332d051e9","src/bindings/kotlin/templates/UInt32Helper.kt":"7cdf08cc580046935f27ba07b53685968608a102e0a6be305111037c63d7ddf8","src/bindings/kotlin/templates/UInt64Helper.kt":"fd7baacbf3ab6202ff83edcc66e5f7beb11a10053ba66d0b49547616cc7cbe1f","src/bindings/kotlin/templates/UInt8Helper.kt":"bbf5a6d66c995aea9fe2fa9840c6bfa78b03520a09469b984f0e1d43191e453a","src/bindings/kotlin/templates/macros.kt":"eb5e0f9915b8ec9fbf3bf1a714625fbdcef7a7ee7461916e87fec872434ed3ec","src/bindings/kotlin/templates/wrapper.kt":"dd81cf28a4e07c685d29c87a4053eccb6339835cfc7fce3cf581d3d111fed4f5","src/bindings/mod.rs":"51ac55a3d505d5a88eedc83cf12623c2738277a9cd22bf3bbe05be1244de078b","src/bindings/python/gen_python/callback_interface.rs":"e3ffb8ba1aa8ac8ddcfff6554e7ec0d2d695d12955a98a04d114d2d6ca5dacc8","src/bindings/python/gen_python/compounds.rs":"e406c773c3b66368ea74973df742cdcba3014521812048f15de7c0e783eedfaf","src/bindings/python/gen_python/custom.rs":"33756f6bdafbd9b1a3a439c1cced3c83dc1fdb82b5ec235c064e69670ea6086c","src/bindings/python/gen_python/enum_.rs":"634c8406b07cbd24ea4f71cae4c971169e4989ce8019188f4bcd515bc3c77c5d","src/bindings/python/gen_python/error.rs":"d1a3b3edb91d9502064463cc3324770a1a6e0f234d6b49b5d7c43636bfe81d59","src/bindings/python/gen_python/external.rs":"8920b7a2a3b39a9647ec17cdff44308db3bfe9a582f026b060003edd76407599","src/bindings/python/gen_python/miscellany.rs":"f3898b75cf494b39662d886eb78d9cc06685650265fc8a1e87e5de67baa342ae","src/bindings/python/gen_python/mod.rs":"552de45cab20c4467bdcc774c305f298c9d7487c6b89f6786cb7ef1774ccddf6","src/bindings/python/gen_python/object.rs":"b4d3d8a935d4acd689cf1f3857d461dbab3a51c7c8bd821890198fb58ef3a63f","src/bindings/python/gen_python/primitives.rs":"928523bb91d2192d615d044f1fef3714681140562b740cf72dce3168e660e276","src/bindings/python/gen_python/record.rs":"f961dfe8dd1e5caa633754de7ecc684c2211c9b6633a5e6beb6053e60500b9f2","src/bindings/python/mod.rs":"bcf295b334b332c7fd1214ddfdaa727cfe37fed531c3862ce25906b3a70b71c7","src/bindings/python/templates/BooleanHelper.py":"d384ffeefcb5982c4875e819d06e919a295eaa9ff57735e6fef0801bb810d5c9","src/bindings/python/templates/CallbackInterfaceRuntime.py":"7ffef485fc008e2d9efcd07326102f300bd4673b4351353e9e2908355936c3d7","src/bindings/python/templates/CallbackInterfaceTemplate.py":"089b5cc1131e8c9b867c899cb649ce22eb9ba6a4addab4ebf9ba63316c394693","src/bindings/python/templates/CustomType.py":"db3309b3f944fb813d4cef47a04d67a86f824183f7e31289184683155fd985d9","src/bindings/python/templates/DurationHelper.py":"179c14dccd8cc7dc9791f896414f0b5d124ec116eb78173371bd8a0743208da1","src/bindings/python/templates/EnumTemplate.py":"825ca373286f1b3b252b8a1263e29c9e2f0d3e170ceb364bd6c28d6c4595597b","src/bindings/python/templates/ErrorTemplate.py":"b6b1b0d3fc074a7c3ba7db394c5d6cb3279b0fc0e6a331154303c2c6c907458b","src/bindings/python/templates/ExternalTemplate.py":"f582a6e872fe9f8275d33d36ffe017028ca459fe7c53aa680a2512718d0c0fda","src/bindings/python/templates/Float32Helper.py":"7dbc51889cff47ebf1600fad490849e4a87cac4fc0d1756eebd21609eb80b4a9","src/bindings/python/templates/Float64Helper.py":"ba9f334d1339b6eaedcacc1e35068939727170a684f41dec9ee04762ed98cec1","src/bindings/python/templates/Helpers.py":"68f03f651c38c810fa453e123e26f7c94b7a1f9178e0d863b985c3c8fabaa642","src/bindings/python/templates/Int16Helper.py":"60c22fb8b445841ebb3c68be11b81c9eba84a680eaa0e30770953361231da9b5","src/bindings/python/templates/Int32Helper.py":"aff0a017cf767394174e46d8c4fe5a5a704a8e6384fcc38d227634dfe7826916","src/bindings/python/templates/Int64Helper.py":"6c314b91699a6c6ad7db3ef636713bc2a0af9609c82acfd6062b0588177c0026","src/bindings/python/templates/Int8Helper.py":"a6e2d121b1a6d59886fceab3949e571aba1abc06dfede52666954bf15366fb6f","src/bindings/python/templates/MapTemplate.py":"bbe609b865010b98b38c58f2d4fcc97f2adec3e931903bf67263a5e440a84400","src/bindings/python/templates/NamespaceLibraryTemplate.py":"4726dbeb61508a71153436126bc04d03af966dca4f5b37511beb8bcfb6f1f307","src/bindings/python/templates/ObjectTemplate.py":"68302f6da6e4e80fc0cc8eb4ef2d4353d19ad3e9955112a2fabec8bf1b1293c7","src/bindings/python/templates/OptionalTemplate.py":"ab6da433370ba7c1316e266247ee1b7165bc02f6f288e40a7c68806c018e3282","src/bindings/python/templates/RecordTemplate.py":"98cef2adbc2b890e5c67257fb32a57380070988ef4112408eeca85e0b87b566b","src/bindings/python/templates/RustBufferHelper.py":"11f733051e63733c637fb19c4758cb58a40d045792028465f36891f89c7c5f36","src/bindings/python/templates/RustBufferTemplate.py":"90950cfeeb7a028aac9b65aeca897b217eddcfa165a0d59e8af037e834f34146","src/bindings/python/templates/SequenceTemplate.py":"faf2b1d5272a66258972d88c29d5b527cf9e589c8399e30f7ad5a0503133ce9b","src/bindings/python/templates/StringHelper.py":"941a7ad71d9598701efa15323df93766934583a55f4266d26db31e6b744603fc","src/bindings/python/templates/TimestampHelper.py":"b412cea69117858c05bae3210d378c6296658ed02a50e87c52c392dcb62c7892","src/bindings/python/templates/TopLevelFunctionTemplate.py":"2b2883b14f324e543cfeea5293d2a4907fa9ebe93b779da7174a58929d8b0442","src/bindings/python/templates/Types.py":"2eee78ca838f65b7e8ff8f760558c71ca80ad314aaa44efd1d1b8e13b349f1bc","src/bindings/python/templates/UInt16Helper.py":"06be5c9dacdf20e586f8236ed75cf2ca2470078fd8570843ea97c581b25bf860","src/bindings/python/templates/UInt32Helper.py":"41bb9bbf9b7be1060945e1267b1cc052585ec43696b1591f0ee779a0be0feaff","src/bindings/python/templates/UInt64Helper.py":"ba2825fc295a07292d9fb4aeebe74dabb9e6dbe505643e2347875ab12e511f31","src/bindings/python/templates/UInt8Helper.py":"dca5b3fc4a429fb233326224f85c4eccd3a7802ca9958ec309c7f197d59b4e3d","src/bindings/python/templates/macros.py":"3f02a32941e20aea15e136780c24c9695021dbcae08044c4f654f75aadcbd1e1","src/bindings/python/templates/wrapper.py":"627a6e18e72040909887261b8ad918c68104b15110df26b2205d7827c690e8c3","src/bindings/ruby/gen_ruby/mod.rs":"33ae9fc3f69e4c5b7bb6df41e53298f89934cee2bb6d7e7ea8488cefc9d06c03","src/bindings/ruby/gen_ruby/tests.rs":"7dcb86b08e643c43503f4cac6396833497f6988b004321c0067700ee29ffbf32","src/bindings/ruby/mod.rs":"f57fccdfc544210e8cc70e01e4991cee6e72d258ede9d2bb226baad24a3ef0d7","src/bindings/ruby/templates/EnumTemplate.rb":"5480edb347f5829e478d19474691babd72f37616ed846d519b5a61cb1d6cf047","src/bindings/ruby/templates/ErrorTemplate.rb":"147b2c3ff44c19624e7bf7b3a2a04b7badbba5743eaefa0d5e6c05943119c87e","src/bindings/ruby/templates/NamespaceLibraryTemplate.rb":"9b1454208bc83ef8f26aef33713d681e2284dbfea986ec0dd6c9b9c8b7d65e4a","src/bindings/ruby/templates/ObjectTemplate.rb":"c2d2fa2db62d48322b66b53888dcc6de2fc3e579a6b8d0a9f24029c18fffcbb5","src/bindings/ruby/templates/RecordTemplate.rb":"4aeff886928ca972e5dc9b799581b30c66a6f6dce446af3285dd3ed6b422dea9","src/bindings/ruby/templates/RustBufferBuilder.rb":"2ee5a4b97fe590de98ec2119b2dfe103bba75e15b5fb3c178fa51dfa662dfe2c","src/bindings/ruby/templates/RustBufferStream.rb":"ddfc38a6388bdddf8cc24bb6f1af948e4eef2d7ae2091a5130fee57cf53e5a7d","src/bindings/ruby/templates/RustBufferTemplate.rb":"8f37664f5436ba74ccdd801e16220f1b879d2fb56f51f5845b6047c92dc079f8","src/bindings/ruby/templates/TopLevelFunctionTemplate.rb":"88213e7e25bef664da939c04dd5621f438af735ffcb4d2d0c24a529538630069","src/bindings/ruby/templates/macros.rb":"d732a62291c78ccfbc3208227c1b57f6add723fad91b7e699d693e360840e1b0","src/bindings/ruby/templates/wrapper.rb":"542cdf46fb871e66089c9f008cf472cca411fe217d8c66a0a66776c35469aab5","src/bindings/swift/gen_swift/callback_interface.rs":"e331871ac6c9ac9b9533848fb6ddfcabc1e605970343cad307b6d86b72ebe96a","src/bindings/swift/gen_swift/compounds.rs":"f9e87b342f1f9a14295d87bad59d786d4c253a24d22900c2aba44816713718ae","src/bindings/swift/gen_swift/custom.rs":"45cdfa35ef7345dc353d0d2f3cebb17d726e90abdf5ef49422d6b2db65f8fd25","src/bindings/swift/gen_swift/enum_.rs":"018eea78ef85c9f8d715a5bc15c8273030d4f6ba297019949eb578c5cc6276fd","src/bindings/swift/gen_swift/error.rs":"bd95c3303e40f03a321f2cdc8e15a0251f4c7ddbc3c32c4c57eb9569db218488","src/bindings/swift/gen_swift/miscellany.rs":"66f16968f6cccc0b61c544e336a49b96218551731dcce566a176903c9afb3b57","src/bindings/swift/gen_swift/mod.rs":"1e8f98e05a5b03798c91ada854f6a4f2a0682c252143d63c16c6a06bd0419e4b","src/bindings/swift/gen_swift/object.rs":"072a44f484cc66694c57a9fa41ba50a531c9ce19738e11ce9df17cdfc007648f","src/bindings/swift/gen_swift/primitives.rs":"b37b8f3ad3aa7e769e6d465a31282e377f93cd69e4dcf39a56dc833f412ed412","src/bindings/swift/gen_swift/record.rs":"48296332960be3731b9139dc664d4b8a5d56d04cffa34dc995b62cf202b4dbfd","src/bindings/swift/mod.rs":"0ad4afd667ef17b3b577ded9a09cdaa5595afbdb24e7474c6b1e6a8e0a024593","src/bindings/swift/templates/BooleanHelper.swift":"f607928c4d598893421fe9c9f183bab2f23a877a07afeb123dbe90515249ec86","src/bindings/swift/templates/BridgingHeaderTemplate.h":"93a289e393ecdbe1bf986215c3b19d2aed7677d47f79b1833ce73cf6f8762e80","src/bindings/swift/templates/CallbackInterfaceRuntime.swift":"aac01eb4269151be9dde8c95ee8eba7e8d0841b3c2b1dbd88885f01ac64ee147","src/bindings/swift/templates/CallbackInterfaceTemplate.swift":"c9700f52e932556c59a9bfea68fc786746b7f321ff75c33d0a8c1565effaeef5","src/bindings/swift/templates/CustomType.swift":"fe6414f2ce3ea7b148742e2fecf2206d7e69935dd78d56e014aec70f4d6ad3ec","src/bindings/swift/templates/DurationHelper.swift":"bca4a6498b27fe0c877df3c7fbe148538eeda03e68d4e760a7c8a6a15f2067ff","src/bindings/swift/templates/EnumTemplate.swift":"e61bdf7949aa5a7b55a2c10c243e960f683c862e5977f06e7f5956646b4ccb49","src/bindings/swift/templates/ErrorTemplate.swift":"58fb5907d20b7a6db67b128e5f6350015278990fef5945be42477a5b5f82bb18","src/bindings/swift/templates/Float32Helper.swift":"6c1a4da059dd4c6c4392511c93fe9daf4ddeeab71e39afd122797b0e19254318","src/bindings/swift/templates/Float64Helper.swift":"f741568cdfb8e1421369a9a1dc845630a3a0e2dc2d6acf157afd80cd3ef5966f","src/bindings/swift/templates/Helpers.swift":"3cf3a5342a1ef0c7e078b0e58c32ae4437c4fb5dc41acbbd56b1128393c76602","src/bindings/swift/templates/Int16Helper.swift":"76eec2a54a65790c5959380cc9a7362b1e2e201632cccb789153c52e10c8dc4f","src/bindings/swift/templates/Int32Helper.swift":"5afc5e103bf637813fd4b77ab63e47ed38893525101a483218a339f222710061","src/bindings/swift/templates/Int64Helper.swift":"c1a6f6661ef1ad3bd00e8d0bf81adaa6539686eee2b481b046b76dbd87681adf","src/bindings/swift/templates/Int8Helper.swift":"bc46598c966e579cca22d336748c74cdce5674eaaaf75fc24e5fdaa36a43cf9c","src/bindings/swift/templates/MapTemplate.swift":"8b5a9cb41a1ad41b5566fbe3906a1449e5453289208a9fc6a611de1eb937142a","src/bindings/swift/templates/ModuleMapTemplate.modulemap":"99ad1e9bf550a21497296f9248ecd4385dd6d0b5892951d24cf990cdbf3eec2c","src/bindings/swift/templates/ObjectTemplate.swift":"98f744d7baf41e28d9184ae7e1aa9522b1bd951d507e0987879b11d7995782aa","src/bindings/swift/templates/OptionalTemplate.swift":"73f777d2df4fdf42daf0d6035436d168b0d5f0abc15153b97029bc305408f597","src/bindings/swift/templates/RecordTemplate.swift":"af0dc13b32d34254b4cfef3b74f52fd4611aa6c32e055e203414511fd3bbb00a","src/bindings/swift/templates/RustBufferTemplate.swift":"ed16f20cecd264f086c923cd92a5198f444aec99aad4d39e9012f09f530ca809","src/bindings/swift/templates/SequenceTemplate.swift":"977f1409909ff08018c0a80c1330737023b39a8f9fa9a13f5bf9ab4806cac199","src/bindings/swift/templates/StringHelper.swift":"b773c2b3a03f30338ff233881d1b0c0238831b812eff6eb9f0fafcb32ab0743a","src/bindings/swift/templates/TimestampHelper.swift":"6e22e370feae1199bff16bcc6f431decfb7700b02e6afdd84693a0c474eb045e","src/bindings/swift/templates/TopLevelFunctionTemplate.swift":"ca7fcbaa06ee31c7433fd6aa238b6c1135a843f469d9b4f37d4874d514fd80d0","src/bindings/swift/templates/Types.swift":"2f42430cb4ffba8e9b5084c0cf8790fb5bae151878134b8a21e745acf75d2b08","src/bindings/swift/templates/UInt16Helper.swift":"16adb3b50403dad114fad0b86bc220c5adc3bd987c57c290aee7c6407891dfbc","src/bindings/swift/templates/UInt32Helper.swift":"680ddd2815184f520723820f10698a089c222df0388bc0f7734c6d5234194aec","src/bindings/swift/templates/UInt64Helper.swift":"b752852162028a0c132f79f9005c47c263a4dab98833e86758cd7b467e305629","src/bindings/swift/templates/UInt8Helper.swift":"54f4821e704969eeb5c0e002b890d975a20eda3ddc3ee56169ee3c615dfa1079","src/bindings/swift/templates/macros.swift":"0744724c37419e894132b39aea4b8e1f473460583883fa37f38c787a7deea32c","src/bindings/swift/templates/wrapper.swift":"ca1af5fe47bca972c76fb8c9f52b18f727d4343204408de3dd0aae384f0a4171","src/interface/attributes.rs":"2f76377eebdd62e770bb9089885482a49a57e1f8405320bb778353f3e8974447","src/interface/callbacks.rs":"c9f4b97b21195ba2d1787f032f1daa5f4ce2fc40e014942e07e4eb37b5b95ee9","src/interface/enum_.rs":"1a7cda619a986a20fd4d0f145206aba2c500ce5dfca90d01e5324996fd68dc04","src/interface/error.rs":"f31fc0a7e41b4c8f4b81d06958fda14af6f05bfa318206098e0ec351cf4db809","src/interface/ffi.rs":"22d24e4dda327fa78c7632a6e5bbe374ecac0165acc550007feb729d8f4d6adf","src/interface/function.rs":"d6df6d8d412d7c45fe33c7337b37aeb851ae0f21834c4bd8b315aad4ca4ec309","src/interface/literal.rs":"3d2102cb47ff658f329d66d6c867b13a50e7f56535f23c1b414f857741360358","src/interface/mod.rs":"1d1993504ce61a2f578cb6fb42c79b7829a0767c20983581d631ee948819665e","src/interface/namespace.rs":"ab0f63241bb6a0a32f9fd2a1544468cb6daa1f91f6116b7246b52a4a94e4f461","src/interface/object.rs":"44836747d5d00bb40ecadb889c9a6ff32c1cbf625b5a6a337f5891f495fd92fd","src/interface/record.rs":"5859ea6c1f6c5524d1e6f3846954986710d5f74f1c6fd6324c4245b5f70013d5","src/interface/types/finder.rs":"a27f24e64b5bfc796378d1012b5e72001f0a442e8185fdc4430b106595d4b819","src/interface/types/mod.rs":"fe63c3fd233ad905af0358c5d610c85a5a57f263eb899acc756454a1029c4569","src/interface/types/resolver.rs":"7e7ce336ef77c0a6c23deea36856737a97cca9b1c3f5cd0d676fe7df6ade6480","src/lib.rs":"a41b43e3628bb6b3f725580eec255b409947945672887de87c21d5122775a245","src/macro_metadata/ci.rs":"0d6e53d2b5645dd3cc7d196bd3a32ee82c029e1adb9ae93708c27a3fa5c55a88","src/macro_metadata/extract.rs":"ec392692a4601343312f60937987fe460cfb40d2c63a6bb1531fe91903916f10","src/macro_metadata/mod.rs":"1668e6d947fd4a957f557410a8095649de6f8d7fd3eb6a403b8587280dca2d54","src/main.rs":"bbf8e9942d398387e7518533f9b9dc42bfa66156430a87a17605a80a356c0dea","src/scaffolding/mod.rs":"35ae72220843cf3cccefd96e190553e32a5f34ccc58d552fd9165faea12db260","src/scaffolding/templates/CallbackInterfaceTemplate.rs":"3c8caa2e148add8d80701894ee6904fc2d3c5c6424d6d414b36edb6f593b5023","src/scaffolding/templates/EnumTemplate.rs":"eb8802f04f1fd1c9451ad72c1195c136288fdb4e488922b24db75b2fdae65cd7","src/scaffolding/templates/ErrorTemplate.rs":"e7ca4538908a273dd7ba3834219b30fa0e537b2171144f06b6a96fbefb90cd1d","src/scaffolding/templates/ExternalTypesTemplate.rs":"8ecc805cf119abac8c5f60605f9183ee9ec8d37f9ec75bba5e18bb8b482a1abb","src/scaffolding/templates/ObjectTemplate.rs":"34de640428486e17a61ded4f42ce13d8eac3e66cc9f60196ce2575cdc0bd8df6","src/scaffolding/templates/RecordTemplate.rs":"e8d5af954f46f023a243721d6fc70aa176c3a4c0a9dd340048bfe46f3eeed783","src/scaffolding/templates/ReexportUniFFIScaffolding.rs":"559a17c8e39c473ff1effe9651f05b83d443ecd8abed13e03f2b63872d7e1593","src/scaffolding/templates/RustBuffer.rs":"ccf7521012d93c41265375c6d2e80ce861ec93b41383da83c37718386dd726f6","src/scaffolding/templates/TopLevelFunctionTemplate.rs":"35eaefb0862f25ff683d58fb0be6ad5f74bbe2fc85047273200c3a5f4c728434","src/scaffolding/templates/macros.rs":"a41c9690d411074c59fc4609f897431669b9d939625a08f5304a71a88901ba7c","src/scaffolding/templates/scaffolding_template.rs":"3589f8e8e1f9b194ff4a6245665d3a421c771dec3cc947c4264bfcd34573550e"},"package":"12cc4af3c0180c7e86c4a3acf2b6587af04ba2567b1e948993df10f421796621"}
+\ No newline at end of file
++{"files":{"Cargo.lock":"3b1693f0ada97ba7e0527d763402404b39fe341da22bd45aaf057e4be3fa3234","Cargo.toml":"58662147277f1620eccd6592f83623cf71959df8326e9d700fdaac47c6e6cf35","askama.toml":"1a245b7803adca782837e125c49100147d2de0d5a1c949ff95e91af1701f6058","src/backend/config.rs":"4861dbf251dbb10beb1ed7e3eea7d79499a0de1cd9ce9ee8381a0e729c097dea","src/backend/declarations.rs":"12b8d6e651f84634de5cd02a47601965df7438f64f1a73f136bd89b6b5d515cf","src/backend/mod.rs":"899cd3b816d0467e35789b92ac3b8d5910f6dab98156d405db4803da8721fd36","src/backend/oracle.rs":"9e2b8a45af604a6e4952644e81f43f6aec6e0a1d03939c68b582529dd01a51e0","src/backend/types.rs":"7c49a92096a54eefd2336c48d60fe20ded9490142ab3a229a7c1a99fec14df3d","src/bindings/kotlin/gen_kotlin/callback_interface.rs":"b7fe795670830f3aa8a955c787b1127fe68313ee751013948527948fe5526b01","src/bindings/kotlin/gen_kotlin/compounds.rs":"d1e9a4237ff2ff711a3eae7a564c39e26f598c156ebfd34c0f04879e3533dd4f","src/bindings/kotlin/gen_kotlin/custom.rs":"4176f6ed5f66504f8fd981198bbfbae795dab5ef0d0281881d19b697f5560c44","src/bindings/kotlin/gen_kotlin/enum_.rs":"f85ae8dcb55c8f274139bf321af0ba237ae69894165ad6bd693d793f58af8e5e","src/bindings/kotlin/gen_kotlin/error.rs":"867f583aea5da7aabeb9b6d2544d7e52984cdea4aa008ce5f2ec941074735e1a","src/bindings/kotlin/gen_kotlin/external.rs":"1f7e91d7439891fe3c403274e35880ee4fc3a0da555510bdfa23c1ed2bbd8020","src/bindings/kotlin/gen_kotlin/miscellany.rs":"644ee5bb1f3619be5a36b2b3900af554ea38073cd054004f421e69c3cb8d50bc","src/bindings/kotlin/gen_kotlin/mod.rs":"90412e7927c284668a9eb75823c198182e58e5177d5561896c43b79367564b27","src/bindings/kotlin/gen_kotlin/object.rs":"6478a3e9d5e66186521730d0d481abd1ee4f123050ea050ac5a483842f08b003","src/bindings/kotlin/gen_kotlin/primitives.rs":"914d1f8253ed6a2937f67e8bd8f04f46aef4f22455ceb8a6caa84427adc2093e","src/bindings/kotlin/gen_kotlin/record.rs":"7961fcfbec5ebf8fc010b564ea4bd59402c919f6922898d48226d8c995569dd7","src/bindings/kotlin/mod.rs":"e68f2ea29e66ee62a56704e1e4464eea6d28bbdb52ab187bbe7a57ab3f362ea7","src/bindings/kotlin/templates/BooleanHelper.kt":"28e8a5088c8d58c9bfdbc575af8d8725060521fdd7d092684a8044b24ae567c7","src/bindings/kotlin/templates/CallbackInterfaceRuntime.kt":"6ede374b0fcbb3bcc939894e6f4729b3bec7ec7356831a60fba96ca38dc91aa8","src/bindings/kotlin/templates/CallbackInterfaceTemplate.kt":"5a704eb8c044ed22905e4d526ee3fc0b86f42fe82ac1eb4ad3758ad0552ea8c8","src/bindings/kotlin/templates/CustomTypeTemplate.kt":"5d4dacf29e89bcdcc46d155d993e6059d2df704e775dc853469310198253b231","src/bindings/kotlin/templates/DurationHelper.kt":"414a98161538a26f3a9b357353270c1f245ad6ceed99496aca7162cf473a92fd","src/bindings/kotlin/templates/EnumTemplate.kt":"ab3e2063aad3b91188db839dceb59b854a6a8b60fb35e545e270e64fee7c73fa","src/bindings/kotlin/templates/ErrorTemplate.kt":"a5ec2bdfc026838e1096dbf3301f21aa4ea22e8c93458d45bb1c8c7b9ee1fc5b","src/bindings/kotlin/templates/ExternalTypeTemplate.kt":"2097e0b830640ef18c79449ffa376d1dd35a8c4a5230e413c915f3b868aae872","src/bindings/kotlin/templates/FfiConverterTemplate.kt":"aa22962aaa9f641d48ccf44cb56d9f8a7736cbfaa01e1a1656662cfe5dd5c1d7","src/bindings/kotlin/templates/Float32Helper.kt":"662d95af3b629d143fb4d47cb7e9aa26ed28a5f3846de0341e28b0f9fb08bc25","src/bindings/kotlin/templates/Float64Helper.kt":"a77d099fa7d91e8702c1700e7949ffb6aaba9c6e8041ff48bab34b8e1fc9a0aa","src/bindings/kotlin/templates/Helpers.kt":"46c07798a26b53b06405c8bbbf86e3fcf38fadc1484ea04ce9d482defea89288","src/bindings/kotlin/templates/Int16Helper.kt":"7f83c4a48e1f3b2a59a3ca6a2662be8bc9baf3a5a748b31223cb3f51721ef249","src/bindings/kotlin/templates/Int32Helper.kt":"e02e4702175554b09fd2dd6ac3089dcd2c395f08ec60e762159566a9c9889450","src/bindings/kotlin/templates/Int64Helper.kt":"7a6fd6ca486852c89399c699935a9dfa1c32b9356d9a965cfde532581f05d9fa","src/bindings/kotlin/templates/Int8Helper.kt":"0554545494b6b9a76ce94f9c1723f8cf4230a13076feb75d620b1c9ca1ac4668","src/bindings/kotlin/templates/MapTemplate.kt":"399569d6443e8ad01e2deb95d78d8d2d15bf8eccee8be4fbe9ce4b8ebc0a6101","src/bindings/kotlin/templates/NamespaceLibraryTemplate.kt":"1eba4e77381155c2c96a6af2ef30fca881ade4957852f730fd10aa4f3d9cd3c4","src/bindings/kotlin/templates/ObjectRuntime.kt":"c11d233de41405caa55a56bcaa3bb69ce153ffa6fdff2aa218051929f5c4aeec","src/bindings/kotlin/templates/ObjectTemplate.kt":"7e32d92ec6116da9b7d7f278b15333a2fd2a82dde8c21534e3f6fe371d19f333","src/bindings/kotlin/templates/OptionalTemplate.kt":"5f9f2c1baa829ed3c9b61c3edb0f1fccf5ea3cccc052a69cf8966715d8fcf149","src/bindings/kotlin/templates/RecordTemplate.kt":"193ecdad9322fb5483b95bf2a259270a9b22ba054790794e9abb3fd219196bc5","src/bindings/kotlin/templates/RustBufferTemplate.kt":"415637f80a78c12b3d00db063c14a7ab5c61b098bdb1fc81a0be8bae9511776b","src/bindings/kotlin/templates/SequenceTemplate.kt":"786693b20c608a4f059b91df115278f5f12122b4c14a2e7ce18b6fc9b22b1296","src/bindings/kotlin/templates/StringHelper.kt":"060839663580d8199671b7c3bb3dce5e9106aa766ce2c6e0afc2d2bd788a1d83","src/bindings/kotlin/templates/TimestampHelper.kt":"353c2890f06ad6dda238e9aebb4bdff7bb838e17e46abf351ed3ff1fbc4e6580","src/bindings/kotlin/templates/TopLevelFunctionTemplate.kt":"09b8bb5ffea7075518ee657f83017d44ff0cbf584fd85676b082199139c9be09","src/bindings/kotlin/templates/Types.kt":"db7ed7384b4391a4bc1425ec3a89e0c890538ad30f5e115bae4998c059c8a21b","src/bindings/kotlin/templates/UInt16Helper.kt":"e84a1f30a5a899ba2c5db614d3f3c74f25bccf6dd99bf68b8830829332d051e9","src/bindings/kotlin/templates/UInt32Helper.kt":"7cdf08cc580046935f27ba07b53685968608a102e0a6be305111037c63d7ddf8","src/bindings/kotlin/templates/UInt64Helper.kt":"fd7baacbf3ab6202ff83edcc66e5f7beb11a10053ba66d0b49547616cc7cbe1f","src/bindings/kotlin/templates/UInt8Helper.kt":"bbf5a6d66c995aea9fe2fa9840c6bfa78b03520a09469b984f0e1d43191e453a","src/bindings/kotlin/templates/macros.kt":"eb5e0f9915b8ec9fbf3bf1a714625fbdcef7a7ee7461916e87fec872434ed3ec","src/bindings/kotlin/templates/wrapper.kt":"dd81cf28a4e07c685d29c87a4053eccb6339835cfc7fce3cf581d3d111fed4f5","src/bindings/mod.rs":"51ac55a3d505d5a88eedc83cf12623c2738277a9cd22bf3bbe05be1244de078b","src/bindings/python/gen_python/callback_interface.rs":"e3ffb8ba1aa8ac8ddcfff6554e7ec0d2d695d12955a98a04d114d2d6ca5dacc8","src/bindings/python/gen_python/compounds.rs":"e406c773c3b66368ea74973df742cdcba3014521812048f15de7c0e783eedfaf","src/bindings/python/gen_python/custom.rs":"33756f6bdafbd9b1a3a439c1cced3c83dc1fdb82b5ec235c064e69670ea6086c","src/bindings/python/gen_python/enum_.rs":"634c8406b07cbd24ea4f71cae4c971169e4989ce8019188f4bcd515bc3c77c5d","src/bindings/python/gen_python/error.rs":"d1a3b3edb91d9502064463cc3324770a1a6e0f234d6b49b5d7c43636bfe81d59","src/bindings/python/gen_python/external.rs":"8920b7a2a3b39a9647ec17cdff44308db3bfe9a582f026b060003edd76407599","src/bindings/python/gen_python/miscellany.rs":"f3898b75cf494b39662d886eb78d9cc06685650265fc8a1e87e5de67baa342ae","src/bindings/python/gen_python/mod.rs":"552de45cab20c4467bdcc774c305f298c9d7487c6b89f6786cb7ef1774ccddf6","src/bindings/python/gen_python/object.rs":"b4d3d8a935d4acd689cf1f3857d461dbab3a51c7c8bd821890198fb58ef3a63f","src/bindings/python/gen_python/primitives.rs":"928523bb91d2192d615d044f1fef3714681140562b740cf72dce3168e660e276","src/bindings/python/gen_python/record.rs":"f961dfe8dd1e5caa633754de7ecc684c2211c9b6633a5e6beb6053e60500b9f2","src/bindings/python/mod.rs":"bcf295b334b332c7fd1214ddfdaa727cfe37fed531c3862ce25906b3a70b71c7","src/bindings/python/templates/BooleanHelper.py":"d384ffeefcb5982c4875e819d06e919a295eaa9ff57735e6fef0801bb810d5c9","src/bindings/python/templates/CallbackInterfaceRuntime.py":"7ffef485fc008e2d9efcd07326102f300bd4673b4351353e9e2908355936c3d7","src/bindings/python/templates/CallbackInterfaceTemplate.py":"089b5cc1131e8c9b867c899cb649ce22eb9ba6a4addab4ebf9ba63316c394693","src/bindings/python/templates/CustomType.py":"db3309b3f944fb813d4cef47a04d67a86f824183f7e31289184683155fd985d9","src/bindings/python/templates/DurationHelper.py":"179c14dccd8cc7dc9791f896414f0b5d124ec116eb78173371bd8a0743208da1","src/bindings/python/templates/EnumTemplate.py":"825ca373286f1b3b252b8a1263e29c9e2f0d3e170ceb364bd6c28d6c4595597b","src/bindings/python/templates/ErrorTemplate.py":"b6b1b0d3fc074a7c3ba7db394c5d6cb3279b0fc0e6a331154303c2c6c907458b","src/bindings/python/templates/ExternalTemplate.py":"f582a6e872fe9f8275d33d36ffe017028ca459fe7c53aa680a2512718d0c0fda","src/bindings/python/templates/Float32Helper.py":"7dbc51889cff47ebf1600fad490849e4a87cac4fc0d1756eebd21609eb80b4a9","src/bindings/python/templates/Float64Helper.py":"ba9f334d1339b6eaedcacc1e35068939727170a684f41dec9ee04762ed98cec1","src/bindings/python/templates/Helpers.py":"68f03f651c38c810fa453e123e26f7c94b7a1f9178e0d863b985c3c8fabaa642","src/bindings/python/templates/Int16Helper.py":"60c22fb8b445841ebb3c68be11b81c9eba84a680eaa0e30770953361231da9b5","src/bindings/python/templates/Int32Helper.py":"aff0a017cf767394174e46d8c4fe5a5a704a8e6384fcc38d227634dfe7826916","src/bindings/python/templates/Int64Helper.py":"6c314b91699a6c6ad7db3ef636713bc2a0af9609c82acfd6062b0588177c0026","src/bindings/python/templates/Int8Helper.py":"a6e2d121b1a6d59886fceab3949e571aba1abc06dfede52666954bf15366fb6f","src/bindings/python/templates/MapTemplate.py":"bbe609b865010b98b38c58f2d4fcc97f2adec3e931903bf67263a5e440a84400","src/bindings/python/templates/NamespaceLibraryTemplate.py":"4726dbeb61508a71153436126bc04d03af966dca4f5b37511beb8bcfb6f1f307","src/bindings/python/templates/ObjectTemplate.py":"68302f6da6e4e80fc0cc8eb4ef2d4353d19ad3e9955112a2fabec8bf1b1293c7","src/bindings/python/templates/OptionalTemplate.py":"ab6da433370ba7c1316e266247ee1b7165bc02f6f288e40a7c68806c018e3282","src/bindings/python/templates/RecordTemplate.py":"98cef2adbc2b890e5c67257fb32a57380070988ef4112408eeca85e0b87b566b","src/bindings/python/templates/RustBufferHelper.py":"11f733051e63733c637fb19c4758cb58a40d045792028465f36891f89c7c5f36","src/bindings/python/templates/RustBufferTemplate.py":"90950cfeeb7a028aac9b65aeca897b217eddcfa165a0d59e8af037e834f34146","src/bindings/python/templates/SequenceTemplate.py":"faf2b1d5272a66258972d88c29d5b527cf9e589c8399e30f7ad5a0503133ce9b","src/bindings/python/templates/StringHelper.py":"941a7ad71d9598701efa15323df93766934583a55f4266d26db31e6b744603fc","src/bindings/python/templates/TimestampHelper.py":"b412cea69117858c05bae3210d378c6296658ed02a50e87c52c392dcb62c7892","src/bindings/python/templates/TopLevelFunctionTemplate.py":"2b2883b14f324e543cfeea5293d2a4907fa9ebe93b779da7174a58929d8b0442","src/bindings/python/templates/Types.py":"2eee78ca838f65b7e8ff8f760558c71ca80ad314aaa44efd1d1b8e13b349f1bc","src/bindings/python/templates/UInt16Helper.py":"06be5c9dacdf20e586f8236ed75cf2ca2470078fd8570843ea97c581b25bf860","src/bindings/python/templates/UInt32Helper.py":"41bb9bbf9b7be1060945e1267b1cc052585ec43696b1591f0ee779a0be0feaff","src/bindings/python/templates/UInt64Helper.py":"ba2825fc295a07292d9fb4aeebe74dabb9e6dbe505643e2347875ab12e511f31","src/bindings/python/templates/UInt8Helper.py":"dca5b3fc4a429fb233326224f85c4eccd3a7802ca9958ec309c7f197d59b4e3d","src/bindings/python/templates/macros.py":"3f02a32941e20aea15e136780c24c9695021dbcae08044c4f654f75aadcbd1e1","src/bindings/python/templates/wrapper.py":"627a6e18e72040909887261b8ad918c68104b15110df26b2205d7827c690e8c3","src/bindings/ruby/gen_ruby/mod.rs":"33ae9fc3f69e4c5b7bb6df41e53298f89934cee2bb6d7e7ea8488cefc9d06c03","src/bindings/ruby/gen_ruby/tests.rs":"7dcb86b08e643c43503f4cac6396833497f6988b004321c0067700ee29ffbf32","src/bindings/ruby/mod.rs":"f57fccdfc544210e8cc70e01e4991cee6e72d258ede9d2bb226baad24a3ef0d7","src/bindings/ruby/templates/EnumTemplate.rb":"5480edb347f5829e478d19474691babd72f37616ed846d519b5a61cb1d6cf047","src/bindings/ruby/templates/ErrorTemplate.rb":"147b2c3ff44c19624e7bf7b3a2a04b7badbba5743eaefa0d5e6c05943119c87e","src/bindings/ruby/templates/NamespaceLibraryTemplate.rb":"9b1454208bc83ef8f26aef33713d681e2284dbfea986ec0dd6c9b9c8b7d65e4a","src/bindings/ruby/templates/ObjectTemplate.rb":"c2d2fa2db62d48322b66b53888dcc6de2fc3e579a6b8d0a9f24029c18fffcbb5","src/bindings/ruby/templates/RecordTemplate.rb":"4aeff886928ca972e5dc9b799581b30c66a6f6dce446af3285dd3ed6b422dea9","src/bindings/ruby/templates/RustBufferBuilder.rb":"2ee5a4b97fe590de98ec2119b2dfe103bba75e15b5fb3c178fa51dfa662dfe2c","src/bindings/ruby/templates/RustBufferStream.rb":"ddfc38a6388bdddf8cc24bb6f1af948e4eef2d7ae2091a5130fee57cf53e5a7d","src/bindings/ruby/templates/RustBufferTemplate.rb":"8f37664f5436ba74ccdd801e16220f1b879d2fb56f51f5845b6047c92dc079f8","src/bindings/ruby/templates/TopLevelFunctionTemplate.rb":"88213e7e25bef664da939c04dd5621f438af735ffcb4d2d0c24a529538630069","src/bindings/ruby/templates/macros.rb":"d732a62291c78ccfbc3208227c1b57f6add723fad91b7e699d693e360840e1b0","src/bindings/ruby/templates/wrapper.rb":"542cdf46fb871e66089c9f008cf472cca411fe217d8c66a0a66776c35469aab5","src/bindings/swift/gen_swift/callback_interface.rs":"e331871ac6c9ac9b9533848fb6ddfcabc1e605970343cad307b6d86b72ebe96a","src/bindings/swift/gen_swift/compounds.rs":"f9e87b342f1f9a14295d87bad59d786d4c253a24d22900c2aba44816713718ae","src/bindings/swift/gen_swift/custom.rs":"45cdfa35ef7345dc353d0d2f3cebb17d726e90abdf5ef49422d6b2db65f8fd25","src/bindings/swift/gen_swift/enum_.rs":"018eea78ef85c9f8d715a5bc15c8273030d4f6ba297019949eb578c5cc6276fd","src/bindings/swift/gen_swift/error.rs":"bd95c3303e40f03a321f2cdc8e15a0251f4c7ddbc3c32c4c57eb9569db218488","src/bindings/swift/gen_swift/miscellany.rs":"66f16968f6cccc0b61c544e336a49b96218551731dcce566a176903c9afb3b57","src/bindings/swift/gen_swift/mod.rs":"1e8f98e05a5b03798c91ada854f6a4f2a0682c252143d63c16c6a06bd0419e4b","src/bindings/swift/gen_swift/object.rs":"072a44f484cc66694c57a9fa41ba50a531c9ce19738e11ce9df17cdfc007648f","src/bindings/swift/gen_swift/primitives.rs":"b37b8f3ad3aa7e769e6d465a31282e377f93cd69e4dcf39a56dc833f412ed412","src/bindings/swift/gen_swift/record.rs":"48296332960be3731b9139dc664d4b8a5d56d04cffa34dc995b62cf202b4dbfd","src/bindings/swift/mod.rs":"0ad4afd667ef17b3b577ded9a09cdaa5595afbdb24e7474c6b1e6a8e0a024593","src/bindings/swift/templates/BooleanHelper.swift":"f607928c4d598893421fe9c9f183bab2f23a877a07afeb123dbe90515249ec86","src/bindings/swift/templates/BridgingHeaderTemplate.h":"93a289e393ecdbe1bf986215c3b19d2aed7677d47f79b1833ce73cf6f8762e80","src/bindings/swift/templates/CallbackInterfaceRuntime.swift":"aac01eb4269151be9dde8c95ee8eba7e8d0841b3c2b1dbd88885f01ac64ee147","src/bindings/swift/templates/CallbackInterfaceTemplate.swift":"c9700f52e932556c59a9bfea68fc786746b7f321ff75c33d0a8c1565effaeef5","src/bindings/swift/templates/CustomType.swift":"fe6414f2ce3ea7b148742e2fecf2206d7e69935dd78d56e014aec70f4d6ad3ec","src/bindings/swift/templates/DurationHelper.swift":"bca4a6498b27fe0c877df3c7fbe148538eeda03e68d4e760a7c8a6a15f2067ff","src/bindings/swift/templates/EnumTemplate.swift":"e61bdf7949aa5a7b55a2c10c243e960f683c862e5977f06e7f5956646b4ccb49","src/bindings/swift/templates/ErrorTemplate.swift":"58fb5907d20b7a6db67b128e5f6350015278990fef5945be42477a5b5f82bb18","src/bindings/swift/templates/Float32Helper.swift":"6c1a4da059dd4c6c4392511c93fe9daf4ddeeab71e39afd122797b0e19254318","src/bindings/swift/templates/Float64Helper.swift":"f741568cdfb8e1421369a9a1dc845630a3a0e2dc2d6acf157afd80cd3ef5966f","src/bindings/swift/templates/Helpers.swift":"3cf3a5342a1ef0c7e078b0e58c32ae4437c4fb5dc41acbbd56b1128393c76602","src/bindings/swift/templates/Int16Helper.swift":"76eec2a54a65790c5959380cc9a7362b1e2e201632cccb789153c52e10c8dc4f","src/bindings/swift/templates/Int32Helper.swift":"5afc5e103bf637813fd4b77ab63e47ed38893525101a483218a339f222710061","src/bindings/swift/templates/Int64Helper.swift":"c1a6f6661ef1ad3bd00e8d0bf81adaa6539686eee2b481b046b76dbd87681adf","src/bindings/swift/templates/Int8Helper.swift":"bc46598c966e579cca22d336748c74cdce5674eaaaf75fc24e5fdaa36a43cf9c","src/bindings/swift/templates/MapTemplate.swift":"8b5a9cb41a1ad41b5566fbe3906a1449e5453289208a9fc6a611de1eb937142a","src/bindings/swift/templates/ModuleMapTemplate.modulemap":"99ad1e9bf550a21497296f9248ecd4385dd6d0b5892951d24cf990cdbf3eec2c","src/bindings/swift/templates/ObjectTemplate.swift":"98f744d7baf41e28d9184ae7e1aa9522b1bd951d507e0987879b11d7995782aa","src/bindings/swift/templates/OptionalTemplate.swift":"73f777d2df4fdf42daf0d6035436d168b0d5f0abc15153b97029bc305408f597","src/bindings/swift/templates/RecordTemplate.swift":"af0dc13b32d34254b4cfef3b74f52fd4611aa6c32e055e203414511fd3bbb00a","src/bindings/swift/templates/RustBufferTemplate.swift":"ed16f20cecd264f086c923cd92a5198f444aec99aad4d39e9012f09f530ca809","src/bindings/swift/templates/SequenceTemplate.swift":"977f1409909ff08018c0a80c1330737023b39a8f9fa9a13f5bf9ab4806cac199","src/bindings/swift/templates/StringHelper.swift":"b773c2b3a03f30338ff233881d1b0c0238831b812eff6eb9f0fafcb32ab0743a","src/bindings/swift/templates/TimestampHelper.swift":"6e22e370feae1199bff16bcc6f431decfb7700b02e6afdd84693a0c474eb045e","src/bindings/swift/templates/TopLevelFunctionTemplate.swift":"ca7fcbaa06ee31c7433fd6aa238b6c1135a843f469d9b4f37d4874d514fd80d0","src/bindings/swift/templates/Types.swift":"2f42430cb4ffba8e9b5084c0cf8790fb5bae151878134b8a21e745acf75d2b08","src/bindings/swift/templates/UInt16Helper.swift":"16adb3b50403dad114fad0b86bc220c5adc3bd987c57c290aee7c6407891dfbc","src/bindings/swift/templates/UInt32Helper.swift":"680ddd2815184f520723820f10698a089c222df0388bc0f7734c6d5234194aec","src/bindings/swift/templates/UInt64Helper.swift":"b752852162028a0c132f79f9005c47c263a4dab98833e86758cd7b467e305629","src/bindings/swift/templates/UInt8Helper.swift":"54f4821e704969eeb5c0e002b890d975a20eda3ddc3ee56169ee3c615dfa1079","src/bindings/swift/templates/macros.swift":"0744724c37419e894132b39aea4b8e1f473460583883fa37f38c787a7deea32c","src/bindings/swift/templates/wrapper.swift":"ca1af5fe47bca972c76fb8c9f52b18f727d4343204408de3dd0aae384f0a4171","src/interface/attributes.rs":"6c062b60deb332fbb76e70bc675e65c2bc3f2060fad7cec87492609fa9ce166c","src/interface/callbacks.rs":"e311fe8c80fae1d84c1e867a3c36a47a6d6a41847bb2d633edefac7c69402c84","src/interface/enum_.rs":"4ff34ff12c19be0bc9d807020fd4c8e20660c418741e68408671a18165e4b95b","src/interface/error.rs":"85a61e5bb38b369b60110928a78dc84ae77a06d0cbae4dfe9ff9dff2b8c27e5a","src/interface/ffi.rs":"22d24e4dda327fa78c7632a6e5bbe374ecac0165acc550007feb729d8f4d6adf","src/interface/function.rs":"19219c6c984d4117362ee5c269712ec2ad462476902442062ef2a3b0619b014c","src/interface/literal.rs":"d93d168176ba2824d26c490396f4baffc1d418c3c94e4a1ef0ceb3cfca16a239","src/interface/mod.rs":"88dd169859004da79bd1488e6432bc7dae8b6cba9238cab1d676e570dad31d62","src/interface/namespace.rs":"ab0f63241bb6a0a32f9fd2a1544468cb6daa1f91f6116b7246b52a4a94e4f461","src/interface/object.rs":"106cbf5ec2a684700dd99c9748ba161320abb2cecec3c5022d5dd1a9ec4f5b85","src/interface/record.rs":"5b9db093c0c90f5c757e09e6c9afee6b99e2e724c7b388924990b1a6f46357e9","src/interface/types/finder.rs":"a27f24e64b5bfc796378d1012b5e72001f0a442e8185fdc4430b106595d4b819","src/interface/types/mod.rs":"25a598fd206975cc1e62aaa269b461654c913ad6c0b6a2719c486acfcc68b45b","src/interface/types/resolver.rs":"7e7ce336ef77c0a6c23deea36856737a97cca9b1c3f5cd0d676fe7df6ade6480","src/lib.rs":"a41b43e3628bb6b3f725580eec255b409947945672887de87c21d5122775a245","src/macro_metadata/ci.rs":"0d6e53d2b5645dd3cc7d196bd3a32ee82c029e1adb9ae93708c27a3fa5c55a88","src/macro_metadata/extract.rs":"ec392692a4601343312f60937987fe460cfb40d2c63a6bb1531fe91903916f10","src/macro_metadata/mod.rs":"1668e6d947fd4a957f557410a8095649de6f8d7fd3eb6a403b8587280dca2d54","src/main.rs":"bbf8e9942d398387e7518533f9b9dc42bfa66156430a87a17605a80a356c0dea","src/scaffolding/mod.rs":"35ae72220843cf3cccefd96e190553e32a5f34ccc58d552fd9165faea12db260","src/scaffolding/templates/CallbackInterfaceTemplate.rs":"3c8caa2e148add8d80701894ee6904fc2d3c5c6424d6d414b36edb6f593b5023","src/scaffolding/templates/EnumTemplate.rs":"eb8802f04f1fd1c9451ad72c1195c136288fdb4e488922b24db75b2fdae65cd7","src/scaffolding/templates/ErrorTemplate.rs":"e7ca4538908a273dd7ba3834219b30fa0e537b2171144f06b6a96fbefb90cd1d","src/scaffolding/templates/ExternalTypesTemplate.rs":"8ecc805cf119abac8c5f60605f9183ee9ec8d37f9ec75bba5e18bb8b482a1abb","src/scaffolding/templates/ObjectTemplate.rs":"34de640428486e17a61ded4f42ce13d8eac3e66cc9f60196ce2575cdc0bd8df6","src/scaffolding/templates/RecordTemplate.rs":"e8d5af954f46f023a243721d6fc70aa176c3a4c0a9dd340048bfe46f3eeed783","src/scaffolding/templates/ReexportUniFFIScaffolding.rs":"559a17c8e39c473ff1effe9651f05b83d443ecd8abed13e03f2b63872d7e1593","src/scaffolding/templates/RustBuffer.rs":"ccf7521012d93c41265375c6d2e80ce861ec93b41383da83c37718386dd726f6","src/scaffolding/templates/TopLevelFunctionTemplate.rs":"35eaefb0862f25ff683d58fb0be6ad5f74bbe2fc85047273200c3a5f4c728434","src/scaffolding/templates/macros.rs":"a41c9690d411074c59fc4609f897431669b9d939625a08f5304a71a88901ba7c","src/scaffolding/templates/scaffolding_template.rs":"3589f8e8e1f9b194ff4a6245665d3a421c771dec3cc947c4264bfcd34573550e"},"package":"5d46080a4840abccf7c0cce21931dae53215cbd7dd969b5e63c486235ce91a2a"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi_bindgen/Cargo.lock
b/third_party/rust/uniffi_bindgen/Cargo.lock
+--- a/third_party/rust/uniffi_bindgen/Cargo.lock
++++ b/third_party/rust/uniffi_bindgen/Cargo.lock
+@@ -1,17 +1,17 @@
+ # This file is automatically @generated by Cargo.
+ # It is not intended for manual editing.
+ version = 3
+
+ [[package]]
+ name = "anyhow"
+-version = "1.0.65"
++version = "1.0.66"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602"
++checksum =
"216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6"
+
+ [[package]]
+ name = "askama"
+ version = "0.11.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"fb98f10f371286b177db5eeb9a6e5396609555686a35e1d4f7b9a9c6d8af0139"
+ dependencies = [
+ "askama_derive",
+@@ -94,19 +94,19 @@ checksum = "88ad0e1e3e88dd237a156ab9f571
+ [[package]]
+ name = "cfg-if"
+ version = "1.0.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+ [[package]]
+ name = "clap"
+-version = "3.2.22"
++version = "3.2.23"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750"
++checksum =
"71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
+ dependencies = [
+ "atty",
+ "bitflags",
+ "clap_derive",
+ "clap_lex",
+ "indexmap",
+ "once_cell",
+ "strsim",
+@@ -133,19 +133,19 @@ version = "0.2.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+ dependencies = [
+ "os_str_bytes",
+ ]
+
+ [[package]]
+ name = "fs-err"
+-version = "2.8.1"
++version = "2.9.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"64db3e262960f0662f43a6366788d5f10f7f244b8f7d7d987f560baf5ded5c50"
++checksum =
"0845fa252299212f0389d64ba26f34fa32cfe41588355f21ed507c59a0f64541"
+
+ [[package]]
+ name = "goblin"
+ version = "0.5.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143"
+ dependencies = [
+ "log",
+@@ -171,35 +171,35 @@ version = "0.1.19"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+ dependencies = [
+ "libc",
+ ]
+
+ [[package]]
+ name = "indexmap"
+-version = "1.9.1"
++version = "1.9.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
++checksum =
"1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+ dependencies = [
+ "autocfg",
+ "hashbrown",
+ ]
+
+ [[package]]
+ name = "itoa"
+ version = "1.0.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
+
+ [[package]]
+ name = "libc"
+-version = "0.2.135"
++version = "0.2.138"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c"
++checksum =
"db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8"
+
+ [[package]]
+ name = "log"
+ version = "0.4.17"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+ dependencies = [
+ "cfg-if",
+@@ -240,31 +240,31 @@ source = "registry+https://github.com/ru
+ checksum =
"a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
+ dependencies = [
+ "memchr",
+ "minimal-lexical",
+ ]
+
+ [[package]]
+ name = "once_cell"
+-version = "1.15.0"
++version = "1.16.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
++checksum =
"86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
+
+ [[package]]
+ name = "os_str_bytes"
+-version = "6.3.0"
++version = "6.4.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
++checksum =
"9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
+
+ [[package]]
+ name = "paste"
+-version = "1.0.9"
++version = "1.0.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1"
++checksum =
"cf1c2c742266c2f1041c914ba65355a83ae8747b05f208319784083583494b4b"
+
+ [[package]]
+ name = "plain"
+ version = "0.2.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
+
+ [[package]]
+@@ -288,19 +288,19 @@ checksum = "a1be40180e52ecc98ad80b184934
+ dependencies = [
+ "proc-macro2",
+ "quote",
+ "version_check",
+ ]
+
+ [[package]]
+ name = "proc-macro2"
+-version = "1.0.46"
++version = "1.0.47"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b"
++checksum =
"5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
+ dependencies = [
+ "unicode-ident",
+ ]
+
+ [[package]]
+ name = "quote"
+ version = "1.0.21"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+@@ -332,56 +332,62 @@ checksum = "bdbda6ac5cd1321e724fa9cee216
+ dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ ]
+
+ [[package]]
+ name = "serde"
+-version = "1.0.145"
++version = "1.0.150"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b"
++checksum =
"e326c9ec8042f1b5da33252c8a37e9ffbd2c9bef0155215b6e6c80c790e05f91"
+ dependencies = [
+ "serde_derive",
+ ]
+
+ [[package]]
+ name = "serde_derive"
+-version = "1.0.145"
++version = "1.0.150"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c"
++checksum =
"42a3df25b0713732468deadad63ab9da1f1fd75a48a15024b50363f128db627e"
+ dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ ]
+
+ [[package]]
+ name = "serde_json"
+-version = "1.0.86"
++version = "1.0.89"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"41feea4228a6f1cd09ec7a3593a682276702cd67b5273544757dae23c096f074"
++checksum =
"020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db"
+ dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+ ]
+
+ [[package]]
++name = "siphasher"
++version = "0.3.10"
++source = "registry+https://github.com/rust-lang/crates.io-index";
++checksum =
"7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
++
++[[package]]
+ name = "strsim"
+ version = "0.10.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+ [[package]]
+ name = "syn"
+-version = "1.0.102"
++version = "1.0.105"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1"
++checksum =
"60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908"
+ dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+ ]
+
+ [[package]]
+ name = "termcolor"
+@@ -389,25 +395,25 @@ version = "1.1.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
+ dependencies = [
+ "winapi-util",
+ ]
+
+ [[package]]
+ name = "textwrap"
+-version = "0.15.1"
++version = "0.16.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16"
++checksum =
"222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
+
+ [[package]]
+ name = "toml"
+-version = "0.5.9"
++version = "0.5.10"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
++checksum =
"1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f"
+ dependencies = [
+ "serde",
+ ]
+
+ [[package]]
+ name = "unicase"
+ version = "2.6.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+@@ -419,17 +425,17 @@ dependencies = [
+ [[package]]
+ name = "unicode-ident"
+ version = "1.0.5"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
+
+ [[package]]
+ name = "uniffi_bindgen"
+-version = "0.21.0"
++version = "0.21.1"
+ dependencies = [
+ "anyhow",
+ "askama",
+ "bincode",
+ "camino",
+ "clap",
+ "fs-err",
+ "goblin",
+@@ -439,22 +445,34 @@ dependencies = [
+ "serde",
+ "serde_json",
+ "toml",
+ "uniffi_meta",
+ "weedle2",
+ ]
+
+ [[package]]
++name = "uniffi_checksum_derive"
++version = "0.21.1"
++source = "registry+https://github.com/rust-lang/crates.io-index";
++checksum =
"78b6e16d46caf942016997af8bbdf4b163bf8ae3deb0b667d9643de7b7ffd4c9"
++dependencies = [
++ "quote",
++ "syn",
++]
++
++[[package]]
+ name = "uniffi_meta"
+-version = "0.21.0"
++version = "0.21.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+-checksum =
"cd9417cc653937681436b93838d8c5f97a5b8c58697813982ee8810bd1dc3b57"
++checksum =
"729835442da829c9b6f7c111c76cf87b2498e129101203bec94f0c39a3296a38"
+ dependencies = [
+ "serde",
++ "siphasher",
++ "uniffi_checksum_derive",
+ ]
+
+ [[package]]
+ name = "version_check"
+ version = "0.9.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index";
+ checksum =
"49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+diff --git a/third_party/rust/uniffi_bindgen/Cargo.toml
b/third_party/rust/uniffi_bindgen/Cargo.toml
+--- a/third_party/rust/uniffi_bindgen/Cargo.toml
++++ b/third_party/rust/uniffi_bindgen/Cargo.toml
+@@ -7,28 +7,27 @@
+ #
+ # If you are reading this file be aware that the original Cargo.toml
+ # will likely look very different (and much more reasonable).
+ # See Cargo.toml.orig for the original contents.
+
+ [package]
+ edition = "2021"
+ name = "uniffi_bindgen"
+-version = "0.21.0"
++version = "0.21.1"
+ authors = ["Firefox Sync Team <sync-team AT mozilla.com>"]
+ description = "a multi-language bindings generator for rust (codegen and
cli tooling)"
+ homepage = "https://mozilla.github.io/uniffi-rs";
+ documentation = "https://mozilla.github.io/uniffi-rs";
+ keywords = [
+ "ffi",
+ "bindgen",
+ ]
+ license = "MPL-2.0"
+ repository = "https://github.com/mozilla/uniffi-rs";
+-resolver = "2"
+
+ [[bin]]
+ name = "uniffi-bindgen"
+ path = "src/main.rs"
+
+ [dependencies.anyhow]
+ version = "1"
+
+@@ -71,12 +70,12 @@ version = "1"
+
+ [dependencies.serde_json]
+ version = "1.0.80"
+
+ [dependencies.toml]
+ version = "0.5"
+
+ [dependencies.uniffi_meta]
+-version = "=0.21.0"
++version = "=0.21.1"
+
+ [dependencies.weedle2]
+ version = "4.0.0"
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/attributes.rs
b/third_party/rust/uniffi_bindgen/src/interface/attributes.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/attributes.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/attributes.rs
+@@ -10,23 +10,24 @@
+ //! support. You can also use the [`parse_attributes`] function to parse an
+ //! `ExtendedAttributeList` into a vec of same.
+ //!
+ //! We only support a small number of attributes, so it's manageable to
have them
+ //! all handled by a single abstraction. This might need to be refactored
in future
+ //! if we grow significantly more complicated attribute handling.
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ /// Represents an attribute parsed from UDL, like `[ByRef]` or `[Throws]`.
+ ///
+ /// This is a convenience enum for parsing UDL attributes and erroring out
if we encounter
+ /// any unsupported ones. These don't convert directly into parts of a
`ComponentInterface`, but
+ /// may influence the properties of things like functions and arguments.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub(super) enum Attribute {
+ ByRef,
+ Enum,
+ Error,
+ Name(String),
+ SelfType(SelfType),
+ Threadsafe, // N.B. the `[Threadsafe]` attribute is deprecated and will
be removed
+ Throws(String),
+@@ -114,17 +115,17 @@ where
+ validator(attr)?;
+ }
+
+ Ok(attrs)
+ }
+
+ /// Attributes that can be attached to an `enum` definition in the UDL.
+ /// There's only one case here: using `[Error]` to mark an enum as an error
class.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct EnumAttributes(Vec<Attribute>);
+
+ impl EnumAttributes {
+ pub fn contains_error_attr(&self) -> bool {
+ self.0.iter().any(|attr| attr.is_error())
+ }
+ }
+
+@@ -150,17 +151,17 @@ impl<T: TryInto<EnumAttributes, Error =
+ }
+ }
+ }
+
+ /// Represents UDL attributes that might appear on a function.
+ ///
+ /// This supports the `[Throws=ErrorName]` attribute for functions that
+ /// can produce an error.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct FunctionAttributes(Vec<Attribute>);
+
+ impl FunctionAttributes {
+ pub(super) fn get_throws_err(&self) -> Option<&str> {
+ self.0.iter().find_map(|attr| match attr {
+ // This will hopefully return a helpful compilation error
+ // if the error is not defined.
+ Attribute::Throws(inner) => Some(inner.as_ref()),
+@@ -193,17 +194,17 @@ impl<T: TryInto<FunctionAttributes, Erro
+ }
+ }
+ }
+
+ /// Represents UDL attributes that might appear on a function argument.
+ ///
+ /// This supports the `[ByRef]` attribute for arguments that should be
passed
+ /// by reference in the generated Rust scaffolding.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct ArgumentAttributes(Vec<Attribute>);
+
+ impl ArgumentAttributes {
+ pub fn by_ref(&self) -> bool {
+ self.0.iter().any(|attr| matches!(attr, Attribute::ByRef))
+ }
+ }
+
+@@ -228,17 +229,17 @@ impl<T: TryInto<ArgumentAttributes, Erro
+ match value {
+ None => Ok(Default::default()),
+ Some(v) => v.try_into(),
+ }
+ }
+ }
+
+ /// Represents UDL attributes that might appear on an `interface`
definition.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct InterfaceAttributes(Vec<Attribute>);
+
+ impl InterfaceAttributes {
+ pub fn contains_enum_attr(&self) -> bool {
+ self.0.iter().any(|attr| attr.is_enum())
+ }
+
+ pub fn contains_error_attr(&self) -> bool {
+@@ -282,17 +283,17 @@ impl<T: TryInto<InterfaceAttributes, Err
+ }
+ }
+ }
+
+ /// Represents UDL attributes that might appear on a constructor.
+ ///
+ /// This supports the `[Throws=ErrorName]` attribute for constructors that
can produce
+ /// an error, and the `[Name=MethodName]` for non-default constructors.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct ConstructorAttributes(Vec<Attribute>);
+
+ impl ConstructorAttributes {
+ pub(super) fn get_throws_err(&self) -> Option<&str> {
+ self.0.iter().find_map(|attr| match attr {
+ // This will hopefully return a helpful compilation error
+ // if the error is not defined.
+ Attribute::Throws(inner) => Some(inner.as_ref()),
+@@ -321,17 +322,17 @@ impl TryFrom<&weedle::attribute::Extende
+ Ok(Self(attrs))
+ }
+ }
+
+ /// Represents UDL attributes that might appear on a method.
+ ///
+ /// This supports the `[Throws=ErrorName]` attribute for methods that can
produce
+ /// an error, and the `[Self=ByArc]` attribute for methods that take
`Arc<Self>` as receiver.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct MethodAttributes(Vec<Attribute>);
+
+ impl MethodAttributes {
+ pub(super) fn get_throws_err(&self) -> Option<&str> {
+ self.0.iter().find_map(|attr| match attr {
+ // This will hopefully return a helpful compilation error
+ // if the error is not defined.
+ Attribute::Throws(inner) => Some(inner.as_ref()),
+@@ -370,17 +371,17 @@ impl<T: TryInto<MethodAttributes, Error
+ }
+ }
+
+ /// Represents the different possible types of method call receiver.
+ ///
+ /// Actually we only support one of these right now, `[Self=ByArc]`.
+ /// We might add more in future, e.g. a `[Self=ByRef]` if there are cases
+ /// where we need to force the receiver to be taken by reference.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub(super) enum SelfType {
+ ByArc, // Method receiver is `Arc<Self>`.
+ }
+
+ impl TryFrom<&weedle::attribute::IdentifierOrString<'_>> for SelfType {
+ type Error = anyhow::Error;
+ fn try_from(nm: &weedle::attribute::IdentifierOrString<'_>) ->
Result<Self, Self::Error> {
+ Ok(match nm {
+@@ -393,17 +394,17 @@ impl TryFrom<&weedle::attribute::Identif
+ }
+ })
+ }
+ }
+
+ /// Represents UDL attributes that might appear on a typedef
+ ///
+ /// This supports the `[External="crate_name"]` and `[Custom]` attributes
for types.
+-#[derive(Debug, Clone, Hash, Default)]
++#[derive(Debug, Clone, Checksum, Default)]
+ pub(super) struct TypedefAttributes(Vec<Attribute>);
+
+ impl TypedefAttributes {
+ pub(super) fn get_crate_name(&self) -> String {
+ self.0
+ .iter()
+ .find_map(|attr| match attr {
+ Attribute::External(crate_name) => Some(crate_name.clone()),
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/callbacks.rs
b/third_party/rust/uniffi_bindgen/src/interface/callbacks.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/callbacks.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/callbacks.rs
+@@ -28,29 +28,35 @@
+ //! # };
+ //! # "##)?;
+ //! let callback = ci.get_callback_interface_definition("Example").unwrap();
+ //! assert_eq!(callback.name(), "Example");
+ //! assert_eq!(callback.methods()[0].name(), "hello");
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+
+-use std::hash::{Hash, Hasher};
+-
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::ffi::{FFIArgument, FFIFunction, FFIType};
+ use super::object::Method;
+ use super::types::{Type, TypeIterator};
+ use super::{APIConverter, ComponentInterface};
+
+-#[derive(Debug, Clone)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct CallbackInterface {
+ pub(super) name: String,
+ pub(super) methods: Vec<Method>,
++ // We don't include the FFIFunc in the hash calculation, because:
++ // - it is entirely determined by the other fields,
++ // so excluding it is safe.
++ // - its `name` property includes a checksum derived from the very
++ // hash value we're trying to calculate here, so excluding it
++ // avoids a weird circular depenendency in the calculation.
++ #[checksum_ignore]
+ pub(super) ffi_init_callback: FFIFunction,
+ }
+
+ impl CallbackInterface {
+ fn new(name: String) -> CallbackInterface {
+ CallbackInterface {
+ name,
+ methods: Default::default(),
+@@ -83,29 +89,16 @@ impl CallbackInterface {
+ self.ffi_init_callback.return_type = None;
+ }
+
+ pub fn iter_types(&self) -> TypeIterator<'_> {
+ Box::new(self.methods.iter().flat_map(Method::iter_types))
+ }
+ }
+
+-impl Hash for CallbackInterface {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We don't include the FFIFunc in the hash calculation, because:
+- // - it is entirely determined by the other fields,
+- // so excluding it is safe.
+- // - its `name` property includes a checksum derived from the very
+- // hash value we're trying to calculate here, so excluding it
+- // avoids a weird circular depenendency in the calculation.
+- self.name.hash(state);
+- self.methods.hash(state);
+- }
+-}
+-
+ impl APIConverter<CallbackInterface> for
weedle::CallbackInterfaceDefinition<'_> {
+ fn convert(&self, ci: &mut ComponentInterface) ->
Result<CallbackInterface> {
+ if self.attributes.is_some() {
+ bail!("callback interface attributes are not supported yet");
+ }
+ if self.inheritance.is_some() {
+ bail!("callback interface inheritence is not supported");
+ }
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/enum_.rs
b/third_party/rust/uniffi_bindgen/src/interface/enum_.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/enum_.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/enum_.rs
+@@ -72,27 +72,28 @@
+ //! assert_eq!(e.variants()[0].fields().len(), 0);
+ //! assert_eq!(e.variants()[1].name(), "One");
+ //! assert_eq!(e.variants()[1].fields().len(), 1);
+ //! assert_eq!(e.variants()[1].fields()[0].name(), "first");
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::record::Field;
+ use super::types::{Type, TypeIterator};
+ use super::{APIConverter, ComponentInterface};
+
+ /// Represents an enum with named variants, each of which may have named
+ /// and typed fields.
+ ///
+ /// Enums are passed across the FFI by serializing to a bytebuffer, with a
+ /// i32 indicating the variant followed by the serialization of each field.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Enum {
+ pub(super) name: String,
+ pub(super) variants: Vec<Variant>,
+ // "Flat" enums do not have, and will never have, variants with
associated data.
+ pub(super) flat: bool,
+ }
+
+ impl Enum {
+@@ -169,17 +170,17 @@ impl APIConverter<Enum> for weedle::Inte
+ flat: false,
+ })
+ }
+ }
+
+ /// Represents an individual variant in an Enum.
+ ///
+ /// Each variant has a name and zero or more fields.
+-#[derive(Debug, Clone, Default, Hash)]
++#[derive(Debug, Clone, Default, Checksum)]
+ pub struct Variant {
+ pub(super) name: String,
+ pub(super) fields: Vec<Field>,
+ }
+
+ impl Variant {
+ pub fn name(&self) -> &str {
+ &self.name
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/error.rs
b/third_party/rust/uniffi_bindgen/src/interface/error.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/error.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/error.rs
+@@ -78,28 +78,29 @@
+ //! assert_eq!(err.variants()[2].fields().len(), 2);
+ //! assert_eq!(err.variants()[2].fields()[0].name(), "x");
+ //! assert_eq!(err.variants()[2].fields()[1].name(), "y");
+ //! assert_eq!(err.is_flat(), false);
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+
+ use anyhow::Result;
++use uniffi_meta::Checksum;
+
+ use super::enum_::{Enum, Variant};
+ use super::types::{Type, TypeIterator};
+ use super::{APIConverter, ComponentInterface};
+
+ /// Represents an Error that might be thrown by functions/methods in the
component interface.
+ ///
+ /// Errors are represented in the UDL as enums with the special `[Error]`
attribute, but
+ /// they're handled in the FFI very differently. We create them in
`uniffi::call_with_result()` if
+ /// the wrapped function returns an `Err` value
+ /// struct and assign an integer error code to each variant.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Error {
+ pub name: String,
+ enum_: Enum,
+ }
+
+ impl Error {
+ pub fn from_enum(enum_: Enum) -> Self {
+ Self {
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/function.rs
b/third_party/rust/uniffi_bindgen/src/interface/function.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/function.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/function.rs
+@@ -27,40 +27,47 @@
+ //! # "##)?;
+ //! let func = ci.get_function_definition("hello").unwrap();
+ //! assert_eq!(func.name(), "hello");
+ //! assert!(matches!(func.return_type(), Some(Type::String)));
+ //! assert_eq!(func.arguments().len(), 0);
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+ use std::convert::TryFrom;
+-use std::hash::{Hash, Hasher};
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::ffi::{FFIArgument, FFIFunction};
+ use super::literal::{convert_default_value, Literal};
+ use super::types::{Type, TypeIterator};
+ use super::{
+ attributes::{ArgumentAttributes, FunctionAttributes},
+ convert_type,
+ };
+ use super::{APIConverter, ComponentInterface};
+
+ /// Represents a standalone function.
+ ///
+ /// Each `Function` corresponds to a standalone function in the rust module,
+ /// and has a corresponding standalone function in the foreign language
bindings.
+ ///
+ /// In the FFI, this will be a standalone function with appropriately
lowered types.
+-#[derive(Debug, Clone)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Function {
+ pub(super) name: String,
+ pub(super) arguments: Vec<Argument>,
+ pub(super) return_type: Option<Type>,
++ // We don't include the FFIFunc in the hash calculation, because:
++ // - it is entirely determined by the other fields,
++ // so excluding it is safe.
++ // - its `name` property includes a checksum derived from the very
++ // hash value we're trying to calculate here, so excluding it
++ // avoids a weird circular depenendency in the calculation.
++ #[checksum_ignore]
+ pub(super) ffi_func: FFIFunction,
+ pub(super) attributes: FunctionAttributes,
+ }
+
+ impl Function {
+ pub fn name(&self) -> &str {
+ &self.name
+ }
+@@ -137,31 +144,16 @@ impl From<uniffi_meta::FnMetadata> for F
+ arguments,
+ return_type,
+ ffi_func,
+ attributes: Default::default(),
+ }
+ }
+ }
+
+-impl Hash for Function {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We don't include the FFIFunc in the hash calculation, because:
+- // - it is entirely determined by the other fields,
+- // so excluding it is safe.
+- // - its `name` property includes a checksum derived from the very
+- // hash value we're trying to calculate here, so excluding it
+- // avoids a weird circular depenendency in the calculation.
+- self.name.hash(state);
+- self.arguments.hash(state);
+- self.return_type.hash(state);
+- self.attributes.hash(state);
+- }
+-}
+-
+ impl APIConverter<Function> for weedle::namespace::NamespaceMember<'_> {
+ fn convert(&self, ci: &mut ComponentInterface) -> Result<Function> {
+ match self {
+ weedle::namespace::NamespaceMember::Operation(f) =>
f.convert(ci),
+ _ => bail!("no support for namespace member type {:?} yet",
self),
+ }
+ }
+ }
+@@ -180,17 +172,17 @@ impl APIConverter<Function> for weedle::
+ attributes:
FunctionAttributes::try_from(self.attributes.as_ref())?,
+ })
+ }
+ }
+
+ /// Represents an argument to a function/constructor/method call.
+ ///
+ /// Each argument has a name and a type, along with some optional metadata.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Argument {
+ pub(super) name: String,
+ pub(super) type_: Type,
+ pub(super) by_ref: bool,
+ pub(super) optional: bool,
+ pub(super) default: Option<Literal>,
+ }
+
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/literal.rs
b/third_party/rust/uniffi_bindgen/src/interface/literal.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/literal.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/literal.rs
+@@ -3,22 +3,23 @@
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+ //! # Support for literal values.
+ //!
+ //! This module provides support for interpreting literal values from the
UDL,
+ //! which appear in places such as default arguments.
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::types::Type;
+
+ // Represents a literal value.
+ // Used for e.g. default argument values.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub enum Literal {
+ Boolean(bool),
+ String(String),
+ // Integers are represented as the widest representation we can.
+ // Number formatting vary with language and radix, so we avoid a lot of
parsing and
+ // formatting duplication by using only signed and unsigned variants.
+ UInt(u64, Radix, Type),
+ Int(i64, Radix, Type),
+@@ -30,17 +31,17 @@ pub enum Literal {
+ Enum(String, Type),
+ EmptySequence,
+ EmptyMap,
+ Null,
+ }
+
+ // Represent the radix of integer literal values.
+ // We preserve the radix into the generated bindings for readability
reasons.
+-#[derive(Debug, Clone, Copy, Hash)]
++#[derive(Debug, Clone, Copy, Checksum)]
+ pub enum Radix {
+ Decimal = 10,
+ Octal = 8,
+ Hexadecimal = 16,
+ }
+
+ pub(super) fn convert_default_value(
+ default_value: &weedle::literal::DefaultValue<'_>,
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/mod.rs
b/third_party/rust/uniffi_bindgen/src/interface/mod.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/mod.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/mod.rs
+@@ -39,22 +39,17 @@
+ //! guarantee that there's not some edge-case where it produces
valid-but-incorrect code.
+ //!
+ //! * There is a *lot* of cloning going on, in the spirit of "first make
it work". There's probably
+ //! a good opportunity here for e.g. interned strings, but we're
nowhere near the point were we need
+ //! that kind of optimization just yet.
+ //!
+ //! * Error messages and general developer experience leave a lot to be
desired.
+
+-use std::{
+- collections::HashSet,
+- convert::TryFrom,
+- hash::{Hash, Hasher},
+- iter,
+-};
++use std::{collections::HashSet, convert::TryFrom, iter};
+
+ use anyhow::{bail, Result};
+
+ pub mod types;
+ pub use types::Type;
+ use types::{TypeIterator, TypeUniverse};
+
+ mod attributes;
+@@ -72,47 +67,51 @@ mod namespace;
+ pub use namespace::Namespace;
+ mod object;
+ pub use object::{Constructor, Method, Object};
+ mod record;
+ pub use record::{Field, Record};
+
+ pub mod ffi;
+ pub use ffi::{FFIArgument, FFIFunction, FFIType};
+-use uniffi_meta::{MethodMetadata, ObjectMetadata};
++use uniffi_meta::{Checksum, MethodMetadata, ObjectMetadata};
+
+ /// The main public interface for this module, representing the complete
details of an interface exposed
+ /// by a rust component and the details of consuming it via an extern-C FFI
layer.
+ ///
+-#[derive(Debug, Default)]
++#[derive(Debug, Default, Checksum)]
+ pub struct ComponentInterface {
+ /// Every ComponentInterface gets tagged with the version of uniffi
used to create it.
+ /// This helps us avoid using a lib compiled with one version together
with bindings created
+ /// using a different version, which might introduce unsafety.
+ uniffi_version: String,
+ /// All of the types used in the interface.
++ // We can't checksum `self.types`, but its contents are implied by the
other fields
++ // anyway, so it's safe to ignore it.
++ #[checksum_ignore]
+ pub(super) types: TypeUniverse,
+ /// The unique prefix that we'll use for namespacing when exposing this
component's API.
+ namespace: String,
+ /// The internal unique prefix used to namespace FFI symbols
++ #[checksum_ignore]
+ ffi_namespace: String,
+ /// The high-level API provided by the component.
+ enums: Vec<Enum>,
+ records: Vec<Record>,
+ functions: Vec<Function>,
+ objects: Vec<Object>,
+ callback_interfaces: Vec<CallbackInterface>,
+ errors: Vec<Error>,
+ }
+
+ impl ComponentInterface {
+ /// Parse a `ComponentInterface` from a string containing a WebIDL
definition.
+ pub fn from_webidl(idl: &str) -> Result<Self> {
+ let mut ci = Self {
+- uniffi_version: env!("CARGO_PKG_VERSION").to_string(),
++ uniffi_version: "0.21.0".to_string(),
+ ..Default::default()
+ };
+ // There's some lifetime thing with the errors returned from
weedle::Definitions::parse
+ // that my own lifetime is too short to worry about figuring out;
unwrap and move on.
+
+ // Note we use `weedle::Definitions::parse` instead of
`weedle::parse` so
+ // on parse errors we can see how far weedle got, which helps
locate the problem.
+ use weedle::Parse; // this trait must be in scope for parse to work.
+@@ -316,26 +315,18 @@ impl ComponentInterface {
+ /// version of that interface. It offers the following properties:
+ ///
+ /// - Two ComponentIntefaces generated from the same WebIDL file,
using the same version of uniffi
+ /// and the same version of Rust, will always have the same
checksum value.
+ /// - Two ComponentInterfaces will, with high probability, have
different checksum values if:
+ /// - They were generated from two different WebIDL files.
+ /// - They were generated by two different versions of uniffi
+ ///
+- /// The checksum may or may not change depending on the version of Rust
used; since we expect
+- /// consumers to be using the same executable to generate both the
scaffolding and the bindings,
+- /// assuming the same version of Rust seems acceptable.
+- ///
+ /// Note that this is designed to prevent accidents, not attacks, so
there is no need for the
+ /// checksum to be cryptographically secure.
+- ///
+- /// TODO: it's not clear to me if the derivation of `Hash` is actually
deterministic enough to
+- /// ensure the guarantees above, or if it might be sensitive to e.g.
compiler-driven re-ordering
+- /// of struct field. Let's see how it goes...
+ pub fn checksum(&self) -> u16 {
+ uniffi_meta::checksum(self)
+ }
+
+ /// The namespace to use in FFI-level function definitions.
+ ///
+ /// The value returned by this method is used as a prefix to namespace
all UDL-defined FFI
+ /// functions used in this ComponentInterface.
+@@ -667,33 +658,16 @@ impl ComponentInterface {
+ }
+ for callback in self.callback_interfaces.iter_mut() {
+ callback.derive_ffi_funcs(&ci_prefix);
+ }
+ Ok(())
+ }
+ }
+
+-/// `ComponentInterface` structs can be hashed, but this is mostly a
convenient way to
+-/// produce a checksum of their contents. They're not really intended to
live in a hashtable.
+-impl Hash for ComponentInterface {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We can't hash `self.types`, but its contents are implied by the
other fields
+- // anyway, so it's safe to ignore it.
+- self.uniffi_version.hash(state);
+- self.namespace.hash(state);
+- self.enums.hash(state);
+- self.records.hash(state);
+- self.functions.hash(state);
+- self.objects.hash(state);
+- self.callback_interfaces.hash(state);
+- self.errors.hash(state);
+- }
+-}
+-
+ fn get_or_insert_object<'a>(objects: &'a mut Vec<Object>, name: &str) ->
&'a mut Object {
+ // The find-based way of writing this currently runs into a borrow
checker
+ // error, so we use position
+ match objects.iter_mut().position(|o| o.name == name) {
+ Some(idx) => &mut objects[idx],
+ None => {
+ objects.push(Object::new(name.to_owned()));
+ objects.last_mut().unwrap()
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/object.rs
b/third_party/rust/uniffi_bindgen/src/interface/object.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/object.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/object.rs
+@@ -53,20 +53,20 @@
+ //! # "##)?;
+ //! let obj = ci.get_object_definition("Example").unwrap();
+ //! assert_eq!(obj.name(), "Example");
+ //! assert_eq!(obj.constructors().len(), 0);
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+
+ use std::convert::TryFrom;
+-use std::hash::{Hash, Hasher};
+ use std::{collections::HashSet, iter};
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::ffi::{FFIArgument, FFIFunction, FFIType};
+ use super::function::Argument;
+ use super::types::{Type, TypeIterator};
+ use super::{
+ attributes::{ConstructorAttributes, InterfaceAttributes,
MethodAttributes},
+ convert_type,
+ };
+@@ -81,22 +81,30 @@ use super::{APIConverter, ComponentInter
+ /// At the FFI layer, objects are represented by an opaque integer handle
and a set of functions
+ /// a common prefix. The object's constuctors are functions that return new
objects by handle,
+ /// and its methods are functions that take a handle as first argument. The
foreign language
+ /// binding code is expected to stitch these functions back together into
an appropriate class
+ /// definition (or that language's equivalent thereof).
+ ///
+ /// TODO:
+ /// - maybe "Class" would be a better name than "Object" here?
+-#[derive(Debug, Clone)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Object {
+ pub(super) name: String,
+ pub(super) constructors: Vec<Constructor>,
+ pub(super) methods: Vec<Method>,
++ // We don't include the FFIFunc in the hash calculation, because:
++ // - it is entirely determined by the other fields,
++ // so excluding it is safe.
++ // - its `name` property includes a checksum derived from the very
++ // hash value we're trying to calculate here, so excluding it
++ // avoids a weird circular depenendency in the calculation.
++ #[checksum_ignore]
+ pub(super) ffi_func_free: FFIFunction,
++ #[checksum_ignore]
+ pub(super) uses_deprecated_threadsafe_attribute: bool,
+ }
+
+ impl Object {
+ pub(super) fn new(name: String) -> Object {
+ Object {
+ name,
+ constructors: Default::default(),
+@@ -185,30 +193,16 @@ impl Object {
+ .iter()
+ .map(Method::iter_types)
+
.chain(self.constructors.iter().map(Constructor::iter_types))
+ .flatten(),
+ )
+ }
+ }
+
+-impl Hash for Object {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We don't include the FFIFunc in the hash calculation, because:
+- // - it is entirely determined by the other fields,
+- // so excluding it is safe.
+- // - its `name` property includes a checksum derived from the very
+- // hash value we're trying to calculate here, so excluding it
+- // avoids a weird circular depenendency in the calculation.
+- self.name.hash(state);
+- self.constructors.hash(state);
+- self.methods.hash(state);
+- }
+-}
+-
+ impl APIConverter<Object> for weedle::InterfaceDefinition<'_> {
+ fn convert(&self, ci: &mut ComponentInterface) -> Result<Object> {
+ if self.inheritance.is_some() {
+ bail!("interface inheritence is not supported");
+ }
+ let mut object = Object::new(self.identifier.0.to_string());
+ let attributes = match &self.attributes {
+ Some(attrs) => InterfaceAttributes::try_from(attrs)?,
+@@ -240,20 +234,27 @@ impl APIConverter<Object> for weedle::In
+ Ok(object)
+ }
+ }
+
+ // Represents a constructor for an object type.
+ //
+ // In the FFI, this will be a function that returns a pointer to an instance
+ // of the corresponding object type.
+-#[derive(Debug, Clone)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Constructor {
+ pub(super) name: String,
+ pub(super) arguments: Vec<Argument>,
++ // We don't include the FFIFunc in the hash calculation, because:
++ // - it is entirely determined by the other fields,
++ // so excluding it is safe.
++ // - its `name` property includes a checksum derived from the very
++ // hash value we're trying to calculate here, so excluding it
++ // avoids a weird circular depenendency in the calculation.
++ #[checksum_ignore]
+ pub(super) ffi_func: FFIFunction,
+ pub(super) attributes: ConstructorAttributes,
+ }
+
+ impl Constructor {
+ pub fn name(&self) -> &str {
+ &self.name
+ }
+@@ -294,30 +295,16 @@ impl Constructor {
+ self.ffi_func.return_type =
Some(FFIType::RustArcPtr(obj_name.to_string()));
+ }
+
+ pub fn iter_types(&self) -> TypeIterator<'_> {
+ Box::new(self.arguments.iter().flat_map(Argument::iter_types))
+ }
+ }
+
+-impl Hash for Constructor {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We don't include the FFIFunc in the hash calculation, because:
+- // - it is entirely determined by the other fields,
+- // so excluding it is safe.
+- // - its `name` property includes a checksum derived from the very
+- // hash value we're trying to calculate here, so excluding it
+- // avoids a weird circular depenendency in the calculation.
+- self.name.hash(state);
+- self.arguments.hash(state);
+- self.attributes.hash(state);
+- }
+-}
+-
+ impl Default for Constructor {
+ fn default() -> Self {
+ Constructor {
+ name: String::from("new"),
+ arguments: Vec::new(),
+ ffi_func: Default::default(),
+ attributes: Default::default(),
+ }
+@@ -338,22 +325,29 @@ impl APIConverter<Constructor> for weedl
+ })
+ }
+ }
+
+ // Represents an instance method for an object type.
+ //
+ // The FFI will represent this as a function whose first/self argument is a
+ // `FFIType::RustArcPtr` to the instance.
+-#[derive(Debug, Clone)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Method {
+ pub(super) name: String,
+ pub(super) object_name: String,
++ pub(super) arguments: Vec<Argument>,
+ pub(super) return_type: Option<Type>,
+- pub(super) arguments: Vec<Argument>,
++ // We don't include the FFIFunc in the hash calculation, because:
++ // - it is entirely determined by the other fields,
++ // so excluding it is safe.
++ // - its `name` property includes a checksum derived from the very
++ // hash value we're trying to calculate here, so excluding it
++ // avoids a weird circular depenendency in the calculation.
++ #[checksum_ignore]
+ pub(super) ffi_func: FFIFunction,
+ pub(super) attributes: MethodAttributes,
+ }
+
+ impl Method {
+ pub fn name(&self) -> &str {
+ &self.name
+ }
+@@ -445,32 +439,16 @@ impl From<uniffi_meta::MethodMetadata> f
+ arguments,
+ return_type,
+ ffi_func,
+ attributes: Default::default(),
+ }
+ }
+ }
+
+-impl Hash for Method {
+- fn hash<H: Hasher>(&self, state: &mut H) {
+- // We don't include the FFIFunc in the hash calculation, because:
+- // - it is entirely determined by the other fields,
+- // so excluding it is safe.
+- // - its `name` property includes a checksum derived from the very
+- // hash value we're trying to calculate here, so excluding it
+- // avoids a weird circular depenendency in the calculation.
+- self.name.hash(state);
+- self.object_name.hash(state);
+- self.arguments.hash(state);
+- self.return_type.hash(state);
+- self.attributes.hash(state);
+- }
+-}
+-
+ impl APIConverter<Method> for
weedle::interface::OperationInterfaceMember<'_> {
+ fn convert(&self, ci: &mut ComponentInterface) -> Result<Method> {
+ if self.special.is_some() {
+ bail!("special operations not supported");
+ }
+ if self.modifier.is_some() {
+ bail!("method modifiers are not supported")
+ }
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/record.rs
b/third_party/rust/uniffi_bindgen/src/interface/record.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/record.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/record.rs
+@@ -40,30 +40,31 @@
+ //! let record = ci.get_record_definition("Example").unwrap();
+ //! assert_eq!(record.name(), "Example");
+ //! assert_eq!(record.fields()[0].name(), "name");
+ //! assert_eq!(record.fields()[1].name(), "value");
+ //! # Ok::<(), anyhow::Error>(())
+ //! ```
+
+ use anyhow::{bail, Result};
++use uniffi_meta::Checksum;
+
+ use super::types::{Type, TypeIterator};
+ use super::{
+ convert_type,
+ literal::{convert_default_value, Literal},
+ };
+ use super::{APIConverter, ComponentInterface};
+
+ /// Represents a "data class" style object, for passing around complex
values.
+ ///
+ /// In the FFI these are represented as a byte buffer, which one side
explicitly
+ /// serializes the data into and the other serializes it out of. So I guess
they're
+ /// kind of like "pass by clone" values.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Record {
+ pub(super) name: String,
+ pub(super) fields: Vec<Field>,
+ }
+
+ impl Record {
+ pub fn name(&self) -> &str {
+ &self.name
+@@ -104,17 +105,17 @@ impl APIConverter<Record> for weedle::Di
+ Ok(Record {
+ name: self.identifier.0.to_string(),
+ fields: self.members.body.convert(ci)?,
+ })
+ }
+ }
+
+ // Represents an individual field on a Record.
+-#[derive(Debug, Clone, Hash)]
++#[derive(Debug, Clone, Checksum)]
+ pub struct Field {
+ pub(super) name: String,
+ pub(super) type_: Type,
+ pub(super) required: bool,
+ pub(super) default: Option<Literal>,
+ }
+
+ impl Field {
+diff --git a/third_party/rust/uniffi_bindgen/src/interface/types/mod.rs
b/third_party/rust/uniffi_bindgen/src/interface/types/mod.rs
+--- a/third_party/rust/uniffi_bindgen/src/interface/types/mod.rs
++++ b/third_party/rust/uniffi_bindgen/src/interface/types/mod.rs
+@@ -20,28 +20,29 @@
+ //! As a developer working on UniFFI itself, you're likely to spend a fair
bit of time thinking
+ //! about how these API-level types map into the lower-level types of the
FFI layer as represented
+ //! by the [`ffi::FFIType`](super::ffi::FFIType) enum, but that's a detail
that is invisible to end users.
+
+ use std::{collections::hash_map::Entry, collections::BTreeSet,
collections::HashMap, iter};
+
+ use anyhow::{bail, Result};
+ use heck::ToUpperCamelCase;
++use uniffi_meta::Checksum;
+
+ use super::ffi::FFIType;
+
+ mod finder;
+ pub(super) use finder::TypeFinder;
+ mod resolver;
+ pub(super) use resolver::{resolve_builtin_type, TypeResolver};
+
+ /// Represents all the different high-level types that can be used in a
component interface.
+ /// At this level we identify user-defined types by name, without knowing
any details
+ /// of their internal structure apart from what type of thing they are
(record, enum, etc).
+-#[derive(Debug, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
++#[derive(Debug, Clone, Eq, PartialEq, Checksum, Ord, PartialOrd)]
+ pub enum Type {
+ // Primitive types.
+ UInt8,
+ Int8,
+ UInt16,
+ Int16,
+ UInt32,
+ Int32,
+diff --git a/third_party/rust/uniffi_build/.cargo-checksum.json
b/third_party/rust/uniffi_build/.cargo-checksum.json
+--- a/third_party/rust/uniffi_build/.cargo-checksum.json
++++ b/third_party/rust/uniffi_build/.cargo-checksum.json
+@@ -1,1 +1,1 @@
+-{"files":{"Cargo.toml":"bf9105f53978ecdccad9a75fc3645f97982d3c4162a5a9b49ab16554162b51c1","src/lib.rs":"485a0c0ab99077a1d4037f4deec9801e87a248196e7589a002556fb84973528a"},"package":"510287c368a9386eb731ebe824a6fc6c82a105e20d020af1aa20519c1c1561db"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"30736876caf953bd0040b6c0fc824744556bf52fe23d656c7d01442d4c180674","src/lib.rs":"485a0c0ab99077a1d4037f4deec9801e87a248196e7589a002556fb84973528a"},"package":"d035e50433ee3d52ab0dcdcf3b9b26f2cc2ec39294b3c07d95865a518709455f"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi_build/Cargo.toml
b/third_party/rust/uniffi_build/Cargo.toml
+--- a/third_party/rust/uniffi_build/Cargo.toml
++++ b/third_party/rust/uniffi_build/Cargo.toml
+@@ -7,34 +7,33 @@
+ #
+ # If you are reading this file be aware that the original Cargo.toml
+ # will likely look very different (and much more reasonable).
+ # See Cargo.toml.orig for the original contents.
+
+ [package]
+ edition = "2021"
+ name = "uniffi_build"
+-version = "0.21.0"
++version = "0.21.1"
+ authors = ["Firefox Sync Team <sync-team AT mozilla.com>"]
+ description = "a multi-language bindings generator for rust (build script
helpers)"
+ homepage = "https://mozilla.github.io/uniffi-rs";
+ documentation = "https://mozilla.github.io/uniffi-rs";
+ keywords = [
+ "ffi",
+ "bindgen",
+ ]
+ license = "MPL-2.0"
+ repository = "https://github.com/mozilla/uniffi-rs";
+-resolver = "2"
+
+ [dependencies.anyhow]
+ version = "1"
+
+ [dependencies.camino]
+ version = "1.0.8"
+
+ [dependencies.uniffi_bindgen]
+-version = "=0.21.0"
++version = "=0.21.1"
+ optional = true
+
+ [features]
+ builtin-bindgen = ["uniffi_bindgen"]
+ default = []
+diff --git a/third_party/rust/uniffi_checksum_derive/.cargo-checksum.json
b/third_party/rust/uniffi_checksum_derive/.cargo-checksum.json
+new file mode 100644
+--- /dev/null
++++ b/third_party/rust/uniffi_checksum_derive/.cargo-checksum.json
+@@ -0,0 +1,1 @@
++{"files":{"Cargo.toml":"2ab3c60724c4c504297f8876bf0a8d1291f76a2fc46f5e83634aa147e89ffc71","src/lib.rs":"c68c69a1cf6a69e5fe78f7b069364a265c5bb6ce8c0abf0b5745eca01c79604a"},"package":"78b6e16d46caf942016997af8bbdf4b163bf8ae3deb0b667d9643de7b7ffd4c9"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi_checksum_derive/Cargo.toml
b/third_party/rust/uniffi_checksum_derive/Cargo.toml
+new file mode 100644
+--- /dev/null
++++ b/third_party/rust/uniffi_checksum_derive/Cargo.toml
+@@ -0,0 +1,42 @@
++# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
++#
++# When uploading crates to the registry Cargo will automatically
++# "normalize" Cargo.toml files for maximal compatibility
++# with all versions of Cargo and also rewrite `path` dependencies
++# to registry (e.g., crates.io) dependencies.
++#
++# If you are reading this file be aware that the original Cargo.toml
++# will likely look very different (and much more reasonable).
++# See Cargo.toml.orig for the original contents.
++
++[package]
++edition = "2021"
++name = "uniffi_checksum_derive"
++version = "0.21.1"
++authors = ["Firefox Sync Team <sync-team AT mozilla.com>"]
++description = "a multi-language bindings generator for rust (checksum
custom derive)"
++homepage = "https://mozilla.github.io/uniffi-rs";
++documentation = "https://mozilla.github.io/uniffi-rs";
++keywords = [
++ "ffi",
++ "bindgen",
++]
++license = "MPL-2.0"
++repository = "https://github.com/mozilla/uniffi-rs";
++
++[lib]
++proc-macro = true
++
++[dependencies.quote]
++version = "1.0"
++
++[dependencies.syn]
++version = "1.0"
++features = [
++ "derive",
++ "parsing",
++]
++
++[features]
++default = []
++nightly = []
+diff --git a/third_party/rust/uniffi_checksum_derive/src/lib.rs
b/third_party/rust/uniffi_checksum_derive/src/lib.rs
+new file mode 100644
+--- /dev/null
++++ b/third_party/rust/uniffi_checksum_derive/src/lib.rs
+@@ -0,0 +1,134 @@
++/* This Source Code Form is subject to the terms of the Mozilla Public
++ * License, v. 2.0. If a copy of the MPL was not distributed with this
++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
++#![cfg_attr(feature = "nightly", feature(proc_macro_expand))]
++
++//! Custom derive for uniffi_meta::Checksum
++
++use proc_macro::TokenStream;
++use quote::{format_ident, quote};
++use syn::{parse_macro_input, Attribute, Data, DeriveInput, Expr, ExprLit,
Fields, Index, Lit};
++
++fn has_ignore_attribute(attrs: &[Attribute]) -> bool {
++ attrs.iter().any(|attr| {
++ if attr.path.is_ident("checksum_ignore") {
++ if !attr.tokens.is_empty() {
++ panic!("#[checksum_ignore] doesn't accept extra
information");
++ }
++ true
++ } else {
++ false
++ }
++ })
++}
++
++#[proc_macro_derive(Checksum, attributes(checksum_ignore))]
++pub fn checksum_derive(input: TokenStream) -> TokenStream {
++ let input: DeriveInput = parse_macro_input!(input);
++
++ let name = input.ident;
++
++ let (impl_generics, ty_generics, where_clause) =
input.generics.split_for_impl();
++
++ let code = match input.data {
++ Data::Enum(enum_)
++ if enum_.variants.len() == 1
++ && enum_
++ .variants
++ .iter()
++ .all(|variant| matches!(variant.fields, Fields::Unit))
=>
++ {
++ quote!()
++ }
++ Data::Enum(enum_) => {
++ let mut next_discriminant = 0u64;
++ let match_inner = enum_.variants.iter().map(|variant| {
++ let ident = &variant.ident;
++ if has_ignore_attribute(&variant.attrs) {
++ panic!("#[checksum_ignore] is not supported in enums");
++ }
++ match &variant.discriminant {
++ Some((_, Expr::Lit(ExprLit { lit: Lit::Int(value), ..
}))) => {
++ next_discriminant =
value.base10_parse::<u64>().unwrap();
++ }
++ Some(_) => {
++ panic!("#[derive(Checksum)] doesn't support
non-numeric explicit discriminants in enums");
++ }
++ None => {}
++ }
++ let discriminant = quote! {
state.write(&#next_discriminant.to_le_bytes()) };
++ next_discriminant += 1;
++ match &variant.fields {
++ Fields::Unnamed(fields) => {
++ let field_idents = fields
++ .unnamed
++ .iter()
++ .enumerate()
++ .map(|(num, _)| format_ident!("__self_{}",
num));
++ let field_stmts = field_idents
++ .clone()
++ .map(|ident| quote! {
Checksum::checksum(#ident, state); });
++ quote! {
++ Self::#ident(#(#field_idents,)*) => {
++ #discriminant;
++ #(#field_stmts)*
++ }
++ }
++ }
++ Fields::Named(fields) => {
++ let field_idents = fields
++ .named
++ .iter()
++ .map(|field| field.ident.as_ref().unwrap());
++ let field_stmts = field_idents
++ .clone()
++ .map(|ident| quote! {
Checksum::checksum(#ident, state); });
++ quote! {
++ Self::#ident { #(#field_idents,)* } => {
++ #discriminant;
++ #(#field_stmts)*
++ }
++ }
++ }
++ Fields::Unit => quote! { Self::#ident => #discriminant,
},
++ }
++ });
++ quote! {
++ match self {
++ #(#match_inner)*
++ }
++ }
++ }
++ Data::Struct(struct_) => {
++ let stmts = struct_
++ .fields
++ .iter()
++ .enumerate()
++ .filter_map(|(num, field)| {
++ (!has_ignore_attribute(&field.attrs)).then(|| match
field.ident.as_ref() {
++ Some(ident) => quote! {
Checksum::checksum(&self.#ident, state); },
++ None => {
++ let i = Index::from(num);
++ quote! { Checksum::checksum(&self.#i, state); }
++ }
++ })
++ });
++ quote! {
++ #(#stmts)*
++ }
++ }
++ Data::Union(_) => {
++ panic!("#[derive(Checksum)] is not supported for unions");
++ }
++ };
++
++ quote! {
++ #[automatically_derived]
++ impl #impl_generics Checksum for #name #ty_generics #where_clause {
++ fn checksum<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
++ #code
++ }
++ }
++ }
++ .into()
++}
+diff --git a/third_party/rust/uniffi_macros/.cargo-checksum.json
b/third_party/rust/uniffi_macros/.cargo-checksum.json
+--- a/third_party/rust/uniffi_macros/.cargo-checksum.json
++++ b/third_party/rust/uniffi_macros/.cargo-checksum.json
+@@ -1,1 +1,1 @@
+-{"files":{"Cargo.toml":"55f7e114dd34b0c60b58890120f8707601a5401e9d49d42a239b03da2e660d4f","src/export.rs":"e23929cf6fb5542d29514fe668f3b3d836fad968eacd9c6fcba74c5cd9cf2b61","src/export/metadata.rs":"af89a9942c7c0c4043a3cd57d1e6bd71cde19005e1f9f246efac761f47eff6be","src/export/metadata/convert.rs":"81060fb3390165d77db021f44142a2f3f10882515f859d7393857083370f2d35","src/export/metadata/function.rs":"11833cabd37e7671c0a01944bec73b8892a15df814bbe4c26fdae57aad89a2ba","src/export/metadata/impl_.rs":"ecfdaa132f05dd946414281e52165ef19c90c0bfd76ec651d4ec86837bd41d1c","src/export/scaffolding.rs":"66939405063e56fc983126f249e2d7ddc3257cb045a738abd0cf813a4aafc59c","src/lib.rs":"ca77b437a58cfb3ddeb106d3c1c8378545c46ef241298e62ab1190c5136d1fb1","src/object.rs":"955b596f344304013692042bdc1760bbb1192ec33950b0dd2932cb8de94ec297","src/record.rs":"67a5c7ed6a448f7ad8f5c8e930c5e3007b2b0cac32f52cc8596bdae6fb3c816e","src/util.rs":"6389a9b4258808a3af168cf85658fb7c069172d5e528ee0e94210fa664f2a414"},"package":"5c8604503caa2cbcf271578dc51ca236d40e3b22e1514ffa2e638e2c39f6ad10"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"6511b493b676ac3941d70477c91abec62642c3c9aab088ecdf4f733eef3f1faa","src/export.rs":"e23929cf6fb5542d29514fe668f3b3d836fad968eacd9c6fcba74c5cd9cf2b61","src/export/metadata.rs":"af89a9942c7c0c4043a3cd57d1e6bd71cde19005e1f9f246efac761f47eff6be","src/export/metadata/convert.rs":"81060fb3390165d77db021f44142a2f3f10882515f859d7393857083370f2d35","src/export/metadata/function.rs":"11833cabd37e7671c0a01944bec73b8892a15df814bbe4c26fdae57aad89a2ba","src/export/metadata/impl_.rs":"ecfdaa132f05dd946414281e52165ef19c90c0bfd76ec651d4ec86837bd41d1c","src/export/scaffolding.rs":"66939405063e56fc983126f249e2d7ddc3257cb045a738abd0cf813a4aafc59c","src/lib.rs":"ca77b437a58cfb3ddeb106d3c1c8378545c46ef241298e62ab1190c5136d1fb1","src/object.rs":"955b596f344304013692042bdc1760bbb1192ec33950b0dd2932cb8de94ec297","src/record.rs":"67a5c7ed6a448f7ad8f5c8e930c5e3007b2b0cac32f52cc8596bdae6fb3c816e","src/util.rs":"6389a9b4258808a3af168cf85658fb7c069172d5e528ee0e94210fa664f2a414"},"package":"c96a574677566f83ea8458dac1dd7792fd63e7c3f9dbcd865f0e8d6f8057b127"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi_macros/Cargo.toml
b/third_party/rust/uniffi_macros/Cargo.toml
+--- a/third_party/rust/uniffi_macros/Cargo.toml
++++ b/third_party/rust/uniffi_macros/Cargo.toml
+@@ -7,28 +7,27 @@
+ #
+ # If you are reading this file be aware that the original Cargo.toml
+ # will likely look very different (and much more reasonable).
+ # See Cargo.toml.orig for the original contents.
+
+ [package]
+ edition = "2021"
+ name = "uniffi_macros"
+-version = "0.21.0"
++version = "0.21.1"
+ authors = ["Firefox Sync Team <sync-team AT mozilla.com>"]
+ description = "a multi-language bindings generator for rust (convenience
macros)"
+ homepage = "https://mozilla.github.io/uniffi-rs";
+ documentation = "https://mozilla.github.io/uniffi-rs";
+ keywords = [
+ "ffi",
+ "bindgen",
+ ]
+ license = "MPL-2.0"
+ repository = "https://github.com/mozilla/uniffi-rs";
+-resolver = "2"
+
+ [lib]
+ proc-macro = true
+
+ [dependencies.bincode]
+ version = "1.3"
+
+ [dependencies.camino]
+@@ -55,17 +54,17 @@ features = [
+ "full",
+ "visit-mut",
+ ]
+
+ [dependencies.toml]
+ version = "0.5.9"
+
+ [dependencies.uniffi_build]
+-version = "=0.21.0"
++version = "=0.21.1"
+
+ [dependencies.uniffi_meta]
+-version = "=0.21.0"
++version = "=0.21.1"
+
+ [features]
+ builtin-bindgen = ["uniffi_build/builtin-bindgen"]
+ default = []
+ nightly = []
+diff --git a/third_party/rust/uniffi_meta/.cargo-checksum.json
b/third_party/rust/uniffi_meta/.cargo-checksum.json
+--- a/third_party/rust/uniffi_meta/.cargo-checksum.json
++++ b/third_party/rust/uniffi_meta/.cargo-checksum.json
+@@ -1,1 +1,1 @@
+-{"files":{"Cargo.toml":"4a474782b3acac7e99435c0cfc6cd4790817ee5c15980b10dc927d95795b977f","src/lib.rs":"dc4c91763c01e8c09ef55cdb103bc02c7aba71c5660ba88f776a8a03a747d6e8"},"package":"cd9417cc653937681436b93838d8c5f97a5b8c58697813982ee8810bd1dc3b57"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"4c34032ec5fadf8b996c671425d5afa38e0e5c223ab0b2ed3b44099fb78157d3","src/lib.rs":"a9854421f120e1c4a9d7d36bb006a4c5e7d2e054564f95aa9b6956e7ebb348fd"},"package":"729835442da829c9b6f7c111c76cf87b2498e129101203bec94f0c39a3296a38"}
+\ No newline at end of file
+diff --git a/third_party/rust/uniffi_meta/Cargo.toml
b/third_party/rust/uniffi_meta/Cargo.toml
+--- a/third_party/rust/uniffi_meta/Cargo.toml
++++ b/third_party/rust/uniffi_meta/Cargo.toml
+@@ -7,22 +7,27 @@
+ #
+ # If you are reading this file be aware that the original Cargo.toml
+ # will likely look very different (and much more reasonable).
+ # See Cargo.toml.orig for the original contents.
+
+ [package]
+ edition = "2021"
+ name = "uniffi_meta"
+-version = "0.21.0"
++version = "0.21.1"
+ description = "uniffi_meta"
+ homepage = "https://mozilla.github.io/uniffi-rs";
+ keywords = [
+ "ffi",
+ "bindgen",
+ ]
+ license = "MPL-2.0"
+ repository = "https://github.com/mozilla/uniffi-rs";
+-resolver = "2"
+
+ [dependencies.serde]
+ version = "1.0.136"
+ features = ["derive"]
++
++[dependencies.siphasher]
++version = "0.3"
++
++[dependencies.uniffi_checksum_derive]
++version = "0.21.0"
+diff --git a/third_party/rust/uniffi_meta/src/lib.rs
b/third_party/rust/uniffi_meta/src/lib.rs
+--- a/third_party/rust/uniffi_meta/src/lib.rs
++++ b/third_party/rust/uniffi_meta/src/lib.rs
+@@ -1,57 +1,127 @@
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+-use std::{
+- collections::hash_map::DefaultHasher,
+- hash::{Hash, Hasher},
+-};
++use std::hash::Hasher;
++pub use uniffi_checksum_derive::Checksum;
+
+ use serde::{Deserialize, Serialize};
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++/// Similar to std::hash::Hash.
++///
++/// Implementations of this trait are expected to update the hasher state in
++/// the same way across platforms. #[derive(Checksum)] will do the right
thing.
++pub trait Checksum {
++ fn checksum<H: Hasher>(&self, state: &mut H);
++}
++
++impl Checksum for bool {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ state.write_u8(*self as u8);
++ }
++}
++
++impl Checksum for u64 {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ state.write(&self.to_le_bytes());
++ }
++}
++
++impl Checksum for i64 {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ state.write(&self.to_le_bytes());
++ }
++}
++
++impl<T: Checksum> Checksum for Box<T> {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ (**self).checksum(state)
++ }
++}
++
++impl<T: Checksum> Checksum for [T] {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ state.write(&(self.len() as u64).to_le_bytes());
++ for item in self {
++ Checksum::checksum(item, state);
++ }
++ }
++}
++
++impl<T: Checksum> Checksum for Vec<T> {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ Checksum::checksum(&**self, state);
++ }
++}
++
++impl<T: Checksum> Checksum for Option<T> {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ match self {
++ None => state.write(&0u64.to_le_bytes()),
++ Some(value) => {
++ state.write(&1u64.to_le_bytes());
++ Checksum::checksum(value, state)
++ }
++ }
++ }
++}
++
++impl Checksum for str {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ state.write(self.as_bytes());
++ state.write_u8(0xff);
++ }
++}
++
++impl Checksum for String {
++ fn checksum<H: Hasher>(&self, state: &mut H) {
++ (**self).checksum(state)
++ }
++}
++
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct FnMetadata {
+ pub module_path: Vec<String>,
+ pub name: String,
+ pub inputs: Vec<FnParamMetadata>,
+ pub return_type: Option<Type>,
+ }
+
+ impl FnMetadata {
+ pub fn ffi_symbol_name(&self) -> String {
+ fn_ffi_symbol_name(&self.module_path, &self.name, checksum(self))
+ }
+ }
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct MethodMetadata {
+ pub module_path: Vec<String>,
+ pub self_name: String,
+ pub name: String,
+ pub inputs: Vec<FnParamMetadata>,
+ pub return_type: Option<Type>,
+ }
+
+ impl MethodMetadata {
+ pub fn ffi_symbol_name(&self) -> String {
+ let full_name = format!("impl_{}_{}", self.self_name, self.name);
+ fn_ffi_symbol_name(&self.module_path, &full_name, checksum(self))
+ }
+ }
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct FnParamMetadata {
+ pub name: String,
+ #[serde(rename = "type")]
+ pub ty: Type,
+ }
+
+-#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize,
Serialize)]
++#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Checksum,
Deserialize, Serialize)]
+ pub enum Type {
+ U8,
+ U16,
+ U32,
+ U64,
+ I8,
+ I16,
+ I32,
+@@ -73,63 +143,63 @@ pub enum Type {
+ ArcObject {
+ object_name: String,
+ },
+ Unresolved {
+ name: String,
+ },
+ }
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct RecordMetadata {
+ pub module_path: Vec<String>,
+ pub name: String,
+ pub fields: Vec<FieldMetadata>,
+ }
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct FieldMetadata {
+ pub name: String,
+ #[serde(rename = "type")]
+ pub ty: Type,
+ }
+
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub struct ObjectMetadata {
+ pub module_path: Vec<String>,
+ pub name: String,
+ }
+
+ impl ObjectMetadata {
+ /// FFI symbol name for the `free` function for this object.
+ ///
+ /// This function is used to free the memory used by this object.
+ pub fn free_ffi_symbol_name(&self) -> String {
+ let free_name = format!("object_free_{}", self.name);
+ fn_ffi_symbol_name(&self.module_path, &free_name, checksum(self))
+ }
+ }
+
+-/// Returns the last 16 bits of the value's hash as computed with
[`DefaultHasher`].
++/// Returns the last 16 bits of the value's hash as computed with
[`SipHasher13`].
+ ///
+ /// To be used as a checksum of FFI symbols, as a safeguard against
different UniFFI versions being
+ /// used for scaffolding and bindings generation.
+-pub fn checksum<T: Hash>(val: &T) -> u16 {
+- let mut hasher = DefaultHasher::new();
+- val.hash(&mut hasher);
++pub fn checksum<T: Checksum>(val: &T) -> u16 {
++ let mut hasher = siphasher::sip::SipHasher13::new();
++ val.checksum(&mut hasher);
+ (hasher.finish() & 0x000000000000FFFF) as u16
+ }
+
+ pub fn fn_ffi_symbol_name(mod_path: &[String], name: &str, checksum: u16)
-> String {
+ let mod_path = mod_path.join("__");
+ format!("_uniffi_{mod_path}_{name}_{checksum:x}")
+ }
+
+ /// Enum covering all the possible metadata types
+-#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
++#[derive(Clone, Debug, Checksum, Deserialize, Serialize)]
+ pub enum Metadata {
+ Func(FnMetadata),
+ Method(MethodMetadata),
+ Record(RecordMetadata),
+ Object(ObjectMetadata),
+ }
+
+ impl From<FnMetadata> for Metadata {
+



  • [SM-Commit] GIT changes to master grimoire by Pavel Vinogradov (0ddeb970de90f07daf1887de6a485f9f15ba372a), Pavel Vinogradov, 01/05/2023

Archive powered by MHonArc 2.6.24.

Top of Page