From ff3825fed74753fa227d2778ed114d2e2388d4e7 Mon Sep 17 00:00:00 2001 From: Graeme Coupar Date: Sun, 17 Sep 2023 17:39:42 +0100 Subject: [PATCH] use safe_cell --- Cargo.lock | 76 +++---------------- cynic-codegen/Cargo.toml | 3 +- .../src/schema/type_index/optimised.rs | 41 +++++++--- .../src/schema/type_index/schema_backed.rs | 39 ++++++---- 4 files changed, 64 insertions(+), 95 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 45ae43223..2a04b6362 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -108,12 +108,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - [[package]] name = "android-tzdata" version = "0.1.1" @@ -872,7 +866,7 @@ dependencies = [ "ciborium", "clap 3.2.25", "criterion-plot", - "itertools 0.10.5", + "itertools", "lazy_static", "num-traits", "oorandom", @@ -893,7 +887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools 0.10.5", + "itertools", ] [[package]] @@ -1044,11 +1038,11 @@ dependencies = [ "insta", "maplit", "once_cell", - "ouroboros", "proc-macro2", "quote", "rkyv", "rstest", + "self_cell", "strsim", "syn 2.0.36", "thiserror", @@ -1970,15 +1964,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.9" @@ -2285,31 +2270,6 @@ version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" -[[package]] -name = "ouroboros" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c86de06555b970aec45229b27291b53154f21a5743a163419f4e4c0b065dcde" -dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", -] - -[[package]] -name = "ouroboros_macro" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cad0c4b129e9696e37cb712b243777b90ef489a0bfaa0ac34e7d9b860e4f134" -dependencies = [ - "heck", - "itertools 0.11.0", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.36", -] - [[package]] name = "parking" version = "2.1.0" @@ -2443,30 +2403,6 @@ dependencies = [ "toml", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro-hack" version = "0.5.20+deprecated" @@ -3024,6 +2960,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "self_cell" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c309e515543e67811222dbc9e3dd7e1056279b782e1dacffe4242b718734fb6" + [[package]] name = "semver" version = "0.9.0" diff --git a/cynic-codegen/Cargo.toml b/cynic-codegen/Cargo.toml index 77f7584a8..3c34c3656 100644 --- a/cynic-codegen/Cargo.toml +++ b/cynic-codegen/Cargo.toml @@ -23,13 +23,14 @@ counter = "0.5" darling.workspace = true graphql-parser = "0.4.0" once_cell = "1.9.0" -ouroboros = "0.18" proc-macro2 = "1.0" quote = "1.0" +self_cell = { version = "1" } strsim = "0.10.0" syn = { workspace = true , features = ["visit-mut"] } thiserror = "1" +# Optional deps rkyv = { version = "0.7.41", features = ["validation"], optional = true } [dev-dependencies] diff --git a/cynic-codegen/src/schema/type_index/optimised.rs b/cynic-codegen/src/schema/type_index/optimised.rs index 1e68fca57..34f257924 100644 --- a/cynic-codegen/src/schema/type_index/optimised.rs +++ b/cynic-codegen/src/schema/type_index/optimised.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use rkyv::Deserialize; +use self_cell::self_cell; use crate::schema::{ self, @@ -31,19 +32,35 @@ impl Schema<'_, schema::Validated> { } } -#[ouroboros::self_referencing] +self_cell! { + struct AstCell { + owner: Vec, + + #[covariant] + dependent: ArchiveRef, + } +} + +type ArchiveRef<'a> = &'a ArchivedOptimisedTypes<'static>; + pub struct ArchiveBacked { - data: Vec, - #[borrows(data)] - archived: &'this ArchivedOptimisedTypes<'static>, + data: AstCell, } impl ArchiveBacked { pub fn from_checked_data(data: Vec) -> Self { - ArchiveBacked::new(data, |data| unsafe { - // This is safe so long as we've already verified data - rkyv::archived_root::>(&data[..]) - }) + ArchiveBacked { + data: AstCell::new(data, |data| { + unsafe { + // This is safe so long as we've already verified data + rkyv::archived_root::>(&data[..]) + } + }), + } + } + + fn archive(&self) -> ArchiveRef<'_> { + self.data.borrow_dependent() } } @@ -55,7 +72,7 @@ impl super::TypeIndex for ArchiveBacked { fn lookup_valid_type<'a>(&'a self, name: &str) -> Result, SchemaError> { Ok(self - .borrow_archived() + .archive() .types .get(name) .ok_or_else(|| SchemaError::CouldNotFindType { @@ -67,7 +84,7 @@ impl super::TypeIndex for ArchiveBacked { fn root_types(&self) -> Result, SchemaError> { Ok(self - .borrow_archived() + .archive() .schema_roots .deserialize(&mut rkyv::Infallible) .expect("infallible")) @@ -75,7 +92,7 @@ impl super::TypeIndex for ArchiveBacked { fn unsafe_lookup<'a>(&'a self, name: &str) -> Option> { Some( - self.borrow_archived() + self.archive() .types .get(name) .unwrap() @@ -85,7 +102,7 @@ impl super::TypeIndex for ArchiveBacked { } fn unsafe_iter<'a>(&'a self) -> Box> + 'a> { - Box::new(self.borrow_archived().types.values().map(|archived_type| { + Box::new(self.archive().types.values().map(|archived_type| { archived_type .deserialize(&mut rkyv::Infallible) .expect("infallible") diff --git a/cynic-codegen/src/schema/type_index/schema_backed.rs b/cynic-codegen/src/schema/type_index/schema_backed.rs index 0b6423c26..b214343a7 100644 --- a/cynic-codegen/src/schema/type_index/schema_backed.rs +++ b/cynic-codegen/src/schema/type_index/schema_backed.rs @@ -5,6 +5,7 @@ use std::{ }; use once_cell::sync::Lazy; +use self_cell::self_cell; use crate::schema::{ names::FieldName, @@ -13,15 +14,22 @@ use crate::schema::{ SchemaError, }; -#[ouroboros::self_referencing] +type TypeMap<'a> = HashMap<&'a str, &'a TypeDefinition>; + +self_cell! { + struct DocumentCell { + owner: Document, + + #[covariant] + dependent: TypeMap, + } +} + pub struct SchemaBackedTypeIndex { - document: Document, query_root: String, mutation_root: Option, subscription_root: Option, - #[borrows(document)] - #[covariant] - types: HashMap<&'this str, &'this TypeDefinition>, + data: DocumentCell, } impl SchemaBackedTypeIndex { @@ -41,12 +49,11 @@ impl SchemaBackedTypeIndex { } } - SchemaBackedTypeIndex::new( - document, + SchemaBackedTypeIndex { query_root, mutation_root, subscription_root, - |document| { + data: DocumentCell::new(document, |document| { let mut types = HashMap::new(); for definition in &document.definitions { if let Definition::TypeDefinition(type_def) = definition { @@ -57,8 +64,12 @@ impl SchemaBackedTypeIndex { types.insert(name_for_type(def), def); } types - }, - ) + }), + } + } + + fn borrow_types(&self) -> &HashMap<&str, &TypeDefinition> { + self.data.borrow_dependent() } } @@ -82,17 +93,15 @@ impl super::TypeIndex for SchemaBackedTypeIndex { fn root_types(&self) -> Result, SchemaError> { Ok(SchemaRoots { - query: self - .lookup_valid_type(self.borrow_query_root())? - .try_into()?, + query: self.lookup_valid_type(&self.query_root)?.try_into()?, mutation: self - .borrow_mutation_root() + .mutation_root .as_ref() .map(|name| ObjectType::try_from(self.lookup_valid_type(name)?)) .transpose()? .or_else(|| ObjectType::try_from(self.lookup_valid_type("Mutation").ok()?).ok()), subscription: self - .borrow_subscription_root() + .subscription_root .as_ref() .map(|name| ObjectType::try_from(self.lookup_valid_type(name)?)) .transpose()?